はじめに
Gitのmergeとrebaseの基本的なお話です
サンプル Git treeとコード
前提 Git tree
* <176d8be> (master) hello master
| * <f7edd2a> (HEAD -> feature) print feature
|/
* <5e9878f> first commit
初期コミットからmasterブランチとfeatureブランチが枝分かれ
app.py(HEAD->feature)
def main():
# main prints Hello feature
print("Hello feature")
if __name__ == "__main__":
main()
app.py(master)
def main():
# main prints Hello master
print("Hello master")
if __name__ == "__main__":
main()
コンフリクト発生
HEADをfeatureブランチとしてmerge master
、rebase master
それぞれのコンフリクト状態を見る
git merge
git merge master
だとmasterがチャレンジャー
$ git checkout feature
$ git merge master
HEAD(現在の変更)はずっとfeature
mergeコンフリクト解消後のGit tree
* <07ad829> (HEAD -> feature) merge master into feature
|\
| * <176d8be> (master) hello master
* | <f7edd2a> print feature
|/
* <5e9878f> first commit
mergeでは既存のコミット達は消えない(破壊しない)
git rebase
git rebase master
だとfeatureがチャレンジャー
$ git checkout feature
$ git rebase master
上スクショのようにrebase中はmasterがHEADとなる
rebaseコンフリクト解消後のGit tree
* <37f6e7e> (HEAD -> feature) print feature
* <176d8be> (master) hello master
* <5e9878f> first commit
rebaseではかつてのコミット(f7edd2a
)は消えmasterにそのまま乗る新しいコミットを作る
rebaseが完了するとHEADはfeatureに戻る
おわりに
ちなみに英語では現在の変更(HEAD)は ours 、入力側の変更(チャレンジャー)は theirs という
コンフリクト解消は本記事のスクショ用にも使ったVisual Studio Codeが便利