準備
Git – merge – no-fast-forward – 競合ありで準備したのと同じ内容でブランチとコミットを準備する。
main
ブランチのファイル、ログの内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[vagrant@localhost branch]$ git checkout main Switched to branch 'main' Your branch is ahead of 'origin/main' by 3 commits. (use "git push" to publish your local commits) [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 [vagrant@localhost branch]$ git log commit 7940be59370dfdbc9d2bdd1177967a3e5ac2a958 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:59 2021 +0900 main2 commit 931848378d6d2594d868d92636f00a2a536a03d9 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:22:44 2021 +0900 main1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
topic
ブランチのファイル、ログの内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->topicブランチで追加 topicブランチで1行追加 [vagrant@localhost branch]$ git log commit f64b41dc23038f579d6d4d0d7b93ef12061d2ed9 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:23 2021 +0900 topic2 commit 349e514e0964d627b5acdf3df95e61db4dae1fe0 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:21:58 2021 +0900 topic1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
準備後の状態は以下の通り。
1 2 3 4 5 |
initial commit main0 main1 main2 <main> ○──────○─────────△─────────▽ HEAD <topic> ○────◇─────────□ HEAD main0 topic1 topic2 |
rebase
リベースは、現在いるブランチの出発点を指定したブランチの末尾に変更する。ここではtopic
ブランチをmain
ブランチに繋げるため、topic
ブランチに移動する(あるいはtopicブランチにいることを確認する)。
1 2 3 |
[vagrant@localhost branch]$ git branch main * topic |
topic
ブランチでmain
ブランチを指定してgit rebase
を実行。common.txt
で自動マージを実行しようとしたときに競合が発生している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[vagrant@localhost branch]$ git rebase main First, rewinding head to replay your work on top of it... Applying: topic1 Using index info to reconstruct a base tree... M common.txt Falling back to patching base and 3-way merge... Auto-merging common.txt CONFLICT (content): Merge conflict in common.txt error: Failed to merge in the changes. Patch failed at 0001 topic1 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". |
common.txt
の内容を確認してみると、マージの時と同じく競合部分の差分がマークされている。
1 2 3 4 5 6 7 8 9 10 |
[vagrant@localhost branch]$ cat common.txt 共通ファイル <<<<<<< HEAD mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 ======= mainブランチで新規作成 topicブランチで1行追加 >>>>>>> topic1 [vagrant@localhost branch]$ |
ただし、マージで競合した場合(以下の内容)と違うところがある。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost branch]$ cat common.txt 共通ファイル <<<<<<< HEAD mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 ======= mainブランチで新規作成->topicブランチで追加 topicブランチで1行追加 >>>>>>> topic |
topic
でログを見ると、ベース変更のためにmain
ブランチのコミットを適用したところで止まっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[vagrant@localhost branch]$ git log commit d6f9ae35fb9abb8654d94ca01cce3da0e3a5c50f (HEAD, main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 13:52:21 2021 +0900 main2 commit c469b90838f45d3d5ee94351cba976111a332756 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 13:49:50 2021 +0900 main1 commit 987a764f93cdcfdcde6f434ae888df8807136811 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 13:44:22 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
abort
競合が発生したリベースを中止したい場合は、git rebase --abort
を実行。
1 |
[vagrant@localhost branch]$ git rebase --abort |
ログを確認すると、rebase実行前の状態に戻っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[vagrant@localhost branch]$ git log commit c3435d8d143b90b700b8a3b5d9141bff6d8bd988 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 13:51:03 2021 +0900 topic2 commit 2514a8f460ba7c7805ad89bc3e2d6b8ddc1c356a Author: taustation <taustation@gmail.com> Date: Thu Aug 12 13:49:08 2021 +0900 topic1 commit 987a764f93cdcfdcde6f434ae888df8807136811 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 13:44:22 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
競合の解消
再度リベースを試みる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[vagrant@localhost branch]$ git rebase main First, rewinding head to replay your work on top of it... Applying: topic1 Using index info to reconstruct a base tree... M common.txt Falling back to patching base and 3-way merge... Auto-merging common.txt CONFLICT (content): Merge conflict in common.txt error: Failed to merge in the changes. Patch failed at 0001 topic1 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". |
競合しているcommon.txt
のマークされた部分を修正。
1 2 3 4 5 6 |
[vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加(->topicブランチで追加) mainブランチで1行追加 topicブランチで1行追加 |
競合解消後のリベースの手順は以下の通り
- 競合を解消したファイルを
git add
- ここでコミットせずに、
git rebase --continue
ところがまた競合が生じた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git rebase --continue Applying: topic1 Applying: topic2 Using index info to reconstruct a base tree... M common.txt Falling back to patching base and 3-way merge... Auto-merging common.txt CONFLICT (content): Merge conflict in common.txt error: Failed to merge in the changes. Patch failed at 0002 topic2 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". |
common.txtの内容。今度はtopicブランチでの追加結果が反映されていて、上で新たに修正した内容と食い違っていると言われている。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost branch]$ cat common.txt 共通ファイル <<<<<<< HEAD mainブランチで新規作成->mainブランチで追加(->topicブランチで追加) mainブランチで1行追加 ======= mainブランチで新規作成->topicブランチで追加 >>>>>>> topic2 topicブランチで1行追加 |
common.txt
を修正。
1 2 3 4 5 6 |
[vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加->topicブランチで追加 mainブランチで1行追加 topicブランチで1行追加 |
git add
してgit rebase --continue
。今度は最後まで通った。
1 2 3 4 5 6 7 8 |
[vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git rebase --continue Applying: topic2 [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加->topicブランチで追加 mainブランチで1行追加 topicブランチで1行追加 |
リベース後のtopic
ブランチのログ。コミットが繋がっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[vagrant@localhost branch]$ git log --graph * commit 092297fdd5479d8b5c0c86fa2355a24fc5a50a87 (HEAD -> topic) | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 17:23:23 2021 +0900 | | topic2 | * commit e239b666af29f2d3d793ee685948e6baad0f30bf | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 17:21:58 2021 +0900 | | topic1 | * commit 7940be59370dfdbc9d2bdd1177967a3e5ac2a958 (main) | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 17:23:59 2021 +0900 | | main2 | * commit 931848378d6d2594d868d92636f00a2a536a03d9 | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 17:22:44 2021 +0900 | | main1 | * commit 24a6fdb19025eb52e229cb77bba90841917b2031 | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 17:20:48 2021 +0900 | | main0 | * commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
main
ブランチの方は特に変更されていない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
[vagrant@localhost branch]$ git checkout main Switched to branch 'main' Your branch is ahead of 'origin/main' by 3 commits. (use "git push" to publish your local commits) [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 [vagrant@localhost branch]$ git log commit 7940be59370dfdbc9d2bdd1177967a3e5ac2a958 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:59 2021 +0900 main2 commit 931848378d6d2594d868d92636f00a2a536a03d9 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:22:44 2021 +0900 main1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
リベース後の状態は以下のようになっている。
1 2 3 4 5 |
initial commit main0 main1 main2 <main> ○──────○─────────△─────────▽ HEAD <topic> ○──────○─────────△─────────▽────◇────□ HEAD main0 main1 main2 topic1 topic2 |
rebaseの撤回
リベースした後に取り消したい場合。git reflog
で詳細なログを表示し、リベース開始直前の項目のログ番号を確認する。
1 2 3 4 5 6 7 8 |
[vagrant@localhost branch]$ git reflog 7940be5 (HEAD -> main) HEAD@{0}: checkout: moving from topic to main 092297f (topic) HEAD@{1}: rebase finished: returning to refs/heads/topic 092297f (topic) HEAD@{2}: rebase: topic2 e239b66 HEAD@{3}: rebase: topic1 7940be5 (HEAD -> main) HEAD@{4}: rebase: checkout main f64b41d HEAD@{5}: checkout: moving from main to topic ..... |
rebase
を実行したブランチ(この場合はtopic
ブランチ)で以下を実行。間違ってmain
ブランチで実行すると、main
のコミット結果がtopic1
、topic2
で書き変わってしまう。
1 2 3 4 |
[vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ git reset --hard HEAD@{5} HEAD is now at 7940be5 main2 |
topic
ログの結果。リベース前に戻った。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[vagrant@localhost branch]$ git log commit f64b41dc23038f579d6d4d0d7b93ef12061d2ed9 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:23 2021 +0900 topic2 commit 349e514e0964d627b5acdf3df95e61db4dae1fe0 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:21:58 2021 +0900 topic1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
mainブランチは変更されていない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[vagrant@localhost branch]$ git log commit 7940be59370dfdbc9d2bdd1177967a3e5ac2a958 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:59 2021 +0900 main2 commit 931848378d6d2594d868d92636f00a2a536a03d9 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:22:44 2021 +0900 main1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
リベース結果のmainブランチへの反映
topic
ブランチでリベースを実行すると、その結果はtopic
ブランチでのものとなる。最終的にmain
ブランチにその結果を反映させたいときは、main
ブランチに移動してそこでtopicブランチをマージする。
1 2 3 4 5 |
[vagrant@localhost branch]$ git merge topic Updating 7940be5..092297f Fast-forward common.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) |
main
ブランチでコミットが行われていなければ、マージはfast-forwardで行われ、main
の内容がリベース後の結果まで送られる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[vagrant@localhost branch]$ git log commit 092297fdd5479d8b5c0c86fa2355a24fc5a50a87 (HEAD -> main, topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:23 2021 +0900 topic2 commit e239b666af29f2d3d793ee685948e6baad0f30bf Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:21:58 2021 +0900 topic1 commit 7940be59370dfdbc9d2bdd1177967a3e5ac2a958 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:59 2021 +0900 main2 commit 931848378d6d2594d868d92636f00a2a536a03d9 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:22:44 2021 +0900 main1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
作業結果も反映されている。
1 2 3 4 5 |
[vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加->topicブランチで追加 mainブランチで1行追加 topicブランチで1行追加 |
マージ・リベースの撤回
マージの撤回
まずマージを撤回する。git reflog
でマージ直前のログ番号を確認。
1 2 3 4 |
[vagrant@localhost branch]$ git reflog 092297f (HEAD -> main, topic) HEAD@{0}: merge topic: Fast-forward 7940be5 HEAD@{1}: checkout: moving from topic to main ..... |
確認したログ番号でgit reset
。
1 2 |
[vagrant@localhost branch]$ git reset --hard HEAD@{3} HEAD is now at 8cb6a80 main2 |
main
ブランチの内容が元に戻る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[vagrant@localhost branch]$ git log commit 7940be59370dfdbc9d2bdd1177967a3e5ac2a958 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:59 2021 +0900 main2 commit 931848378d6d2594d868d92636f00a2a536a03d9 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:22:44 2021 +0900 main1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
topic
ブランチの内容はリベース直後の状態。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[vagrant@localhost branch]$ git log commit 092297fdd5479d8b5c0c86fa2355a24fc5a50a87 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:23 2021 +0900 topic2 commit e239b666af29f2d3d793ee685948e6baad0f30bf Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:21:58 2021 +0900 topic1 commit 7940be59370dfdbc9d2bdd1177967a3e5ac2a958 (main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:59 2021 +0900 main2 commit 931848378d6d2594d868d92636f00a2a536a03d9 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:22:44 2021 +0900 main1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |
リベースの撤回
先ほどのリベースの撤回と同じ手順。
1 2 3 4 5 6 7 |
[vagrant@localhost branch]$ git reflog ..... 092297f (HEAD -> topic) HEAD@{13}: rebase: topic2 e239b66 HEAD@{14}: rebase: topic1 7940be5 (main) HEAD@{15}: rebase: checkout main f64b41d HEAD@{16}: checkout: moving from main to topic ..... |
ログ番号を指定してgit reset
。
1 2 |
[vagrant@localhost branch]$ git reset --hard HEAD@{10} HEAD is now at 20e6cf9 topic2 |
topicブランチの内容が元に戻っている(mainブランチも)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[vagrant@localhost branch]$ git log commit f64b41dc23038f579d6d4d0d7b93ef12061d2ed9 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:23:23 2021 +0900 topic2 commit 349e514e0964d627b5acdf3df95e61db4dae1fe0 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:21:58 2021 +0900 topic1 commit 24a6fdb19025eb52e229cb77bba90841917b2031 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 17:20:48 2021 +0900 main0 commit ad931b08026b6a1ba68350176ae892bcb115a23e (origin/main, origin/HEAD) Author: taustation <88479749+taustation@users.noreply.github.com> Date: Sun Aug 8 22:40:29 2021 +0900 Initial commit |