Gitのrebaseの使いどころ
1. リモートブランチなし
例) ローカルで修正中でPR未作成、最新化してPR作成したい
code: (sh)
main(リモート): A -- B -- C
feature(ローカル): A -- B -- D -- E
→ mainが更新されているが、featureはリモートに存在しない(未追跡)
code: (sh)
A -- B -- C -- D' -- E'
→ featureのコミット(D、E)をmainの最新(C)に載せ直す
code: (sh)
# 最新取得
git fetch origin
# 明示的に統合先を指定
git rebase origin/main
git push origin feature/xxxx
# リモートブランチを設定
git push -u origin feature/xxxx
リモート追跡していないので明示的な統合先の指定が必要
リモートブランチ未作成のため強制pushは不要
2. リモートブランチあり
例) PR作成後、mainブランチの最新を取り込んでコミットをきれいにする
code: (sh)
main(リモート): 更新あり
feature(ローカル): origin/feature を追跡中
→ リモートブランチを追跡中
code: (sh)
# mainの最新を取り込んでrebase
git pull --rebase
or
# 明示的に統合先を指定してもok
git fetch origin
git rebase origin/main
o
sh
# 安全に強制push
git push --force-with-lease --force-if-includes
pull --rebase: fetch origin + rebase origin/main
リモート設定済みのためpush時のブランチ指定は不要
push --force-with-lease: 自分のローカルが追跡しているリモートブランチと同じ状態なら上書き
直近にfetchした内容とリモートが一致するかどうかで判断している
他人の更新を誤って消去しない
他の人がすでに push していたらエラーになる
push --force-if-includes: 追跡ブランチの最新コミットがローカルのreflog に含まれている場合のみpushを許可
自分が過去に取り込んだ履歴を上書きする場合に安全に push できる
push --force-with-lease と一緒に使用する