Slide 1

Slide 1 text

RUBY TALKS #1 REWRITING GIT HISTORY Created by Mateusz Bielec

Slide 2

Slide 2 text

AGENDA Merging strategies Rebase Re og

Slide 3

Slide 3 text

MERGING STRATEGIES fast-forward recursive octupus (<1%)

Slide 4

Slide 4 text

FAST-FORWARD ➜ git:(master) git checkout -b git-readme ➜ git:(git-readme) echo "Git is cool" > GIT.md ➜ git:(git-readme) ✗ git add GIT.md ➜ git:(git-readme) ✗ git commit -m "Added GIT.md" ➜ git:(master) git merge git-readme Updating 578bc0a..dc327af Fast-forward GIT.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 GIT.md ➜ git:(master) git log --oneline dc327af Added GIT.md 578bc0a Added readme

Slide 5

Slide 5 text

RECURSIVE ➜ git:(master) git checkout -b svn-readme ➜ git:(svn-readme) echo "SVN ...is not so good" > SVN.md ➜ git:(svn-readme) ✗ git add SVN.md ➜ git:(svn-readme) ✗ git commit -m "Added SVN.md" ➜ git:(master) echo "Git is really cool" > GIT.md ➜ git:(master) ✗ git commit -am "Updated GIT.md" ➜ git:(master) git merge svn-readme Merge made by the 'recursive' strategy. SVN.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 GIT.md ➜ git:(master) git log --oneline --graph * 48337c6 Merge branch 'svn' |\ | * abf12f9 Added SVN.md * | a7aebe5 Updated GIT.md |/ * dc327af Added GIT.md

Slide 6

Slide 6 text

GIT PULL git fetch git merge

Slide 7

Slide 7 text

GIT PULL ➜ git:(master) git pull remote: Counting objects: 3, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From https://gitlab.com/mbie/ruby-talks-advanced-git a947eed..a8d4a70 master -> origin/master Merge made by the 'recursive' strategy. README.md | 2 +- ➜ git:(master) git log --oneline --graph * 7ed530a Merge branch 'master' of https://gitlab.com/mbie/ruby-talks |\ | * a8d4a70 Update Readme.md * | b05c794 Updated GIT.md |/

Slide 8

Slide 8 text

POLLUTED GIT HISTORY ➜ git:(master) git log --oneline 04e38c8 pulled ce8ea84 Merge branch 'develop' of github.com:user/repo into develop 15a4ae7 Merge branch 'feature'

Slide 9

Slide 9 text

REBASE Move commits from current branch to temporary branch Run all commits from master (one by one) Run all commits from temporary branch (one by one)

Slide 10

Slide 10 text

REBASE IN PRACTICE ➜ git:(master) git log --oneline --graph --all --decorate * 78492df (HEAD, master) Added CHANGELOG.md * 2cc346f Fixed typo in Readme.md | * 4541394 (update-repositories) Updated SVN.md | * 75a03ad Updated GIT.md |/ * 4e6a918 Updated GIT.md ➜ git:(update-repositories) git rebase master First, rewinding head to replay your work on top of it... Applying: Updated GIT.md Applying: Updated SVN.md ➜ git:(master) git merge update-repositories Updating 78492df..7a8c3df Fast-forward ➜ git:(master) git log --oneline --graph --all --decorate * 7a8c3df (HEAD, update-repositories, master) Updated SVN.md * 852bd73 Updated GIT.md * 78492df Added CHANGELOG.md * 2cc346f Fixed typo in Readme.md * 4e6a918 Updated GIT.md

Slide 11

Slide 11 text

REBASE WHEN PULLING git fetch & git rebase git pull --rebase Automatically git config branch.branch-name.rebase true git config branch.autosetuprebase always

Slide 12

Slide 12 text

RESOLVING CONFLICTS WITH REBASE git rebase --continue git rebase --skip git rebase --abort

Slide 13

Slide 13 text

INTERACTIVE REBASE Rewrites history remove squash rename ...and more Freedom ... but risky

Slide 14

Slide 14 text

GIT REBASE -I ➜ git:(master) git rebase -i ... # Rebase f0002d3..7a8c3df onto f0002d3 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commits log message # x, exec = run command (the rest of the line) using shell # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted.

Slide 15

Slide 15 text

REWRITING HISTORY ➜ git:(master) git log --oneline fcdac61 Added spec for awesome feature a497447 Added awesome feature 7a8c3df Updated SVN.md ➜ git:(master) git rebase -i HEAD~3 pick 7a8c3df Updated SVN.md pick a497447 Added awesome feature pick fcdac61 Added spec for awesome feature pick 7a8c3df Updated SVN.md reword fcdac61 Added spec for awesome feature pick a497447 Added awesome feature ➜ git:(master) git log --oneline 018a2bd Added awesome feature 6358738 Added awesome spec for awesome feature 7a8c3df Updated SVN.md

Slide 16

Slide 16 text

REFLOG Only locally Updates when HEAD is changed pulling branches switch between branches add new commits ... and much more

Slide 17

Slide 17 text

REFLOG IN PRACTICE ➜ git:(master) git reset --hard 567e4f1 ➜ git:(master) git log --oneline 519a057 Added awesome spec for awesome feature 7a8c3df Updated SVN.md ➜ git:(master) git reflog 519a057 HEAD@{0}: reset: moving to 519a057 567e4f1 HEAD@{1}: rebase -i (finish): returning to refs/heads/master 567e4f1 HEAD@{2}: rebase -i (pick): Added awesome feature 519a057 HEAD@{3}: rebase -i (reword): Added awesome spec for awesome feature eb6edf3 HEAD@{4}: rebase -i (reword): Added spec for awesome feature 7a8c3df HEAD@{5}: checkout: moving from master to 7a8c3df

Slide 18

Slide 18 text

REFLOG IN PRACTICE ➜ git:(master) git reset --hard HEAD@{1} ➜ git:(master) git log --oneline 567e4f1 Added awesome feature 519a057 Added awesome spec for awesome feature 7a8c3df Updated SVN.md ➜ git:(master) git reflog 567e4f1 HEAD@{0}: reset: moving to HEAD@{1} 519a057 HEAD@{1}: reset: moving to 519a057 567e4f1 HEAD@{2}: rebase -i (finish): returning to refs/heads/master

Slide 19

Slide 19 text

SUMMARY Two the most used strategies for merging branches Pulling with merging pollutes history with merge commits Rebase cleans history Interactive rebase helps rewrite entire history Re og may save our skin

Slide 20

Slide 20 text

THANK YOU FOR LISTENING ANY QUESTIONS?