From 3ac8f8d767fea236ae6fcf72f9f3f23e56f4828a Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 17 Jun 2015 12:31:03 +0200 Subject: Add section on history cleanup --- cheatsheet.txt | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/cheatsheet.txt b/cheatsheet.txt index 92bee2e..20894f7 100644 --- a/cheatsheet.txt +++ b/cheatsheet.txt @@ -67,6 +67,75 @@ Rebasing git rebase origin[/master] git push --tags origin +History Cleanup + + This is the overall process for cleaning up the history in a feature + branch before merging it into master. The goal is to end up with a + nice and clean history in master, without any divergences and merges + that usually the result of the git merge command. + + Note: make sure you have rerere enabled for this process to work + smoothly (~/.gitconfig). + + Note: if you are just learning this procedure, make a local backup + copy of your repository in case things go badly and you need to + start from scratch. + + To achieve this we first merge any unmerged changes that may be on + master and then rebase the whole thing on master. The end result of + this step is a history that first has all the commits that are from + master followed by all the commit from the feature branch (in other + words, master is now a prefix of our history which means we can + fastforward-only (--ff-only) merge this history into it): + + git cout feature + git merge master + git rebase master + + At this stage, run gitk and verify that you now have a linear history + that starts with master. + + The second step is to clean up the commit history of our feature + branch since it may have "dirty", work-in-progress commits. This may + involve squashing several commits into one, rewording commit messages, + and possibly reordering the commits. The swiss army knife for this + is the interactive git rebase: + + git rebase -i HEAD~ + + Where is the number of commits you would like to cleanup. Generally, + if you want to work on all the commits on this feature branch run gitk + and count the number of commits from the top to the first commit that + is on master (and if you know a better way to achieve the same result, + let me know). That is your . + + Note also that the order of commits in the resulting edit file will + be the reverse of what you see in gitk. + + Once in the edit file, use commands to squash, reword, or reorder + the history (note that squashing several commits automatically + means rewording the commit message). Note also that you can re-run + this command multiple times. For example, you can squash some + commits, then examine the history (with gitk), then squash some + more, etc. + + Finally, once the history is cleaned up, we can merge it into + master: + + git cout master + git merge --ff-only feature + + Verify with gitk everything looks good on master and push: + + git push + + It is also a good idea to delete the feature branch, both locally + and on the origin: + + git br -d feature + git push origin :feature + + Submodules git config --global status.submoduleSummary true -- cgit v1.1