[Git] 動作を試す 実行例33：cherry-pickで一部のコミットをマージする

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/115d75239e51cfbd9c7f) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/8f04abf9bed828cbdb6f) |
|:-:|:-:|:-:|

# 実行例

```
(※始めにコミット履歴状況を確認)
git log --oneline --graph --all
↓
結果: 
*   135f847 (HEAD -> branch1) Merge branch 'master' into branch1
|\
| * 60b0341 (master) message12
| * 045a734 message11
| * d10f934 message10
* | 2495cae message7
|/
| * b838160 (branch2) message9
| * c68ef01 message8
|/
* 94996a0 message4
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

(※チェリーピックするコミットを選ぶ: branch2 ← master)
git checkout branch2
git log branch2..master --oneline
↓
結果: 
60b0341 (master) message12
045a734 message11
d10f934 message10

git show d10f934 --oneline
↓
結果: 
d10f934 message10
diff --git a/test1.txt b/test1.txt
index bb7eb1a..ab3d9a7 100644
--- a/test1.txt
+++ b/test1.txt
@@ -2,3 +2,4 @@ Sample-Added-11
 Sample-Added-12
 Sample-Added-13
 Sample-Added-14
+Sample-Added-110
diff --git a/test10.txt b/test10.txt
new file mode 100644
index 0000000..128c764
--- /dev/null
+++ b/test10.txt
@@ -0,0 +1 @@
+Sample-Added-1010

-----

(※masterのmessage10をbranch2へチェリーピックしてみる)

※チェリーピック(つまみぐい)という部分的なマージ方法
git cherry-pick d10f934
↓
結果: 
Auto-merging test1.txt
CONFLICT (content): Merge conflict in test1.txt
error: could not apply d10f934... message10
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".
hint: You can instead skip this commit with "git cherry-pick --skip".
hint: To abort and get back to the state before "git cherry-pick",
hint: run "git cherry-pick --abort".

git status -s
↓
結果: 
UU test1.txt
A  test10.txt

git diff
↓
結果: 
diff --cc test1.txt
index 837e078,ab3d9a7..0000000
--- a/test1.txt
+++ b/test1.txt
@@@ -2,5 -2,4 +2,9 @@@ Sample-Added-1
  Sample-Added-12
  Sample-Added-13
  Sample-Added-14
++<<<<<<< HEAD
 +Sample-Added-18
 +Sample-Added-19
++=======
+ Sample-Added-110
++>>>>>>> d10f934 (message10)

※Gitは明確に分かる場合以外は、無理をしてまでコンフリクトを解消しようとはしない。

(※コンフリクトを手動で解消)
echo Sample-Added-11 > test1.txt
echo Sample-Added-12 >> test1.txt
echo Sample-Added-13 >> test1.txt
echo Sample-Added-14 >> test1.txt
echo Sample-Added-18 >> test1.txt
echo Sample-Added-19 >> test1.txt
echo Sample-Added-110 >> test1.txt
type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-13
Sample-Added-14
Sample-Added-18
Sample-Added-19
Sample-Added-110

git add .
git status -s
↓
結果: 
M  test1.txt
A  test10.txt

git cherry-pick --continue --no-edit
↓
結果: 
[branch2 7fdeb04] message10
 Date: Sun Jan 1 19:07:22 2023 +0900
 2 files changed, 2 insertions(+)
 create mode 100644 test10.txt

git log --oneline --graph --all
↓
結果: 
* 7fdeb04 (HEAD -> branch2) message10
* b838160 message9
* c68ef01 message8
| *   135f847 (branch1) Merge branch 'master' into branch1
| |\
| | * 60b0341 (master) message12
| | * 045a734 message11
| | * d10f934 message10
| |/
|/|
| * 2495cae message7
|/
* 94996a0 message4
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

(※もう1つ、masterのmessage12をbranch2へチェリーピックしてみる)

git show 60b0341 --oneline
↓
結果: 
60b0341 (master) message12
diff --git a/test10.txt b/test10.txt
index 166cf2a..002832f 100644
--- a/test10.txt
+++ b/test10.txt
@@ -1,2 +1,3 @@
 Sample-Added-1010
 Sample-Added-1011
+Sample-Added-1012

※チェリーピック(つまみぐい)という部分的なマージ方法
git cherry-pick 60b0341
↓
結果: 
Auto-merging test10.txt
CONFLICT (content): Merge conflict in test10.txt
error: could not apply 60b0341... message12

git status -s
↓
結果: 
UU test10.txt

git diff
↓
結果: 
diff --cc test10.txt
index 128c764,002832f..0000000
--- a/test10.txt
+++ b/test10.txt
@@@ -1,1 -1,3 +1,6 @@@
  Sample-Added-1010
++<<<<<<< HEAD
++=======
+ Sample-Added-1011
+ Sample-Added-1012
++>>>>>>> 60b0341 (message12)

※Gitは明確に分かる場合以外は、無理をしてまでコンフリクトを解消しようとはしない。

(※コンフリクトを手動で解消)
echo Sample-Added-1010 > test10.txt
echo Sample-Added-1012 >> test10.txt
type test1.txt
↓
結果: 
Sample-Added-1010
Sample-Added-1012

git add .
git status -s
↓
結果: 
M  test10.txt

git cherry-pick --continue --no-edit
↓
結果: 
[branch2 f3ef64d] message12
 Date: Sun Jan 1 20:00:00 2023 +0900
 1 file changed, 1 insertion(+)

git log --oneline --graph --all
↓
結果: 
* f3ef64d (HEAD -> branch2) message12
* 7fdeb04 message10
* b838160 message9
* c68ef01 message8
| *   135f847 (branch1) Merge branch 'master' into branch1
| |\
| | * 60b0341 (master) message12
| | * 045a734 message11
| | * d10f934 message10
| |/
|/|
| * 2495cae message7
|/
* 94996a0 message4
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

git log branch2..master --oneline
↓
結果: 
60b0341 (master) message12
045a734 message11
d10f934 message10

(※チェリーピックしたコミットmessage10・message12は異なるSHA値となる)
(※チェリーピックしたコミットmessage10・message12は、branch2..masterのlog表示時に、除外されるわけではない)

git log master..branch2 --oneline
↓
結果: 
f3ef64d (HEAD -> branch2) message12
7fdeb04 message10
b838160 message9
c68ef01 message8
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。