Learning Git with Workflows
Mosky
This slides
2
This slides
won't
explain every options of Git commands;
and the internal of Git.
2
This slides
won't
explain every options of Git commands;
and the internal of Git.
will
let you start to use Git immediately;
and learn the common Git workflows.
2
Mosky
3
Mosky
A Python engineer at Pinkoi
3
Mosky
A Python engineer at Pinkoi
An author of some Python packages
MoSQL, Clime, ...
3
Mosky
A Python engineer at Pinkoi
An author of some Python packages
MoSQL, Clime, ...
A speaker at several conferences
PyCon APAC 2013, COSCUP 2013, PyCon TW 2013, ...
3
Mosky
A Python engineer at Pinkoi
An author of some Python packages
MoSQL, Clime, ...
A speaker at several conferences
PyCon APAC 2013, COSCUP 2013, PyCon TW 2013, ...
A Python trainer
3
Mosky
A Python engineer at Pinkoi
An author of some Python packages
MoSQL, Clime, ...
A speaker at several conferences
PyCon APAC 2013, COSCUP 2013, PyCon TW 2013, ...
A Python trainer
http://mosky.tw/
3
Outline
6
Outline
Setup Git
6
Outline
Setup Git
Routine
Core
Secondary
6
Outline
Setup Git
Routine
Core
Secondary
Branching
6
Outline
Setup Git
Routine
Core
Secondary
Branching
Remote Repository
6
Outline
Setup Git
Routine
Core
Secondary
Branching
Remote Repository
A Co-working Workflow
6
Setup Git
Get Git!
8
Get Git!
Ubuntu, Debian or any APT-based Linux
$ sudo apt-get install git-core
8
Get Git!
Ubuntu, Debian or any APT-based Linux
$ sudo apt-get install git-coreMac
$ brew install githttp://brew.sh/
8
Get Git!
Ubuntu, Debian or any APT-based Linux
$ sudo apt-get install git-coreMac
$ brew install githttp://brew.sh/
Windows
http://git-scm.com/download/win
8
Is Git there?
9
GUIs are available
10
GUIs are available
Thanks GitHub!
10
GUIs are available
Thanks GitHub!
"Github for Mac"
http://mac.github.com/
10
GUIs are available
Thanks GitHub!
"Github for Mac"
http://mac.github.com/
"Github for Windows"
http://windows.github.com/
10
GUIs are available
Thanks GitHub!
"Github for Mac"
http://mac.github.com/
"Github for Windows"
http://windows.github.com/
Other
http://git-scm.com/downloads/guis
10
Tell Git who you are
11
Tell Git who you are
$ git config --global user.name "Mosky Liu"
11
Tell Git who you are
$ git config --global user.name "Mosky Liu"
$ git config --global user.email [email protected]
11
Other Git configs
12
Other Git configs
$ git config --global core.editor emacs
12
Other Git configs
$ git config --global core.editor emacs
$ git config --global merge.tool vimdiff
12
Other Git configs
$ git config --global core.editor emacs
$ git config --global merge.tool vimdiff
$ git config --list
12
Other Git configs
$ git config --global core.editor emacs
$ git config --global merge.tool vimdiff
$ git config --list
$ vim ~/.gitconfig
12
Other Git configs
$ git config --global core.editor emacs
$ git config --global merge.tool vimdiff
$ git config --list
$ vim ~/.gitconfig
http://j.mp/mosky-gitconfig
12
Core Routine
Create a repository
14
Create a repository
$ git init [<directory>]
14
Commit changes
15
Commit changes
$ git add <file> ...
15
Commit changes
$ git add <file> ...
$ git commit
15
Simplest Workflow
16
Simplest Workflow
(1) $ git init <directory>
16
Simplest Workflow
(1) $ git init <directory>(2) (modify file)
16
Simplest Workflow
(1) $ git init <directory>(2) (modify file)(3) $ git add <file> ...
16
Simplest Workflow
(1) $ git init <directory>(2) (modify file)(3) $ git add <file> ...(4) $ git commit
16
Simplest Workflow
(1) $ git init <directory>(2) (modify file)(3) $ git add <file> ...(4) $ git commit
# Back 2
16
Simplest Workflow
(1) $ git init <directory>(2) (modify file)(3) $ git add <file> ...(4) $ git commit
# Back 2The end of the core --- it's super easy!
16
Secondary Routine
Check status of files
18
Check status of files
$ git status
18
Check status of files
$ git status
18
Check what you changed
19
Check what you changed
$ git diff
19
Check what you changed
$ git diff
19
Check commits
20
Check commits
$ git log
20
Check commits
$ git log
20
Move between commits
21
Move between commits
$ git checkout <commit>
21
Move between commits
$ git checkout <commit>
<commit>
599d439fd3813298da16f12ed40f3a0716872c30
599d439
HEAD21
Name commit
22
Name commit
$ git tag <tagname>
$ git checkout 599d439
$ git tag v0.1
$ git checkout v0.1
22
Reset to a commit
23
Reset to a commit
$ git reset <commit>
Reset HEAD to <commit>.
23
Make a "reverse" commit
24
Make a "reverse" commit
$ git revert <commit>Apply a "reverse" commit.
24
Reset to a commit
25
Reset to a commit
26
Make a "reverse" commit
27
Make a "reverse" commit
28
Branching
master
master
topic
master
topic
HEAD
master
topic
HEAD
master
topic
HEAD
master
topic
HEAD
master
topic
HEAD
Create a branch
32
Create a branch
$ git branch <branchname>
32
Create a branch
$ git branch <branchname>
$ git checkout <branchname>
32
Create a branch
$ git branch <branchname>
$ git checkout <branchname>or
32
Create a branch
$ git branch <branchname>
$ git checkout <branchname>or
$ git checkout -b <branchname>
32
Delete and list branch(es)
33
Delete and list branch(es)
$ git branch -d <branchname>Delete branch.
33
Delete and list branch(es)
$ git branch -d <branchname>Delete branch.
$ git branchList branches.
33
Move between branches
34
Move between branches
$ git checkout <branchname>
34
Merge a branch back
35
Merge a branch back
$ git checkout <base-branch>
35
Merge a branch back
$ git checkout <base-branch>
$ git merge <topic-branch>
35
Branching Workflow
37
Branching Workflow
...
37
Branching Workflow
...
(1) $ git branch <topic-branch>
37
Branching Workflow
...
(1) $ git branch <topic-branch>
(2) $ git checkout <topic-branch>
37
Branching Workflow
...
(1) $ git branch <topic-branch>
(2) $ git checkout <topic-branch>
(3) (modify file)
37
Branching Workflow
...
(1) $ git branch <topic-branch>
(2) $ git checkout <topic-branch>
(3) (modify file)
...
37
Branching Workflow
...
(1) $ git branch <topic-branch>
(2) $ git checkout <topic-branch>
(3) (modify file)
...
(4) $ git commit
37
Branching Workflow
...
(1) $ git branch <topic-branch>
(2) $ git checkout <topic-branch>
(3) (modify file)
...
(4) $ git commit
# Back 3 until finish "topic"
37
Branching Workflow
...
(1) $ git branch <topic-branch>
(2) $ git checkout <topic-branch>
(3) (modify file)
...
(4) $ git commit
# Back 3 until finish "topic"
(5) $ git checkout <base-branch>
37
Branching Workflow
...
(1) $ git branch <topic-branch>
(2) $ git checkout <topic-branch>
(3) (modify file)
...
(4) $ git commit
# Back 3 until finish "topic"
(5) $ git checkout <base-branch>
(6) $ git merge <topic-branch>
37
Remote Repository
Clone a remote repository
39
Clone a remote repository
$ git clone <repos> <dir>
39
Clone a remote repository
$ git clone <repos> <dir>
<repos>
https://github.com/torvalds/linux.git
39
Create a remote repository
40
Create a remote repository
$ git init --bare
40
Create a remote repository
$ git init --bareor
40
Create a remote repository
$ git init --bareor
https://github.com/repositories/new
40
Add, remove and list remotes
41
Add, remove and list remotes
$ git remote add <name> <url><url> can be a local path.
41
Add, remove and list remotes
$ git remote add <name> <url><url> can be a local path.
$ git remote remove <name>
41
Add, remove and list remotes
$ git remote add <name> <url><url> can be a local path.
$ git remote remove <name>
$ git remote
41
Push commits to remote
42
Push commits to remote
$ git push <repos> <refspec>...
42
Push commits to remote
$ git push <repos> <refspec>...
<refspec>usually is branch or tag name
[+]<src>[:<dst>]
:<dst> to delete remote reference.
42
Pull commits from remote
43
Pull commits from remote
$ git pull <repos> <refspec>...
43
A Co-working Workflow
Three Principles
45
Three Principles
1. master is production.
45
Three Principles
1. master is production.
2. dev only includes stable and reviewed code.
45
Three Principles
1. master is production.
2. dev only includes stable and reviewed code.
3. Create topic branch to resolve issue all the time.
45
Three Phases
46
Three Phases
1. Resolving
Create a topic branch to resolve issue.
46
Three Phases
1. Resolving
Create a topic branch to resolve issue.
2. Reviewing
Review the code.
46
Three Phases
1. Resolving
Create a topic branch to resolve issue.
2. Reviewing
Review the code.
3. Cleanup
Merge into dev and remove topic branch.
46
47
Assigner: "We need to resolve this issue."
47
Assigner: "We need to resolve this issue."
Assignee: "Yes, sir!"
47
Assigner: "We need to resolve this issue."
Assignee: "Yes, sir!"
Assignee (dev) $ git checkout -b topic
47
Assigner: "We need to resolve this issue."
Assignee: "Yes, sir!"
Assignee (dev) $ git checkout -b topic
Assignee (topic) $ (commit...)
47
Assigner: "We need to resolve this issue."
Assignee: "Yes, sir!"
Assignee (dev) $ git checkout -b topic
Assignee (topic) $ (commit...)
Assignee (topic) $ git push origin topic
47
Assigner: "We need to resolve this issue."
Assignee: "Yes, sir!"
Assignee (dev) $ git checkout -b topic
Assignee (topic) $ (commit...)
Assignee (topic) $ git push origin topic
Until resolve, call assigner for review.
47
48
Assignee: "I resolved!"
48
Assignee: "I resolved!"
Assigner: "Let me review."
48
Assignee: "I resolved!"
Assigner: "Let me review."
Assigner (dev) $ git checkout -b topic
48
Assignee: "I resolved!"
Assigner: "Let me review."
Assigner (dev) $ git checkout -b topic
Assigner (topic) $ git pull origin topic
48
Assignee: "I resolved!"
Assigner: "Let me review."
Assigner (dev) $ git checkout -b topic
Assigner (topic) $ git pull origin topic
Assigner (topic) $ git diff ...dev
48
Assignee: "I resolved!"
Assigner: "Let me review."
Assigner (dev) $ git checkout -b topic
Assigner (topic) $ git pull origin topic
Assigner (topic) $ git diff ...dev
If it is not good enough, call assignee to fix.
48
49
Assigner (topic) $ git checkout dev
49
Assigner (topic) $ git checkout dev
Assigner (dev) $ git merge topic
49
Assigner (topic) $ git checkout dev
Assigner (dev) $ git merge topic
Assigner (dev) $ git push origin dev
49
Assigner (topic) $ git checkout dev
Assigner (dev) $ git merge topic
Assigner (dev) $ git push origin dev
Assigner: "Good job!"
49
Assigner (topic) $ git checkout dev
Assigner (dev) $ git merge topic
Assigner (dev) $ git push origin dev
Assigner: "Good job!"
Assignee (dev) $ git branch -d topic
49
Assigner (topic) $ git checkout dev
Assigner (dev) $ git merge topic
Assigner (dev) $ git push origin dev
Assigner: "Good job!"
Assignee (dev) $ git branch -d topic
Assignee (dev) $ git push origin :topic
49
Assigner (topic) $ git checkout dev
Assigner (dev) $ git merge topic
Assigner (dev) $ git push origin dev
Assigner: "Good job!"
Assignee (dev) $ git branch -d topic
Assignee (dev) $ git push origin :topic
Assignee (dev) $ git pull origin dev49
End
End
52
End
Use branch!
52
End
Use branch!
Workflow does matter.
52
End
Use branch!
Workflow does matter.
Git still has many magics.
52
End
Use branch!
Workflow does matter.
Git still has many magics.
Tips: http://j.mp/mosky-gitconfig
52
End
Use branch!
Workflow does matter.
Git still has many magics.
Tips: http://j.mp/mosky-gitconfig
Q&A
52