Closed7

git rebase の競合解決方法まとめ

KouKou

rebase

異なるブランチを統合する方法の1つ。
現在のブランチの先頭に指定したブランチの変更履歴を反映する。
マージコミットが生成されないため、履歴が単純になる。

KouKou

実行方法

git rebase <rebase先のブランチ>
KouKou

競合発生

エラーメッセージ

First, rewinding head to replay your work on top of it...
Applying: commit
Using index info to reconstruct a base tree...
M       README.md
Falling back to patching base and 3-way merge...
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: Failed to merge in the changes.
Patch failed at 0001 commit
hint: Use 'git am --show-current-patch' to see the failed patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

要約すると競合が発生したため、手動で競合を解消し、解消したファイルをステージし、rebaseを継続、スキップ、中止することが可能である。

KouKou

継続する場合

  1. 競合を解消し、ステージングする(コミットはしない)
  2. rebaseを継続する
git rebase --continuse
  1. コミットが正常に適用されたら、プッシュする

ただし、下記のエラーが発生する。

error: failed to push some refs to 'https://github.com/*****/git_test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

内容としては、リモートリポジトリにあるコミットがローカルブランチに存在しないことから、プッシュが安全ではないという警告。

そのため、強制プッシュを実行する。

git push --force-with-lease origin HEAD
KouKou

強制プッシュ

git push --force-with-leaseは強制プッシュを行う際に、安全な方法で行うためのコマンドである。
リモートブランチがフェッチしたときと同じ状態の場合にのみ、実行される。

git push --forceだと、強制プッシュする段階で他の開発者がプッシュしている場合、変更を上書きされるリスクがあるので、リスク軽減のためにgit push --force-with-leaseを実行することが望ましい。

KouKou

スキップする場合

次のコマンドで適用されるコミットをskipすることが可能である。

git rebase --skip

本来のコードの変更や履歴が失われる可能性があるため、適用されるコミットを無視して良いかどうかはしっかり判断する必要がある。

KouKou

中止する場合

次のコマンドで競合を解消せずに、変更を破棄しrebaseを中止することが可能である。

git rebase --abort
このスクラップは2023/03/25にクローズされました