🙄

Githubにマージコミットした後にやっぱりrebaseしたくなった時

2024/03/22に公開

📌 状況

  1. ブランチb1で開発した内容をコミット & プッシュしてプルリクエスト生成
  2. コンフリクトが発生したので、ローカルのブランチでmainブランチの内容をb1ブランチ
  3. 再度b1ブランチにプッシュしたが、樹形図が複雑になったのでリベースしてやり直したい。

📌 対応方針

  1. まず、ブランチb1のマージコミットをresetでマージ前の状態に戻す。
    1. git reset --hard <コミットハッシュ>
    2. git push --force
  2. 再度、ブランチb1でリベースを行う。(同時にコンフリクトも解消する)
    1. git rebase -i <mainのリベース先のコミットハッシュ>
    2. コンフリクトを手動で解消
    3. git add .
    4. git rebase --continue
    5. 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