Git branches and remotes Landon Cox February 2, 2017
Basic terminology and overview Commit Object pointing to a snapshot Named by hash and stored as a tree Commits have parents that point to the previous snapshot Branch Pointer to a commit (and its snapshot) e.g., “master” Remote Collection of branches stored on a remote server e.g., a gitlab or github project https://git-scm.com/book/en/v2/
Basic terminology and overview Commit Object pointing to a snapshot Named by hash and stored as a tree Commits have parents that point to the previous snapshot Branch Pointer to a commit (and its snapshot) e.g., “master” Remote Collection of branches stored on a remote server e.g., a gitlab or github project
What are these funny hex numbers? A commit and its tree What are these funny hex numbers? $> git add README test.rb LICENSE $> git commit -a -m “Initial commit”
Why will the commit hash change if I modify a file? A commit and its tree Why will the commit hash change if I modify a file? $> git add README test.rb LICENSE $> git commit -a -m “Initial commit”
A commit and its tree $> git add README test.rb LICENSE best $> git add README test.rb LICENSE $> git commit -a -m “Initial commit”
Commits and their parents What do I need to move from one commit to another?
Basic terminology and overview Commit Object pointing to a snapshot Named by hash and stored as a tree Commits have parents that point to the previous snapshot Branch Pointer to a commit (and its snapshot) e.g., “master” Remote Collection of branches stored on a remote server e.g., a gitlab or github project
A branch and its commit history
Two branches w/ same commits $> git branch testing
HEAD pointing to master branch $> git log --oneline --decorate f30ab (HEAD -> master, testing) add … 34ac2 Fixed bug #1328 - stack overflow … 98ca9 The initial commit of my project
HEAD pointing to testing branch $> git checkout testing
A new commit under testing $> vi test.rb $> git commit -a -m “made a change”
Checking out master $> git checkout master
A new commit under master Given the diffs I have, can I integrate my testing changes into master? $> vi test.rb $> git commit -a -m “another change”
Merging branches
Merging branches $> git branch iss53 $> git checkout iss53 $> git checkout -b iss53
Merging branches $> vi index.html $> git commit -a -m “added a new footer [issue 53]”
Merging branches $> git checkout master $> git checkout -b hotfix $> git commit -a -m “fixed broken link”
Merging branches $> git checkout master $> git merge hotfix
Merging branches $> git branch -d hotfix $> git checkout iss53 $> vi index.html $> git commit -a –m “finished footer [issue 53]”
Merging branches
Merge commit: special commit created from three-way merge Merging branches Merge commit: special commit created from three-way merge $> git checkout master $> git merge iss53
Merging branches Sometimes merges fail due to conflicts Git cannot create the diffs to move one commit to another Often due to multiple changes to the line in a file $> git merge iss53 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
Edit files to manually resolve the conflict. Merging branches Sometimes merges fail due to conflicts Git cannot create the diffs to move one commit to another Often due to multiple changes to the line in a file Edit files to manually resolve the conflict. $ git status On branch master You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add <file>..." to mark resolution) both modified: index.html no changes added to commit (use "git add" and/or "git commit -a")
Inside the conflicted file (index.html in example) Merging branches Sometimes merges fail due to conflicts Git cannot create the diffs to move one commit to another Often due to multiple changes to the line in a file <<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53:index.html Inside the conflicted file (index.html in example)
Content in master branch (since HEAD pointed to master during merge) Merging branches Sometimes merges fail due to conflicts Git cannot create the diffs to move one commit to another Often due to multiple changes to the line in a file Content in master branch (since HEAD pointed to master during merge) <<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53:index.html Content in iss53 branch
Content of conflicted file after manual resolution. Merging branches Sometimes merges fail due to conflicts Git cannot create the diffs to move one commit to another Often due to multiple changes to the line in a file <div id="footer"> please contact us at support@github.com </div> Content of conflicted file after manual resolution. (i.e., kept the iss53 content, removed <<<, ===, and >>> lines)
Merging branches Sometimes merges fail due to conflicts Git cannot create the diffs to move one commit to another Often due to multiple changes to the line in a file Once conflict has been resolved, add and commit $> git add index.html $> git commit
Rebasing branches
Basic terminology and overview Commit Object pointing to a snapshot Named by hash and stored as a tree Commits have parents that point to the previous snapshot Branch Pointer to a commit (and its snapshot) e.g., “master” Remote Collection of branches stored on a remote server e.g., a gitlab or github project
Remote branches “origin” = default name of remote repo “master” = branch of remote repo
Equivalent commands to clone. Remote branches Equivalent commands to clone. $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git fetch origin $> git merge origin/master
“origin” is local name for this remote Remote branches “origin” is local name for this remote $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git fetch origin $> git merge origin/master
fetch retrieves data for remote merge remote/branch into local repo Remote branches fetch retrieves data for remote merge remote/branch into local repo $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git fetch origin $> git merge origin/master
Can name remote whatever you want, Remote branches Can name remote whatever you want, e.g., “jane” $> mkdir project $> cd project $> git init $> git remote add jane janedoe@git.ourcompany.com:project.git $> git fetch jane $> git merge jane/master
“git pull” is shorthand for fetch and merge Remote branches “git pull” is shorthand for fetch and merge $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git fetch origin $> git merge origin/master
“git pull” is shorthand for fetch and merge Remote branches “git pull” is shorthand for fetch and merge $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git pull origin master
Note that because pull merges, it can lead to conflicts Remote branches Note that because pull merges, it can lead to conflicts $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git pull origin master
“git remote –v” prints all the remotes you’ve linked Remote branches “git remote –v” prints all the remotes you’ve linked $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git remote –v
“git remote rm” removes a remote Remote branches “git remote rm” removes a remote $> mkdir project $> cd project $> git init $> git remote add origin janedoe@git.ourcompany.com:project.git $> git remote rm origin
How to work with your group project