0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

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

※前回記事のリポジトリ状態からの続きになっています。

前回記事へ 目次へ:Git関連記事のまとめページ 次回記事へ

実行例

※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等は不使用。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?