4. Select Advanced Git Usage¶
While widely used, git
is not always well understood and often is used by
developers as one would use svn
. Below are some advanced usages of git
that CELESTE developers should be familiarize themselves with. More
documentation is always available at the
official Git Documentation.
4.1. Simple Rebasing: git rebase
¶
Git allows developers to rebase branches. To visualize:
Before:
A---B---C topic
/
D---E---F---G master
Running git rebase
:
git rebase master topic
After:
A'--B'--C' topic
/
D---E---F---G master
Developers should be rebasing their changes prior to opening a PR. This will help prevent merge conflicts and the resulting non-linear history that appears when PR is merged in, which makes future code inspection of commits unnecessarily difficult:
# BAD
A---B---C
/ \
D---E---F---G---H master
# GOOD
D---E---F---G---A'--B'--C' master
If the commits in the side branch were already pushed prior to rebase, they will need to be force-pushed after the rebase.
4.2. Interactive rebasing: git rebase -i
¶
In addition, git
supports interactive rebasing. This allows develoeprs to:
- Squash related commits together into one commit
- Edit commit messages
- Delete non-useful commits
Before:
A---B---C---D----E---F topic
/
D---E---F---G master
Running git rebase -i master topic
will open an interactive vim
shell.
Simply edit the file as instructed and save to disk to execute the rebase
operations:
pick 358bc5a commit A in topic branch
squash 1b01e0a commit B in topic branch
pick 755189f commit C in topic branch
pick b95b8a4 commit D in topic branch
squash 084bf71 commit E in topic branch
squash 01e4fde commit F in topic branch
# Rebase 897f795..084bf71 onto 897f795 (5 command(s))
#
# 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 commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
After:
(AB)---C---(DEF) topic
/
D---E---F---G master
4.3. Applying Exising Commits to a Different Branch: git cherry-pick
¶
Sometimes, we want to apply a desirable change from one working branch to
another working branch. In the below example, would like to apply commit C
to the master
branch.
Before:
76cada---62ecb3---b886a0 topic
/
dd2e86---946992---9143a9---a6fd86---5a6057 master
Running git cherry-pick
:
git checkout master
git cherry-pick 62ecb3
After:
76cada---62ecb3---b886a0 topic
/
dd2e86---946992---9143a9---a6fd86---5a6057--[62ecb3] master