実行前の状態
main が
この
ターミナル
git init -q -b main hello
cd hello
echo "# hello" > README.md
git add README.md
git commit -q -m "README を作る"
git switch -q -c by-merge
echo "print('hi')" > app.py
git add app.py
git commit -q -m "app.py を足す"
git branch by-rebase
git switch -q main
echo "start" >> README.md
git commit -q -a -m "README に説明を足す"最小の例と結果
by-merge には merge、
ターミナル
git switch -q by-merge
git merge --no-edit mainMerge made by the 'ort' strategy.
README.md | 1 +
1 file changed, 1 insertion(+)ターミナル
git switch -q by-rebase
git rebase mainSuccessfully rebased and updated refs/heads/by-rebase.成功の確認
2 本の
ターミナル
git log --oneline --graph by-merge* a1b2c3d Merge branch 'main' into by-merge
|\
| * 9f8e7d6 README に説明を足す
* | 3c4d5e6 app.py を足す
|/
* 1b2c3d4 README を作るターミナル
git log --oneline --graph by-rebase* 5e6f7a8 app.py を足す
* 9f8e7d6 README に説明を足す
* 1b2c3d4 README を作るrebase のapp.py を足す の
比べる表
| 観点 | merge | rebase |
|---|---|---|
| 履歴の形 | 分かれて合流した跡が残る | 1 本にそろう |
| 元のコミット | そのまま残る | 作り直されて |
| push 済みのブランチ | 使える | 使わない |
| 衝突を直す回数 | 1 回 | コミットごとに起きうる |
| 取り消し | 打ち消す | reflog で戻る |
使い分け
まだ push していない
rebase を
push 済みの
merge を
main への取り込み
チームが
途中で止まったとき
merge は git merge --abort、git rebase --abort で、
よくある疑問
結果の 中身の ファイルは 変わりますか
衝突が
rebase の あと、 push が 弾かれました
push 済みの
どちらも 使いたい ときは ありますか
あります。
