🙄
Githubにマージコミットした後にやっぱりrebaseしたくなった時
📌 状況
- ブランチb1で開発した内容をコミット & プッシュしてプルリクエスト生成
- コンフリクトが発生したので、ローカルのブランチでmainブランチの内容をb1ブランチ
- 再度b1ブランチにプッシュしたが、樹形図が複雑になったのでリベースしてやり直したい。
📌 対応方針
- まず、ブランチb1のマージコミットをresetでマージ前の状態に戻す。
git reset --hard <コミットハッシュ>
git push --force
- 再度、ブランチb1でリベースを行う。(同時にコンフリクトも解消する)
git rebase -i <mainのリベース先のコミットハッシュ>
- コンフリクトを手動で解消
git add .
git rebase --continue
git push --force
📌 検証
⌨️ 事前条件
下記のような樹形図の時。
全コミットで同じファイルを編集しているので、mainブランチとb1ブランチはコンフリクトしている。
⌨️ mainブランチの内容をb1ブランチにマージする
# ローカル & リモートブランチの確認
> git status -sb
## b1...origin/b1
# mainブランチをb1ブランチにマージする
# -> README.mdでコンフリクトが発生している。
> git merge main
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
# README.md ファイルを編集。
# 編集内容をコミットしてプッシュ
> git add .
> git commit
[b1 ec494f3] Merge branch 'main' into b1
> git push
b1ブランチがmainにマージされた。
⌨️ 対応方針の手順1. マージコミットをマージ前の状態に戻す。
# コミットハッシュを確認
> git log --oneline
ec494f3 (HEAD -> b1, origin/b1) Merge branch 'main' into b1
a7eba5c (origin/main, origin/HEAD, main) main 編集3
2066473 b1 編集2 # このコミットがbranch b1の戻るポイント。
3a16ad0 main 編集2
f8441f6 b1 編集1
ba2ba27 main 編集1
bb7d5b4 Initial commit
> git reset --hard 2066473
HEAD is now at 2066473 b1 編集2
# マージ前の状態に戻った。
> git log --oneline
2066473 (HEAD -> b1) b1 編集2
f8441f6 b1 編集1
ba2ba27 main 編集1
bb7d5b4 Initial commit
# Githubにプッシュ
> git push --force
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/shin039/practice_github.git
+ ec494f3...2066473 b1 -> b1 (forced update)
この状態の時の樹形図。マージ前の状態に戻っている。
⌨️ 対応方針の手順2. ブランチb1でリベースを行う。(同時にコンフリクトも解消する)
> git log --graph --all --oneline
* a7eba5c (origin/main, origin/HEAD, main) main 編集3 # ここがリベース先になる。(A)
* 3a16ad0 main 編集2
| * 2066473 (HEAD -> b1, origin/b1) b1 編集2 # これと、
| * f8441f6 b1 編集1 # この変更を、(A)の後に付けたい。
|/
* ba2ba27 main 編集1
* bb7d5b4 Initial commit
# 現在のブランチの確認
> git status -sb
## b1...origin/b1
# ポイント(A)にリベースする。
> git rebase -i a7eba5c
hint: Waiting for your editor to close the file...
# 下記2点のコミットについてリベースの方針を指定。
# 今回は全てpickを選択。
# ・pick f8441f6 b1 編集1
# ・pick 2066473 b1 編集2
# リベースの指示が終わったら、引き続き下記を実行していく。
> git rebase -i a7eba5c
error: could not apply f8441f6... b1 編集1
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".
Could not apply f8441f6... b1 編集1
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
# コミットハッシュ「f8441f6」のコミットでコンフリクトしているので、
# 手動でREADME.mdファイルを編集する。
# 編集が完了したら↓を実行していく。
# 編集したファイルをステージする。
> git add .
# rebaseを続行する。
> git rebase --continue
hint: Waiting for your editor to close the file...
# f8441f6のコミットのコミットコメントの入力を求められる。
# 既存のコメントは入力されているが、必要ならコメントを変更する
# コメント入力が終わったら、↓を実行していく。
> git add .
> git rebase --continue
# コミットハッシュ「2066473」のコミットでコンフリクトしているので、
# 手動でREADME.mdファイルを編集する。
# 編集が完了したら↓を実行していく。
> git add .
> git rebase --continue
[detached HEAD 0f5179e] b1 編集2
1 file changed, 4 insertions(+)
Successfully rebased and updated refs/heads/b1. # リベースが完了した!
# Githubにプッシュする
> git push --force
Githubのプルリクエスト画面で「Rebase and merge」を実行する。
樹形図をきれいにすることが出来た。
Discussion