準備
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 |
[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]$ ls README.md main.txt [vagrant@localhost branch]$ cat main.txt mainブランチで新規作成 mainブランチで追加 [vagrant@localhost branch]$ git log commit 8cb6a80d6028d4e13979f341b84843a657b16788 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:39:35 2021 +0900 main2 commit 6c8df9fbee0ac498afbd61a87446333fa56df849 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:35:37 2021 +0900 main1 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 |
[vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ ls README.md topic.txt [vagrant@localhost branch]$ cat topic.txt topicブランチで新規作成 topicブランチで追加 [vagrant@localhost branch]$ git log commit 20e6cf9435ace44a37b30343b81f29a9d97746cb (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:40:29 2021 +0900 topic2 commit ac6f273031cfdf708b390ef8f92e0dc6055844ce Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:36:47 2021 +0900 topic1 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 main1 main2 <main> ○─────△─────────▽ HEAD <topic> ○──────────◇─────────□ HEAD topic1 topic2 |
rebase
リベースは、現在いるブランチの出発点を指定したブランチの末尾に変更する。ここではtopic
ブランチをmain
ブランチに繋げるため、topic
ブランチに移動する。
1 2 3 |
[vagrant@localhost branch]$ git branch main * topic |
topic
ブランチでmain
ブランチを指定してgit rebase
を実行。
1 2 3 4 |
[vagrant@localhost branch]$ git rebase main First, rewinding head to replay your work on top of it... Applying: topic1 Applying: topic2 |
リベース後のログ。マージと違って、main
ブランチにあったコミット群の後にtopic
ブランチのコミットが連なっている。
main1
、main2
のコミット番号はmainブランチと同じだが、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 log --graph * commit 316913e356099bd42e30ad595cd65bf6951cf3e0 (HEAD -> topic) | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 09:40:29 2021 +0900 | | topic2 | * commit 005c51156d64141f2b9a0b16ead5940f4720ce37 | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 09:36:47 2021 +0900 | | topic1 | * commit 8cb6a80d6028d4e13979f341b84843a657b16788 (main) | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 09:39:35 2021 +0900 | | main2 | * commit 6c8df9fbee0ac498afbd61a87446333fa56df849 | Author: taustation <taustation@gmail.com> | Date: Thu Aug 12 09:35:37 2021 +0900 | | main1 | * 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]$ ls README.md main.txt topic.txt [vagrant@localhost branch]$ cat main.txt mainブランチで新規作成 mainブランチで追加 [vagrant@localhost branch]$ cat topic.txt 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 |
[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]$ git log commit 8cb6a80d6028d4e13979f341b84843a657b16788 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:39:35 2021 +0900 main2 commit 6c8df9fbee0ac498afbd61a87446333fa56df849 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:35:37 2021 +0900 main1 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 main1 main2 <main> ○─────△─────────▽ HEAD <topic> ○─────△─────────▽──────────◇─────────□ HEAD initial commit main1 main2 topic1 topic2 |
rebaseの撤回
リベースした後に取り消したい場合。git reflog
で詳細なログを表示し、リベース開始直前の項目のログ番号を確認する。
1 2 3 4 5 6 7 8 |
[vagrant@localhost branch]$ git reflog a3f44ad (HEAD -> topic) HEAD@{0}: checkout: moving from main to topic 8cb6a80 (main) HEAD@{1}: checkout: moving from topic to main a3f44ad (HEAD -> topic) HEAD@{2}: rebase finished: returning to refs/heads/topic a3f44ad (HEAD -> topic) HEAD@{3}: rebase: topic2 6c412c9 HEAD@{4}: rebase: topic1 8cb6a80 (main) HEAD@{5}: rebase: checkout main 20e6cf9 HEAD@{6}: checkout: moving from main to topic |
rebase
を実行したブランチ(この場合はtopic
ブランチ)で以下を実行。はじめに間違ってmain
ブランチで実行して、main
のコミット結果がtopic1
、topic2
で書き変わってしまった。
1 2 |
[vagrant@localhost branch]$ git reset --hard HEAD@{6} HEAD is now at 20e6cf9 topic2 |
topicログの結果。リベース前に戻った。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[vagrant@localhost branch]$ git log commit 20e6cf9435ace44a37b30343b81f29a9d97746cb (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:40:29 2021 +0900 topic2 commit ac6f273031cfdf708b390ef8f92e0dc6055844ce Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:36:47 2021 +0900 topic1 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 |
[vagrant@localhost branch]$ git checkout main Switched to branch 'main' [vagrant@localhost branch]$ git log commit 8cb6a80d6028d4e13979f341b84843a657b16788 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:39:35 2021 +0900 main2 commit 6c8df9fbee0ac498afbd61a87446333fa56df849 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:35:37 2021 +0900 main1 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 6 |
[vagrant@localhost branch]$ git merge topic Updating 8cb6a80..51a52c8 Fast-forward topic.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 topic.txt |
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 |
[vagrant@localhost branch]$ git log commit 51a52c8ccb34f4ee49f328fe122f1fdbf742d9c6 (HEAD -> main, topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:40:29 2021 +0900 topic2 commit 13605b7e6c0e3e4b3bfb0f3b83f87f4aee1f3acd Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:36:47 2021 +0900 topic1 commit 8cb6a80d6028d4e13979f341b84843a657b16788 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:39:35 2021 +0900 main2 commit 6c8df9fbee0ac498afbd61a87446333fa56df849 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:35:37 2021 +0900 main1 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 |
[vagrant@localhost branch]$ ls README.md main.txt topic.txt [vagrant@localhost branch]$ cat main.txt mainブランチで新規作成 mainブランチで追加 [vagrant@localhost branch]$ cat topic.txt topicブランチで新規作成 topicブランチで追加 |
マージ・リベースの撤回
マージの撤回
まずマージを撤回する。git reflog
でマージ直前のログ番号を確認。
1 2 3 4 5 6 |
[vagrant@localhost branch]$ git reflog 817d368 (HEAD -> main, topic) HEAD@{0}: checkout: moving from topic to main 817d368 (HEAD -> main, topic) HEAD@{1}: checkout: moving from main to topic 817d368 (HEAD -> main, topic) HEAD@{2}: merge topic: Fast-forward 8cb6a80 HEAD@{3}: 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 |
[vagrant@localhost branch]$ git log commit 8cb6a80d6028d4e13979f341b84843a657b16788 (HEAD -> main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:39:35 2021 +0900 main2 commit 6c8df9fbee0ac498afbd61a87446333fa56df849 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:35:37 2021 +0900 main1 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 |
[vagrant@localhost branch]$ git checkout topic Switched to branch 'topic' [vagrant@localhost branch]$ git log commit 817d3680bb6926bc22dcf5f9237fd857acecae56 (HEAD -> topic) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:40:29 2021 +0900 topic2 commit 8896d489072345869cfd7e246da841144e2858b0 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:36:47 2021 +0900 topic1 commit 8cb6a80d6028d4e13979f341b84843a657b16788 (main) Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:39:35 2021 +0900 main2 commit 6c8df9fbee0ac498afbd61a87446333fa56df849 Author: taustation <taustation@gmail.com> Date: Thu Aug 12 09:35:37 2021 +0900 main1 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 |
817d368 (HEAD -> topic) HEAD@{0}: checkout: moving from main to topic 8cb6a80 (main) HEAD@{1}: reset: moving to HEAD@{3} 817d368 (HEAD -> topic) HEAD@{2}: checkout: moving from topic to main 817d368 (HEAD -> topic) HEAD@{3}: checkout: moving from main to topic 817d368 (HEAD -> topic) HEAD@{4}: merge topic: Fast-forward 8cb6a80 (main) HEAD@{5}: checkout: moving from topic to main 817d368 (HEAD -> topic) HEAD@{6}: rebase finished: returning to refs/heads/topic 817d368 (HEAD -> topic) HEAD@{7}: rebase: topic2 8896d48 HEAD@{8}: rebase: topic1 8cb6a80 (main) HEAD@{9}: rebase: checkout main 20e6cf9 HEAD@{10}: checkout: moving from main to topic |
ログ番号を指定してgit reset
。
1 2 |
[vagrant@localhost branch]$ git reset --hard HEAD@{10} HEAD is now at 20e6cf9 topic2 |