[Git] 動作を試す 実行例60：diffで作業内容をテキスト形式にまとめて別送付する

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

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

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

# 実行例

※Pro Git本
5.3 Git での分散作業 - プロジェクトの運営 メールで受け取ったパッチの適用
https://git-scm.com/book/ja/v2/Git-%E3%81%A7%E3%81%AE%E5%88%86%E6%95%A3%E4%BD%9C%E6%A5%AD-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%81%8B%E5%96%B6#r_patches_from_email

Git で変更を patch ファイルにする / patch コマンドで適用する - Qiita
https://qiita.com/sea_mountain/items/7d9c812e68a26bd1a292

```
(※試行用にlocal-repo3を作成)

cd /test-space
mkdir local-repo3
cd /test-space/local-repo3

git init
git remote add origin "D:/test-space/remote-repo1.git"

git fetch origin

git log --oneline --graph --all
↓
結果: 
* 1247fa9 (origin/master) message R4
* fab68d8 (origin/branch-R2) message R3
* c69a305 message R1
* 94996a0 message4
| * e009b2d (origin/branch-R1) message R2
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

(※コミット履歴状況を確認)

cd /test-space/local-repo2
git log --oneline --graph --all
↓
結果: 
* d67f7ab (HEAD -> branch-R1) message S3
*   ed2b786 Merge branch 'master' into branch-R1
|\
| * c69a305 (origin/master, master) message R1
| * 94996a0 message4
* | 09f2860 message S2
* | 6bbd0ed message S1
* | e009b2d (origin/branch-R1) message R2
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

(※local-repo2の変更内容1つを、local-repo3へ送付して反映)

cd /test-space/local-repo2
git checkout branch-R1

※diffの差分をテキストファイルに書込む
git diff e009b2d > test1.diff.patch
type test1.diff.patch
↓
結果: 
diff --git a/test1.txt b/test1.txt
index f4e41fe..7936a9a 100644
--- a/test1.txt
+++ b/test1.txt
@@ -1,4 +1,9 @@
 Sample-Added-11
 Sample-Added-12
 Sample-Added-13
+Sample-Added-14
+Sample-Added-R1
 Sample-Added-R2
+Sample-Added-S1
+Sample-Added-S2
+Sample-Added-S3
diff --git a/test4.txt b/test4.txt
new file mode 100644
index 0000000..d42c59e
--- /dev/null
+++ b/test4.txt
@@ -0,0 +1 @@
+Sample-Added-41

git show e009b2d:test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-13
Sample-Added-R2

git show branch-R1:test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-13
Sample-Added-14
Sample-Added-R1
Sample-Added-R2
Sample-Added-S1
Sample-Added-S2
Sample-Added-S3

(※diff出力は、e009b2dの状態からbranch-R1までの変更分全てになっている)

(※一旦削除)
del *.patch

dir /b
↓
結果: 
test1.txt
test2.txt
test4.txt

※diffの差分をテキストファイルに書込む (1つのコミット履歴だけ)
git diff e009b2d..6bbd0ed > test1.diff.patch
type test1.diff.patch
↓
結果: 
diff --git a/test1.txt b/test1.txt
index f4e41fe..2374ac8 100644
--- a/test1.txt
+++ b/test1.txt
@@ -2,3 +2,4 @@ Sample-Added-11
 Sample-Added-12
 Sample-Added-13
 Sample-Added-R2
+Sample-Added-S1

(※「Sample-Added-S1」1行の追加分だけになっている、OK)

-----

(※format-patchの出力と比較すると)

※作業内容をpatchテキストファイルにまとめる (1つのコミット履歴だけ)
git format-patch e009b2d..6bbd0ed
↓
結果: 
0001-message-S1.patch

type 0001-message-S1.patch
↓
結果: 
From 6bbd0ed49e37456cf3c85d2eee32f4639413839f Mon Sep 17 00:00:00 2001
From: person1 <person1@abc.def>
Date: Sun Jan 1 20:10:00 2023 +0900
Subject: [PATCH] message S1

---
 test1.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/test1.txt b/test1.txt
index f4e41fe..2374ac8 100644
--- a/test1.txt
+++ b/test1.txt
@@ -2,3 +2,4 @@ Sample-Added-11
 Sample-Added-12
 Sample-Added-13
 Sample-Added-R2
+Sample-Added-S1
--
2.40.0.windows.1

(※「diff --git～」の部分の内容は、全く同じになっている)

-----

(※local-repo3でdiff差分テキストファイルを反映)

xcopy "D:\test-space\local-repo2\test1.diff.patch" "D:\test-space\local-repo3\test1.diff.patch"
cd /test-space/local-repo3
git checkout branch-R1

※diffの差分のpatchテキストファイルを適用
git apply test1.diff.patch
↓
結果: 
test1.diff.patch:9: trailing whitespace.
Sample-Added-S1
warning: 1 line adds whitespace errors.

type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-13
Sample-Added-R2
Sample-Added-S1

git status -s
↓
結果: 
 M test1.txt
?? test1.diff.patch

git diff
↓
結果: 
diff --git a/test1.txt b/test1.txt
index f4e41fe..2374ac8 100644
--- a/test1.txt
+++ b/test1.txt
@@ -2,3 +2,4 @@ Sample-Added-11
 Sample-Added-12
 Sample-Added-13
 Sample-Added-R2
+Sample-Added-S1

git log --oneline --graph --all
↓
結果: 
* 1247fa9 (origin/master) message R4
* fab68d8 (origin/branch-R2) message R3
* c69a305 message R1
* 94996a0 message4
| * e009b2d (HEAD -> branch-R1, origin/branch-R1) message R2
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

(※作業ディレクトリ内で、変更分が書換えられるのみ、「message S1」はコミット履歴に追加されない)

(※自分でコミットする必要がある)
git commit -a -m "message S1"
↓
結果: 
[branch-R1 44d0dcc] message S1
 1 file changed, 1 insertion(+)

git log --oneline --graph --all
↓
結果: 
* 44d0dcc (HEAD -> branch-R1) message S1
* e009b2d (origin/branch-R1) message R2
| * 1247fa9 (origin/master) message R4
| * fab68d8 (origin/branch-R2) message R3
| * c69a305 message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

(※誤った適用: 再度適用してみると)

※diffの差分のpatchテキストファイルを適用
git apply test1.diff.patch
↓
結果: 
test1.diff.patch:9: trailing whitespace.
Sample-Added-S1
error: patch failed: test1.txt:2
error: test1.txt: patch does not apply

git status -s
↓
結果: 
?? test1.diff.patch

(※エラーが発生、変更分は未適用となる)

(※誤った適用: 異なるブランチで適用してみると)
git checkout master
git apply test1.diff.patch
↓
結果: 
test1.diff.patch:9: trailing whitespace.
Sample-Added-S1
error: patch failed: test1.txt:2
error: test1.txt: patch does not apply

git status -s
↓
結果: 
?? test1.diff.patch

(※エラーが発生、変更分は未適用となる)

git checkout branch-R1

-----

(※.patch内の変更分とは離れた行で別の変更が既にある場合の、適用動作を見ると)

(※「message S1」のコミットを戻す)
git reset --hard e009b2d
git log --oneline --graph --all
↓
結果: 
* 1247fa9 (origin/master, master) message R4
* fab68d8 (origin/branch-R2) message R3
* c69a305 message R1
* 94996a0 message4
| * e009b2d (HEAD -> branch-R1, origin/branch-R1) message R2
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

(※.patch内の変更分とは離れた行で別の変更を加える)

type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-13
Sample-Added-R2

echo Sample-Added-11 > test1.txt
echo Sample-Added-**-MOD >> test1.txt
echo Sample-Added-**-MOD >> test1.txt
echo Sample-Added-12 >> test1.txt
echo Sample-Added-13 >> test1.txt
echo Sample-Added-R2 >> test1.txt
type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-**-MOD
Sample-Added-**-MOD
Sample-Added-12
Sample-Added-13
Sample-Added-R2

(※local-repo3で反映)

※diffの差分のpatchテキストファイルを適用
git apply test1.diff.patch
↓
結果: 
test1.diff.patch:9: trailing whitespace.
Sample-Added-S1
warning: 1 line adds whitespace errors.

type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-**-MOD
Sample-Added-**-MOD
Sample-Added-12
Sample-Added-13
Sample-Added-R2
Sample-Added-S1

(※別の行で変更があっても、適用成功、OK)

-----

(※.patch内の変更分とは離れた行で別の変更を加える: ケース2)

echo Sample-Added-**-MOD > test1.txt
echo Sample-Added-11-MOD >> test1.txt
echo Sample-Added-12 >> test1.txt
echo Sample-Added-13 >> test1.txt
echo Sample-Added-R2 >> test1.txt
type test1.txt
↓
結果: 
Sample-Added-**-MOD
Sample-Added-11-MOD
Sample-Added-12
Sample-Added-13
Sample-Added-R2

(※local-repo3で反映)

※diffの差分のpatchテキストファイルを適用
git apply test1.diff.patch
↓
結果: 
test1.diff.patch:9: trailing whitespace.
Sample-Added-S1
warning: 1 line adds whitespace errors.

type test1.txt
↓
結果: 
Sample-Added-**-MOD
Sample-Added-11-MOD
Sample-Added-12
Sample-Added-13
Sample-Added-R2
Sample-Added-S1

(※別の行で変更があっても、適用成功、OK)

-----

(※.patch内の変更分とは離れた行で別の変更を加える: ケース3)

echo Sample-Added-**-MOD > test1.txt
echo Sample-Added-11-MOD >> test1.txt
echo Sample-Added-12-MOD >> test1.txt
echo Sample-Added-13 >> test1.txt
echo Sample-Added-R2 >> test1.txt
type test1.txt
↓
結果: 
Sample-Added-**-MOD
Sample-Added-11-MOD
Sample-Added-12-MOD
Sample-Added-13
Sample-Added-R2

(※local-repo3で反映)

※diffの差分のpatchテキストファイルを適用
git apply test1.diff.patch
↓
結果: 
test1.diff.patch:9: trailing whitespace.
Sample-Added-S1
error: patch failed: test1.txt:2
error: test1.txt: patch does not apply

type test1.txt
↓
結果: 
Sample-Added-**-MOD
Sample-Added-11-MOD
Sample-Added-12-MOD
Sample-Added-13
Sample-Added-R2

(※この変更の場合はエラーが発生、適用不可)

-----

(※.patch内の変更分とは離れた行で別の変更を加える: ケース4)

echo Sample-Added-11 > test1.txt
echo Sample-Added-12 >> test1.txt
echo Sample-Added-**-MOD >> test1.txt
echo Sample-Added-**-MOD >> test1.txt
echo Sample-Added-13 >> test1.txt
echo Sample-Added-R2 >> test1.txt
type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-**-MOD
Sample-Added-**-MOD
Sample-Added-13
Sample-Added-R2

(※local-repo3で反映)

※diffの差分のpatchテキストファイルを適用
git apply test1.diff.patch
↓
結果: 
test1.diff.patch:9: trailing whitespace.
Sample-Added-S1
error: patch failed: test1.txt:2
error: test1.txt: patch does not apply

type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-**-MOD
Sample-Added-**-MOD
Sample-Added-13
Sample-Added-R2

(※この変更の場合はエラーが発生、適用不可)

(※.patch内に書かれた差分周りの行(前3行分)に全く変更がなければ、適用可能となる模様)

-----

(※「message S1」のコミットを戻す)
git reset --hard e009b2d
git log --oneline --graph --all
↓
結果: 
* 1247fa9 (origin/master, master) message R4
* fab68d8 (origin/branch-R2) message R3
* c69a305 message R1
* 94996a0 message4
| * e009b2d (HEAD -> branch-R1, origin/branch-R1) message R2
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

(※削除)
del *.patch

-----

(※local-repo2のマージ入り・複数の変更内容を、local-repo3へ送付して反映)

cd /test-space/local-repo2

(※始めに削除)
del *.patch

※diffの差分をテキストファイルに書込む (複数のコミット履歴)
git diff e009b2d..ed2b786 > test2.diff.patch
type test2.diff.patch
↓
結果: 
diff --git a/test1.txt b/test1.txt
index f4e41fe..61da64e 100644
--- a/test1.txt
+++ b/test1.txt
@@ -1,4 +1,8 @@
 Sample-Added-11
 Sample-Added-12
 Sample-Added-13
+Sample-Added-14
+Sample-Added-R1
 Sample-Added-R2
+Sample-Added-S1
+Sample-Added-S2
diff --git a/test4.txt b/test4.txt
new file mode 100644
index 0000000..d42c59e
--- /dev/null
+++ b/test4.txt
@@ -0,0 +1 @@
+Sample-Added-41

(※マージのコミット履歴も含まれている)

-----

(※local-repo3でdiff差分テキストファイルを反映)

xcopy "D:\test-space\local-repo2\test2.diff.patch" "D:\test-space\local-repo3\test2.diff.patch"
cd /test-space/local-repo3
git checkout branch-R1

git log --oneline --graph --all
↓
結果: 
* 1247fa9 (origin/master, master) message R4
* fab68d8 (origin/branch-R2) message R3
* c69a305 message R1
* 94996a0 message4
| * e009b2d (HEAD -> branch-R1, origin/branch-R1) message R2
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

※diffの差分のpatchテキストファイルを適用
git apply test2.diff.patch
↓
結果: 
test2.diff.patch:9: trailing whitespace.
Sample-Added-14
test2.diff.patch:10: trailing whitespace.
Sample-Added-R1
test2.diff.patch:12: trailing whitespace.
Sample-Added-S1
test2.diff.patch:13: trailing whitespace.
Sample-Added-S2
test2.diff.patch:20: trailing whitespace.
Sample-Added-41
warning: 5 lines add whitespace errors.

type test1.txt
↓
結果: 
Sample-Added-11
Sample-Added-12
Sample-Added-13
Sample-Added-14
Sample-Added-R1
Sample-Added-R2
Sample-Added-S1
Sample-Added-S2

git status -s
↓
結果: 
 M test1.txt
?? test2.diff.patch
?? test4.txt

git diff
↓
結果: 
diff --git a/test1.txt b/test1.txt
index f4e41fe..61da64e 100644
--- a/test1.txt
+++ b/test1.txt
@@ -1,4 +1,8 @@
 Sample-Added-11
 Sample-Added-12
 Sample-Added-13
+Sample-Added-14
+Sample-Added-R1
 Sample-Added-R2
+Sample-Added-S1
+Sample-Added-S2

(※自分でコミットする必要がある)
git add test4.txt
git commit -a -m "message S1+S2+Merge"
↓
結果: 
[branch-R1 570259b] message S1+S2+Merge
 2 files changed, 5 insertions(+)
 create mode 100644 test4.txt

git log --oneline --graph --all
↓
結果: 
* 570259b (HEAD -> branch-R1) message S1+S2+Merge
* e009b2d (origin/branch-R1) message R2
| * 1247fa9 (origin/master, master) message R4
| * fab68d8 (origin/branch-R2) message R3
| * c69a305 message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

(※マージ入り・複数の変更内容を送付して適用することが可能、OK)
(※ただし、自分でコミットする為、元のリポジトリlocal-repo2とは、異なるコミットSHA値になっていく)

-----

(※local-repo2を元に戻す)

cd /test-space/local-repo2
git checkout master
git branch -D branch-R1 branch-S1
git log --oneline --graph --all
↓
結果: 
* e009b2d (origin/branch-R1) message R2
| * c69a305 (HEAD -> master, origin/master) message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

(※削除)
del *.patch

-----

(※local-repo3を削除)
cd /test-space
rd /s /q "/test-space/local-repo3"

```

# 環境

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