77
GIT SCM* as a VCS software version control, git in a nutshell, handling branches and remotes Gokhan Capan *Slides adapted from http://git-scm.org

git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

Page 1: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

GIT SCM* as a VCSsoftware version control, git in a nutshell, handling branches and remotes

Gokhan Capan

*Slides adapted from http://git-scm.org

Page 2: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

The Rationale• Revision control is essential for projects developed as a

team • Each member has its working copy • A member can create a new revision • Other members can apply the revision • A new member can get his up-to-date working copy

Page 3: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

The Rationale• An illustration:

1. Member A gets his working copy

2. A branches from the main development line (context-switches), and work on a new feature

3. In the meantime Member B creates a new revision

4. Member A gets his work done on the branch

5. Member A updates his working copy and his branch (to make sure that there is no conflict)

6. Member A merges his work on the branch into the main development line

7. Member A deletes the feature-branch, and creates a new revision in the main development line

Page 4: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

GIT• Git is an open source version control system, which is

really common among organizations creating software (examples: Linux Kernel, most of the ASF projects)

• Git is distributed (i.e. every member has its own ‘clone’) • Git is easy-to-use, and really fast • Git acts on streams of snapshots • Most of the operations are local (e.g. ‘git log’ does not

ask, or ’git commit’ does not push anything to a central server)

Page 5: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

GIT• Git supports staging (you mark your changes to

commit) • Branching and working with remotes are extremely easy

with Git • Virtually all types of workflows are possible

Page 6: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Initialize a project

$git init project

Initialized empty Git repository in /path/to/project/.git/

Page 7: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Observe that a .git directory is created

$cd project$ls -a

Page 8: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Here is the status of your working copy

$git statusOn branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

Page 9: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Let’s create a file. git tells us that there are files that are

not tracked (this is a new file), but we can stage them to commit them later

$touch first.txt$git statusOn branch master

Initial commit

Untracked files: (use "git add <file>..." to include in what will be committed)

first.txt

Page 10: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Stage the recently added file

$git add first.txt$git statusOn branch master

Initial commit

Changes to be committed: (use "git rm --cached <file>..." to unstage)

new file: first.txt

Page 11: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• See what is staged

$git diff --staged

# An alternative is using:# git difftool -t <toolname> --staged # To list the available tools in your system, run:# git difftool --tool-help

Page 12: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Commit the staged changes

$git commit -m "Adding a totally useless file"

[master (root-commit) 5dfba11] Adding a totally useless file 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 first.txt

Page 13: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Do some modifications in the first.txt file

$echo “Something useful”>>first.txt$git status

On branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory)

modified: first.txt

no changes added to commit (use "git add" and/or "git commit -a")

Page 14: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Commit the file

$git commit -m “This will fail"

On branch masterChanges not staged for commit:modified: first.txt

no changes added to commit

Page 15: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• We need to stage it first by git add <file>, and then

commit via git commit -m “Message" • Alternatively, we can use git commit -a -m “Message”,

which is equivalent

Page 16: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Git in Action• Try git commit -a -m “Message"

$git commit -a —m “This will work"

[master 6bfe9c5] This will work 1 file changed, 1 insertion(+)

Page 17: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

States of Committing

* Figure copied from http://git-scm.com/book/en/v2/Getting-Started-Git-Basics

Page 18: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Undoing• Say you want to change your latest commit (you want

to change the commit message, or you realize that this commit should have included an additional file)#Make your changes and stage them$git commit --amend -m “A better commit message”

[master 4922193] A better commit message 1 file changed, 1 insertion(+)#Observe the commit --amend replaces the previous commit$git log

commit 492219352622c01c774a7f0ca4b4e0502615b442Author: Gokhan A better commit message

commit 5dfba117353858439a0b5f22d193c4fc1e6b3a0fAuthor: Gokhan Adding a totally useless file

Page 19: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Undoing• Say you want to unstage

$ touch second.txt$ git add second.txt$ git status

On branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage)

new file: second.txt

#unstage$ git reset HEAD second.txt$ git status

On branch masterUntracked files: (use "git add <file>..." to include in what will be committed)

second.txt

Page 20: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Undoing• Say you want to revert your modifications

$ echo “An accidental change”>first.txt$ cat first.txtAn accidental change

$ git status

On branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory)

modified: first.txt

$ git checkout -- first.txt$ cat first.txtSomething useful

Page 21: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Default Ignore Behavior• Say you don’t want the files under target/ directory to

be committed# Create a file called .gitignore# Add target/* as a line$cat .gitignoretarget/*

#stage and commit .gitignore$git add .gitignore$git commit -m “Adding .gitignore”

#Create target directory and add a file under it$mkdir target$touch target/file.txt$git statusOn branch masternothing to commit, working directory clean

Page 22: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Default Ignore Behavior• Git automatically ignores 'target' directory

# Create a file called .gitignore# Try to add target/ anyway$ git add target/$ git commit -m “This will not be committed"

On branch masternothing to commit, working directory clean

Page 23: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Tagging• It is common behavior to tag milestones • Say we finally reach one# git tag to see current tags$ git tag

# tag the current project$ git tag v0.1 -m “Project is now in version 0.1”$ git tagv0.1

$git show v0.1Tagger: Gokhan

Project is now in version 0.1

commit bd228761a2e09f70966b27a9ffc7e2142d4bc480Author: Gokhan

Adding .gitignore

Page 24: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• A branch is simply a pointer to a commit. • The ‘master’ is just a branch (created by 'git init’)

# Create a branch called newfeature$ git branch newfeature

# See all branches (* denotes which branch the HEAD points)$ git branch -a* master newfeature

#Work on the new branch$ git checkout newfeature$ git branch -a master* newfeature

Page 25: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Do some work on our new branch

# Do some work on newfeature$ touch second.txt$ git add second.txt$ git commit -m "Adding second.txt"$ git log --oneline

7939b73 Adding second.txtbd22876 Adding .gitignore4922193 A better commit message5dfba11 Adding a totally useless file

Page 26: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Observe master branch

# Switch back to the master branch$ git checkout master$ git log --oneline

bd22876 Adding .gitignore4922193 A better commit message5dfba11 Adding a totally useless file

#Notice that latest commit was not applied to the master branch

Page 27: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Current state of the project

5dfba11 4922193 bd22876

793bb73

master

newfeature

Page 28: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Let’s merge our work on ‘newfeature’ into ‘master’

# Merge newfeature into master$ git checkout master$ git merge newfeature

Updating bd22876..7939b73Fast-forward second.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 second.txt

# Notice bd22876..7939b73# Notice fast-forward

Page 29: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Current state of the project

newfeature

5dfba11 4922193 bd22876 793bb73

master

Page 30: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• newfeature is obsolete now, delete it

# Delete newfeature since it is fully merged $ git branch -d newfeature$ git branch -a* master

5dfba11 4922193 bd22876 793bb73

master

Page 31: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Note that merge happened in a ‘fast-forward’ way (not

even a commit occurred) • This is because we did not change anything in master

after branching from it • Another scenario: Branch from ‘a’ to ‘b’, make changes

in both ‘a’ and ‘b’, then merge ‘b’ into ‘a’

Page 32: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Create a new branch from ‘master’ and do some work

on it# Create a branch called newfeature$ git branch newfeature$ git checkout newfeature$ touch third.txt$ git add third.txt$ git commit -m “Adding third.txt”

$ git log --oneline -n 20206eab Adding third.txt7939b73 Adding second.txt

$ git checkout master$ git log --oneline -n 27939b73 Adding second.txtbd22876 Adding .gitignore

Page 33: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Before merging ‘newfeature’ into ‘master’, do some

work on ‘master’ # Do some work on master$ git checkout master$ touch fourth.txt$ git add fourth.txt$ git commit -m “Adding fourth.txt”

$ git log --oneline -n 213229b6 Adding fourth.txt7939b73 Adding second.txt

Page 34: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Current state of the project

5dfba11 4922193 bd22876 793bb73

master

newfeature

0206eab

13229b6

Page 35: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Let’s merge ‘newfeature’ into ‘master’

# Merge newfeature into master# This results in a new commit in master$ git checkout master$ git merge newfeature$ git log --oneline -n 4

22d1330 Merge branch 'newfeature'13229b6 Adding fourth.txt0206eab Adding third.txt7939b73 Adding second.txt

$git checkout newfeature$ git log --oneline -n 20206eab Adding third.txt7939b73 Adding second.txt

Page 36: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Current state of the project

… 793bb73

master

newfeature

0206eab 13229b6 22d1330

Page 37: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• ‘newfeature’ is obsolete now, delete it

#Delete newfeature since it is fully merged into master$ git checkout master$ git branch -d newfeature$ git branch -a

* master

Page 38: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Another scenario is when the same file is modified in

both branches

Page 39: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Create a branch and modify first.txt

$ git branch newfeature$ git checkout newfeature$ echo ‘Modifications for new feature’>> first.txt$ git commit -a -m “cool feature is applied”$ git log --oneline -n 3

fee3b9b cool feature is applied22d1330 Merge branch 'newfeature'13229b6 Adding fourth.txt

#have a look at the content of first.txt$cat first.txtSomething usefulModifications for new feature

Page 40: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Switch back to ‘master’ and modify first.txt before

merging ‘newfeature’ into ‘master’ $ git checkout master#have a look at the content of first.txt$ cat first.txtSomething useful#modify first.txt$ echo “Some maintenance work”>>first.txt$ git commit -a -m “Maintenance”$ git log --oneline -n 3344725d Maintenance22d1330 Merge branch 'newfeature'13229b6 Adding fourth.txt

$ cat first.txtSomething usefulSome maintenance work

Page 41: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Current state of the project

master

newfeature

13229b6 22d1330344725d

fee3b9b

//first.txt Something useful Some maintenance work

//first.txt Something useful Modifications for new feature

Page 42: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Let’s try to merge ‘newfeature’ into ‘master’

# Merge newfeature into master$ git checkout master# This fails due to merge conflict, you need to resolve it$ git merge newfeatureCONFLICT (content): Merge conflict in first.txtAutomatic merge failed; fix conflicts and then commit the result.

Page 43: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• But git gives you some hint, have a look at first.txt

$ cat first.txt

Something useful<<<<<<< HEADSome maintenance work=======Modifications for new feature>>>>>>> newfeature

#Remember Modifications for new feature line was added in the ‘newfeature’ branch, which git tells us

Page 44: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Manually resolve the conflict (i.e. edit the file using your

editor), and then merge#Manually resolve conflict using your editor$ cat first.txt Something usefulSome maintenance workModifications for new feature

#Commit your edits$ git commit -a -m “Conflicts resolved and merge of newfeature performed”

$ git log --oneline -n 3

dd2cc2d Conflicts resolved and merge of newfeature performed344725d Maintenancefee3b9b cool feature is applied

Page 45: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Current state of the project

master

newfeature

22d1330 344725dfee3b9b

//first.txt Something useful Some maintenance work Modifications for new feature

//first.txt Something useful Modifications for new feature

dd2cc2d

Page 46: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• ‘newfeature’ is obsolete now, delete it

#Delete newfeature since it is fully merged into master$ git checkout master$ git branch -d newfeature$ git branch -a

* master

Page 47: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Branches• Current state of the project

master

22d1330 344725dfee3b9b

//first.txt Something useful Some maintenance work Modifications for new feature

dd2cc2d

Page 48: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

On Resolving Conflicts• Your IDE probably provides more convenient ways (i.e.

graphical tools) for resolving conflicts, use it • There are many options in git merge (such as you can

ignore whitespaces and merge smoothly if they are the causes of the conflict), but we can’t cover them all

• git merge can be run with -Xours or -Xtheirs to automatically resolve conflict by accepting one particular version

• When in one branch the file is deleted, and in the other it is modified, you can either resolve the conflict by keeping the file, or deleting it

Page 49: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Aside: Undoing a commit• git revert <commitnumber> allows you to undo a

commit • Git does it by applying a new commit, that undoes to

the other

Page 50: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• There are many workflows possible, but I am going to

cover one common workflow*: using a shared repository

*Figure adapted from http://git-scm.org/about/distributed

Shared Repository

Developer Developer Developer

Page 51: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• Initially, somebody creates a repository for common

access at github (or Google code)

Shared Repository

Page 52: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• Team members ‘clone' the entire repository • Note that this is not a client-server architecture (unlike

SVN-style VCSs)

Shared Repository

Developer Developer Developer

Page 53: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working with Remotes• Often, the running-prototype is maintained in a remote

machine (a shared repository) that provides access via HTTP or SSH

• github, Google Code are examples • Developers generally ‘clone’ a copy to their local

workstations, and ‘push’ back their contributions • This is handled by remotes

Page 54: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working with Remotes• A remote is defined by a URL corresponding to a

repository with a unique name • A URL might be accessible via:

• local protocol (e.g. file:///a/local/path or /a/local/path) • http (e.g. http(s)://a/remote/git/repo/accessible/via/

HTTP(S)) • git protocol (git://a/remote/git/repo/accessible/via/

SSH) • ssh (ssh://user@server/path/to/remote/repo)

Page 55: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Cloning from a Shared Repository• Just clone it • A local working directory is created, the cloned

repository is added as a remote (with name ‘origin’), and the tracking and remote-tracking branches are created automatically#clone from a remote URL$ git clone <url> <target-dir>

#say <target-dir> = toyCloning into 'toy'...remote: Counting objects: 3, done.remote: Total 3 (delta 0), reused 0 (delta 0)Unpacking objects: 100% (3/3), done.Checking connectivity... done.

#git automatically clones the project into the directory #called 'toy'

Page 56: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Cloning from Shared Repository

# Observe logs$ git log --oneline e8bada4 Initial commit #This is cloned from the remote

# List remotes$ git remoteorigin # git automatically give the name origin to the remote# you may have run git clone -o <remotename>

# Observe branches$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master

#1. We are on branch master (git automatically created this for us)#2. On OUR computer, a branch called origin/master is created, and it is a remote-tracking-branch#3. origin/master is not updated automatically, it is LOCAL

Page 57: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Cloning from Shared Repository

# Another developer clones the project$ git clone -o classproject https://github.com/organization/toy.git $ cd toy$ git remoteclassproject

$ git branch -a* master remotes/classproject/HEAD -> classproject/master remotes/classproject/master

Page 58: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Adding a Remote#add a remote$ git remote add <remote-name> <url>

Page 59: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Fetch-Merge and Push• To update our remote tracking branch ‘remote/tracking’,

we fetch from the remote, and then to update the working branch (‘tracking’), we merge the branch ‘remote/tracking’ into the working branch ‘tracking’

• A shortcut is git pull, which is equivalent to git fetch + git merge

• When we finish our work, after committing, we can push it to the branch in the remote with git push

Page 60: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Fetch-Merge and Push• Of course 'git clone' can be imitated by initializing an

empty working directory, then adding the location of the shared repository as a remote, and then fetching and merging

• the -f option passed to the 'git remote add' command automatically runs git fetch immediately after the remote is set up

Page 61: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Fetch-Merge# git fetch example# The remote tracking branch <remote>/<abranch> is# updated$ git fetch <remote> <abranch>

#Changes applied to the working branch <a-local-branch> $git checkout <a-local-branch>$git merge <remote>/<abranch>

Page 62: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Imitating 'git clone'#initialize an empty working dir$ mkdir project$ cd project$ git init

#add a remote, fetch branches in the remote, and merge #one of them into a local branch$ git remote add -f <remote-name> <url>$ git checkout -b <local-branch>$ git merge <remote-name>/<remote-branch>

# the previous command is equivalent to$ git remote add <remote-name> <url>$ git fetch <remote-name>$ git checkout -b <local-branch>$ git merge <remote-name>/<remote-branch>

Page 63: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Imitating 'git clone'#initialize an empty working dir$ mkdir project$ cd project$ git init

#just set the -m <branch-name> option to specify what #remote branch you are interested in merging

$ git remote add -f -m <branch-name> <remote-name> <url>$ git merge <remote-name>

Page 64: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Fetch-Merge and Push• Current state of the project

e8bada4

e8bada4

e8bada4

remote

devA

devB

master

master

master classproject/master

origin/master

Page 65: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team#devB makes some changes and commits$ touch first.txt$ git add first.txt$ git commit -m “Adding first.txt”$ git log --oneline 78df3c9 Adding first.txte8bada4 Initial commit

#have a look at the classproject/master branch#This is just for illustration purposes! Normally, you #have nothing to do with the remote tracking branch, #they are READ-ONLY$ git checkout classproject/master$ git log --onelinee8bada4 Initial commit

Page 66: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• Current state of the project

e8bada4

e8bada4

e8bada4

remote

devA

devB

master

master

master

classproject/master

origin/master

78df3c9

Page 67: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team#In the meantime, devA makes some changes and commits them$ touch second.txt$ git add second.txt$ git commit -m “Adding second.txt”$ git log --oneline 064f3a2 Adding seconde8bada4 Initial commit

Page 68: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• Current state of the project

e8bada4

e8bada4

e8bada4

remote

devA

devB

master

master

master

classproject/master

origin/master

78df3c9

064f3a2

Page 69: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team# devA wants to push his changes to the repository# Ideally, he first updates his local version with # git fetch+merge, and then pushes to the remote. # Let’s skip this step once #(since we know that devA’s computer is sync with the remote)

#this pushes the master branch to the master branch in #the remote origin$ git push origin

#this pushes the LOCAL branch master into the REMOTE #branch master (git push origin <local_branch>)$ git push origin master

# this pushes the LOCAL branch master to the REMOTE branch master (git push origin <lbranch>:<rbranch>)$git push origin master:master

# pushing also updates the remote-tracking-branch

Page 70: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• Current state of the project

e8bada4

e8bada4

e8bada4

remote

devA

devB

master

master

master

classproject/master

origin/master

78df3c9

064f3a2

064f3a2

Page 71: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team#for devB to push his commits, he needs to fetch from the remote first#git fetch <remote> <rbranch> fetches the rbranch from the remote, and creates a remote tracking branch called remote/rbranch if it doesn’t exist. If remote/rbranch exists, merges the changes in remote into remote/rbranch#devB then should merge the work he fetched into his local branch (Note that git pull classproject master is equivalent)

$git fetch classproject master$git checkout master$git merge classproject/master#This triggered a commit, since devB made additional #changes before

Page 72: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team#Current state of the local master branch of devB$git log --oneline -n 311791db Merge remote-tracking branch 'classproject/master'064f3a2 Adding second #pushed by devA, remember?78df3c9 Adding first.txt

#Current state of the remote tracking branch classproject/master$git checkout classproject/master$git log --oneline 064f3a2 Adding seconde8bada4 Initial commit

#We fetched from the remote to the remote tracking branch, and merged it into our local branch, but remote tracking branch, and the master branch in the remote are still unaware of our changes. We need to push our commits$ git checkout master $ git push classproject

Page 73: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• Current state of the project

e8bada4

e8bada4

e8bada4

remote

devA

devB

master

master

master

classproject/master

origin/master

78df3c9

064f3a2

064f3a2

064f3a2

78df3c9

11791db

11791db

Page 74: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team#devA pulls the changes from the remote origin$ git log --oneline064f3a2 Adding seconde8bada4 Initial commit

$git pull origin master11791db Merge remote-tracking branch 'classproject/master'064f3a2 Adding second78df3c9 Adding first.txte8bada4 Initial commit

Page 75: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working as a Team• Current state of the project

e8bada4

e8bada4

e8bada4

remote

devA

devB

master

master

master

classproject/master

origin/master

78df3c9

064f3a2

064f3a2

78df3c9

11791db

11791db

78df3c9 064f3a2 11791db

Page 76: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Working with Remotes• You can git push to a non-existing remote branch, it is

created on the fly • You can pull from remote branches that you’re not

tracking, the remote-tracking branch is created, and is merged into the current local-branch automatically

• These are the basics, see the documentation for more information

• Again, once you understand the basic concepts, use your IDE’s git integration, they are really handy

Page 77: git...GIT • Git is an open source version control system, which is really common among organizations creating software (examples: Linux Kernel, most of the ASF projects) • Git

Suggestions• When implementing new features, or fixing issues,

always work on new branches • After you’re done, merge it into master, then commit

and push • If any file is irrelevant to the build, don’t version it

• IDE-specific files, OS-specific files • 3rd party archives: They are large, they don’t

change, and cannot be properly versioned • There are better tools to handle 3rd party

dependencies (e.g. maven)