[Git] 動作を試す 実行例59：bundleで作業内容をバイナリファイルにまとめて別送付する

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

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

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

# 実行例

※Pro Git本 引用: Gitでは、データを「バンドルファイル」という1つのファイルにまとめられます。Gitでの作業内容をメールで送りたいけれど、40ものコミットをformat-patchを使って送りたくはない場合等。git pushコマンドで転送されるものと同じ内容のデータを単一のバイナリファイルにまとめてくれます。

git bundle create repo.bundle HEAD master
まとめたい対象を範囲指定されたコミットや参照の形で指定する
git bundle create commits.bundle master ^9a466c5

バンドルファイルを取り込むのに必要となる祖先が手元のリポジトリにあるかどうかを検査
git bundle verify ../commits.bundle

バンドルファイルのmasterブランチを、手元のリポジトリのother-masterブランチに取り込む
git fetch ../commits.bundle master:other-master

```
(※試行用に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

-----

(※バイナリファイルにまとめて、内容を見る)

※git pushで転送される内容と同じデータを単一のバイナリファイルにまとめる
git bundle create test1.bundle branch-R1
↓
結果: 
Enumerating objects: 33, done.
Counting objects: 100% (33/33), done.
Compressing objects: 100% (27/27), done.
Total 33 (delta 7), reused 0 (delta 0), pack-reused 0

(※中身を確認すると)

git clone test1.bundle
↓
結果: 
Cloning into 'test1'...
Receiving objects: 100% (33/33), done.
Resolving deltas: 100% (7/7), done.
warning: remote HEAD refers to nonexistent ref, unable to checkout

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

(※branch-R1ブランチの全てのコミット履歴がファイルにまとめられている)

(※削除)
cd ..
rd /s /q test1
del *.bundle

-----

※git pushで転送される内容と同じデータを単一のバイナリファイルにまとめる
git bundle create test1.bundle branch-R1 HEAD
↓
結果: 
Enumerating objects: 33, done.
Counting objects: 100% (33/33), done.
Compressing objects: 100% (27/27), done.
Total 33 (delta 7), reused 0 (delta 0), pack-reused 0

(※中身を確認すると)

git clone test1.bundle
↓
結果: 
Cloning into 'test1'...
Receiving objects: 100% (33/33), done.
Resolving deltas: 100% (7/7), done.

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

(※branch-R1ブランチの全てのコミット履歴がファイルにまとめられている)

git remote -v
↓
結果: 
origin  D:/test-space/local-repo2/test1.bundle (fetch)
origin  D:/test-space/local-repo2/test1.bundle (push)

git branch -a -vv
↓
結果: 
* branch-R1                d67f7ab [origin/branch-R1] message S3
  remotes/origin/HEAD      -> origin/branch-R1
  remotes/origin/branch-R1 d67f7ab message S3

(※originの設定も含まれている)

(※削除)
cd ..
rd /s /q test1
del *.bundle

-----

※git pushで転送される内容と同じデータを単一のバイナリファイルにまとめる
git bundle create test1.bundle e009b2d..ed2b786
↓
結果: 
fatal: Refusing to create empty bundle.

(※エラーになり、バンドルファイルが作成されない)

※git pushで転送される内容と同じデータを単一のバイナリファイルにまとめる
git bundle create test1.bundle e009b2d..branch-R1
↓
結果: 
Enumerating objects: 23, done.
Counting objects: 100% (23/23), done.
Compressing objects: 100% (18/18), done.
Total 19 (delta 5), reused 0 (delta 0), pack-reused 0

(※ブランチ等の何かの参照を含める必要がある模様)

※git pushで転送される内容と同じデータを単一のバイナリファイルにまとめる
git bundle create test1.bundle branch-R1 e009b2d..ed2b786
↓
結果: 
Enumerating objects: 23, done.
Counting objects: 100% (23/23), done.
Compressing objects: 100% (18/18), done.
Total 19 (delta 5), reused 0 (delta 0), pack-reused 0

(※中身を確認すると)

git clone test1.bundle
↓
結果: 
Cloning into 'test1'...
error: Repository lacks these prerequisite commits:
error: e009b2d7b8ca82fd2e2bdc1172408673d63fd8d7
error: 20bbab7d3d5cb79bec87d68941733d51fd72fd3c
fatal: remote transport reported error

(※一部のコミット履歴だけではリポジトリへクローンできないエラーが発生)

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

(※削除)
del *.bundle

-----

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

(※始めにブランチを付けて参照を作る)
git branch branch-S1 6bbd0ed

※git pushで転送される内容と同じデータを単一のバイナリファイルにまとめる
git bundle create test1.bundle e009b2d..branch-S1
↓
結果: 
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0

cd /test-space/local-repo3

※バンドルファイルを取り込むのに必要となる祖先が手元のリポジトリにあるかどうかを検査
git bundle verify /test-space/local-repo2/test1.bundle
↓
結果: 
/test-space/local-repo2/test1.bundle is okay
The bundle contains this ref:
6bbd0ed49e37456cf3c85d2eee32f4639413839f refs/heads/branch-S1
The bundle requires this ref:
e009b2d7b8ca82fd2e2bdc1172408673d63fd8d7
The bundle uses this hash algorithm: sha1

(※OKと表示↑)

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

※バンドルファイルを取り込む
git fetch /test-space/local-repo2/test1.bundle
↓
結果: 
fatal: couldn't find remote ref HEAD

(※未指定のブランチに対してfetchを行った為、エラーが発生)

※バンドルファイルの中に存在する取り込み可能なブランチを列挙
git bundle list-heads /test-space/local-repo2/test1.bundle
↓
結果: 
6bbd0ed49e37456cf3c85d2eee32f4639413839f refs/heads/branch-S1

※バンドルファイルの中にあるコミット履歴を取り込む
git bundle unbundle /test-space/local-repo2/test1.bundle
↓
結果: 
Unbundling objects: 100% (3/3), done.
Resolving deltas: 100% (1/1), completed with 1 local object.
6bbd0ed49e37456cf3c85d2eee32f4639413839f refs/heads/branch-S1

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

(※コミット履歴は変化なし、バンドルファイルから取り込んだコミット履歴にブランチ等の参照が何も付いていない為)

git show --oneline -s 6bbd0ed49e37456cf3c85d2eee32f4639413839f
↓
結果: 
6bbd0ed message S1

(※「message S1」のみをbundleした所、「message S1」のコミット履歴が取り込まれている)

(※「message S1」にブランチを付けてコミット履歴を可視化すると)
git branch branch-S1 6bbd0ed

git log --oneline --graph --all
↓
結果: 
* 6bbd0ed (branch-S1) 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

(※「message S1」のコミット履歴が取り込まれている)

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

(※「message S2」のコミット履歴を表示しようとすると)

git show --oneline -s 09f2860
↓
結果: 
fatal: ambiguous argument '09f2860': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

(※存在しておらず、バンドルファイルから取り込みなし)

-----

(※再度同じバンドルファイルを取り込むと)

※バンドルファイルの中にあるコミット履歴を取り込む
git bundle unbundle /test-space/local-repo2/test1.bundle
↓
結果: 
Unbundling objects: 100% (3/3), done.
Resolving deltas: 100% (1/1), completed with 1 local object.
6bbd0ed49e37456cf3c85d2eee32f4639413839f refs/heads/branch-S1

(※重複しても処理される模様)

-----

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

-----

(※試行用に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-repo3

※バンドルファイルの中にあるコミット履歴を取り込む ブランチを指定
git fetch /test-space/local-repo2/test1.bundle branch-S1
↓
結果: 
Receiving objects: 100% (3/3), done.
Resolving deltas: 100% (1/1), completed with 1 local object.
From /test-space/local-repo2/test1.bundle
 * branch            branch-S1  -> FETCH_HEAD

git show --oneline -s 6bbd0ed
↓
結果: 
6bbd0ed message S1

git show --oneline -s 09f2860
↓
結果: 
fatal: ambiguous argument '09f2860': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

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

(※コミット履歴は変化なし、バンドルファイルから取り込んだコミット履歴にブランチ等の参照が何も付いていない為)

(※「message S1」にブランチを付けてコミット履歴を可視化すると)
git branch branch-S1 6bbd0ed

git log --oneline --graph --all
↓
結果: 
* 6bbd0ed (branch-S1) 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

(※「message S1」のコミット履歴が取り込まれている)

-----

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

-----

(※試行用に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-repo3

※バンドルファイルの中にあるコミット履歴を取り込む ブランチ名を変更する指定
git fetch /test-space/local-repo2/test1.bundle branch-S1:branch-S1
↓
結果: 
Receiving objects: 100% (3/3), done.
Resolving deltas: 100% (1/1), completed with 1 local object.
From /test-space/local-repo2/test1.bundle
 * [new branch]      branch-S1  -> branch-S1

git show --oneline -s 6bbd0ed
↓
結果: 
6bbd0ed (branch-S1) message S1

git show --oneline -s 09f2860
↓
結果: 
fatal: ambiguous argument '09f2860': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

git log --oneline --graph --all
↓
結果: 
* 6bbd0ed (branch-S1) 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

(※branch-S1ブランチが付けられていて、コミット履歴にも表示される)

-----

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

-----

(※試行用に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

-----

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

cd /test-space/local-repo2

※git pushで転送される内容と同じデータを単一のバイナリファイルにまとめる
git bundle create test2.bundle e009b2d..branch-R1
↓
結果: 
Enumerating objects: 23, done.
Counting objects: 100% (23/23), done.
Compressing objects: 100% (18/18), done.
Total 19 (delta 5), reused 0 (delta 0), pack-reused 0

cd /test-space/local-repo3

※バンドルファイルを取り込むのに必要となる祖先が手元のリポジトリにあるかどうかを検査
git bundle verify /test-space/local-repo2/test2.bundle
↓
結果: 
/test-space/local-repo2/test2.bundle is okay
The bundle contains this ref:
d67f7ab821fc6d37a369d42d5ec8568fe89d5ab4 refs/heads/branch-R1
The bundle requires these 2 refs:
e009b2d7b8ca82fd2e2bdc1172408673d63fd8d7
20bbab7d3d5cb79bec87d68941733d51fd72fd3c
The bundle uses this hash algorithm: sha1

(※OKと表示↑)

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

※バンドルファイルの中にあるコミット履歴を取り込む ブランチ名を変更する指定
git fetch /test-space/local-repo2/test2.bundle branch-R1:branch-R1
↓
結果: 
Receiving objects: 100% (19/19), done.
Resolving deltas: 100% (5/5), done.
From /test-space/local-repo2/test2.bundle
 * [new branch]      branch-R1  -> branch-R1

git log --oneline --graph --all
↓
結果: 
* d67f7ab (branch-R1) message S3
*   ed2b786 Merge branch 'master' into branch-R1
|\
* | 09f2860 message S2
* | 6bbd0ed 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

(※バンドルファイルからマージ入り・複数の変更内容を取り込み可能)

-----

(※削除)
del *.bundle

-----

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

# 環境

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