概要
Git – merge – no-fast-forward – 競合なしでは、main
ブランチとtopic
ブランチのそれぞれでコミットが行われるが、互いに干渉しない場合を考えた。そして、各ブランチにコミットがある場合にはfast-forwardではなく、no-fast-forwardマージになることを確認した。
競合がない場合には、no-fast-forwardマージにおいて、Gitが自動的にマージを行ってくれる。しかし互いのコミットに競合が生じる場合、Gitは競合を自動的には解消できず、マージも行われない。
このようなときは、Gitの示唆するファイルでの競合を解消してコミットし、手動でマージを完了させる。
準備
リポジトリーの準備
Git-ブランチ-基本操作-fast-fowardのリポジトリーを使う。イニシャルコミットの状態から始める
1 2 3 4 5 6 7 8 |
[vagrant@localhost branch]$ git branch * main [vagrant@localhost branch]$ git log commit ad931b08026b6a1ba68350176ae892bcb115a23e (HEAD -> main, 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
ブランチで並行して変更するファイル(common.txt
)を作成する。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成 [vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git commit -m "main0" [main a8878b7] main0 1 file changed, 2 insertions(+) create mode 100644 common.txt |
ファイル作成・コミット後のログを確認。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost branch]$ git log commit a8878b7052a86e7d5134a44c58820aed4548debe (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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
ブランチ作成、そこに移動して、main
ブランチで作成したファイルが反映されていることを確認。
1 2 3 4 5 6 7 8 |
[vagrant@localhost branch]$ git branch topic [vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ ls README.md common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成 |
ログ確認。topic
ブランチはmain
ブランチの直近の環境を引き継いでいる。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost branch]$ git log commit a8878b7052a86e7d5134a44c58820aed4548debe (HEAD -> topic, main) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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/main
各ブランチで並行して、common.txt
に変更を加えていく。
topic
ブランチで行追加。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成 topicブランチで1行追加 [vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git commit -m "topic1" [topic c8f0942] topic1 1 file changed, 1 insertion(+) |
main
ブランチで行追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[vagrant@localhost branch]$ git checkout main Switched to branch 'main' Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits) [vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成 mainブランチで1行追加 [vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git commit -m "main1" [main 469df98] main1 1 file changed, 1 insertion(+) |
topic
ブランチで既存の行を変更。
1 2 3 4 5 6 7 8 9 10 11 |
[vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->topicブランチで追加 topicブランチで1行追加 [vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git commit -m "topic2" [topic 86fdf72] topic2 1 file changed, 1 insertion(+), 1 deletion(-) |
mainでブランチ同じ行を変更。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[vagrant@localhost branch]$ git checkout main Switched to branch 'main' Your branch is ahead of 'origin/main' by 2 commits. (use "git push" to publish your local commits) [vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 [vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git commit -m "main2" [main 3320174] main2 1 file changed, 1 insertion(+), 1 deletion(-) |
各ブランチのログを確認する。
main
ブランチのログにはmain
での2つのコミットが追加記録されている。
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 3320174414eea95d39f0fd153eac19d33ae49884 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:54:22 2021 +0900 main2 commit 469df98f01b4eb1b8c588a5f89bd7969f6d01e50 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:49:00 2021 +0900 main1 commit a8878b7052a86e7d5134a44c58820aed4548debe Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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
ブランチのログにはtopic
での2つのコミットが追加記録されている。
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 |
[vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ git log commit 86fdf722165f9044315e0021d8a223a6391663f0 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:52:06 2021 +0900 topic2 commit c8f0942c67e4c3f1cc9434e667be99971af44a67 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:31:17 2021 +0900 topic1 commit a8878b7052a86e7d5134a44c58820aed4548debe Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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 |
マージ
競合によるマージの中止
main
ブランチからgit merge
でtopic
ブランチをマージ。しかし競合しているため自動マージができず、マージは行われない。
1 2 3 4 5 6 7 8 |
[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]$ git merge topic Auto-merging common.txt CONFLICT (content): Merge conflict in common.txt Automatic merge failed; fix conflicts and then commit the result. |
競合の解消とコミット
common.txt
の内容を見てみると、競合する部分がGitによって示されている。
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 |
common.txt
の内容を手動で修正、コミット。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加とtopicブランチで追加 mainブランチで1行追加 topicブランチで1行追加 [vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git commit -m "Resolved conflict" [main b42bff6] Resolved conflict |
マージ完了。ログで確認。
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 37 38 39 40 41 42 43 |
[vagrant@localhost branch]$ git log commit b42bff65ca3a95ee471984c592b42011072dc00e (HEAD -> main) Merge: 3320174 86fdf72 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 11:13:00 2021 +0900 Resolved conflict commit 3320174414eea95d39f0fd153eac19d33ae49884 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:54:22 2021 +0900 main2 commit 86fdf722165f9044315e0021d8a223a6391663f0 (topic) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:52:06 2021 +0900 topic2 commit 469df98f01b4eb1b8c588a5f89bd7969f6d01e50 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:49:00 2021 +0900 main1 commit c8f0942c67e4c3f1cc9434e667be99971af44a67 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:31:17 2021 +0900 topic1 commit a8878b7052a86e7d5134a44c58820aed4548debe Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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 |
git log --graph
で確認。
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 37 38 39 40 41 42 43 |
[vagrant@localhost branch]$ git log --graph * commit b42bff65ca3a95ee471984c592b42011072dc00e (HEAD -> main) |\ Merge: 3320174 86fdf72 | | Author: taustation <taustation@gmail.com> | | Date: Wed Aug 11 11:13:00 2021 +0900 | | | | Resolved conflict | | | * commit 86fdf722165f9044315e0021d8a223a6391663f0 (topic) | | Author: taustation <taustation@gmail.com> | | Date: Wed Aug 11 10:52:06 2021 +0900 | | | | topic2 | | | * commit c8f0942c67e4c3f1cc9434e667be99971af44a67 | | Author: taustation <taustation@gmail.com> | | Date: Wed Aug 11 10:31:17 2021 +0900 | | | | topic1 | | * | commit 3320174414eea95d39f0fd153eac19d33ae49884 | | Author: taustation <taustation@gmail.com> | | Date: Wed Aug 11 10:54:22 2021 +0900 | | | | main2 | | * | commit 469df98f01b4eb1b8c588a5f89bd7969f6d01e50 |/ Author: taustation <taustation@gmail.com> | Date: Wed Aug 11 10:49:00 2021 +0900 | | main1 | * commit a8878b7052a86e7d5134a44c58820aed4548debe | Author: taustation <taustation@gmail.com> | Date: Wed Aug 11 07:02:35 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 |
initial commit main0 main1 main2 <main> ○──────○・・・・・・・・・△・・・・・・・・・▽ HEAD \───◇───/ \───□───/ topic1 topic2 <topic> ○────◇─────────□ HEAD main0 topic1 topic2 |
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 86fdf722165f9044315e0021d8a223a6391663f0 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:52:06 2021 +0900 topic2 commit c8f0942c67e4c3f1cc9434e667be99971af44a67 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:31:17 2021 +0900 topic1 commit a8878b7052a86e7d5134a44c58820aed4548debe Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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 |
マージ撤回
以下のコマンドで、マージ直前の常態に戻る。
get reset --hard HEAD^
1 2 |
[vagrant@localhost branch]$ git reset --hard HEAD^ HEAD is now at 3320174 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 25 26 27 28 |
[vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 [vagrant@localhost branch]$ git log commit 3320174414eea95d39f0fd153eac19d33ae49884 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:54:22 2021 +0900 main2 commit 469df98f01b4eb1b8c588a5f89bd7969f6d01e50 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:49:00 2021 +0900 main1 commit a8878b7052a86e7d5134a44c58820aed4548debe Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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
マージで競合した場合のabortの確認のため再度マージする。競合が発生している。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[vagrant@localhost branch]$ git merge topic Auto-merging common.txt CONFLICT (content): Merge conflict in common.txt Automatic merge failed; fix conflicts and then commit the result. [vagrant@localhost branch]$ cat common.txt 共通ファイル <<<<<<< HEAD mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 ======= mainブランチで新規作成->topicブランチで追加 topicブランチで1行追加 >>>>>>> topic |
マージしようとして競合状態にある場合、以下のコマンドでマージ前の状態に戻せる。
gite merge --abort
1 |
[vagrant@localhost branch]$ git merge --abort |
ファイルの内容、ログともマージ前に戻る。
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 |
[vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加 mainブランチで1行追加 [vagrant@localhost branch]$ git log commit 3320174414eea95d39f0fd153eac19d33ae49884 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:54:22 2021 +0900 main2 commit 469df98f01b4eb1b8c588a5f89bd7969f6d01e50 Author: taustation <taustation@gmail.com> Date: Wed Aug 11 10:49:00 2021 +0900 main1 commit a8878b7052a86e7d5134a44c58820aed4548debe Author: taustation <taustation@gmail.com> Date: Wed Aug 11 07:02:35 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 |
[vagrant@localhost branch]$ git merge topic Auto-merging common.txt CONFLICT (content): Merge conflict in common.txt Automatic merge failed; fix conflicts and then commit the result. |
競合が解消されていない状態ではtopic
ブランチには移動できない。
1 2 3 |
[vagrant@localhost branch]$ git checkout topic common.txt: needs merge error: you need to resolve your current index first |
競合を解消する。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost branch]$ vi common.txt [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->mainブランチで追加とtopicブランチで追加 mainブランチで1行追加 topicブランチで1行追加 [vagrant@localhost branch]$ git add . [vagrant@localhost branch]$ git commit -m "Resolved conflict" [main 0ef7155] Resolved conflict |
競合が解消されればtopic
ブランチに移動可能になる。
1 2 3 4 5 6 |
[vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ cat common.txt 共通ファイル mainブランチで新規作成->topicブランチで追加 topicブランチで1行追加 |
fast-forwardマージは不可
競合がないコミットの場合と同じように、no-fast-forwardのマージを強制的にfast-forwardで行うことはできない。
1 2 |
[vagrant@localhost branch]$ git merge topic --ff-only fatal: Not possible to fast-forward, aborting. |