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