[Git] 動作を試す 実行例61：checkoutで特定のフォルダ(サブモジュール等)だけを(上書き)マージする

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

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

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

# 実行例

Git 1ファイルだけ別のブランチから持ってくる
https://qiita.com/oret/items/b646fcada9d89ed308c4

Gitで特定のファイルだけをマージする
https://scrapbox.io/kijisaba-memo/Git%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A0%E3%81%91%E3%82%92%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%99%E3%82%8B
↓
引用: 
git checkout <ブランチ名> -- <ファイル名>
git checkout <ブランチ名> <ディレクトリ名>

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

-----

(※サブモジュール等が入ったフォルダを模擬的に作成)

git checkout branch-R1

mkdir sub1
cd sub1

echo Sample-Added-Sub11 > test1.sub.txt

mkdir sub2
cd sub2

echo Sample-Added-Sub21 > test2.sub.txt

cd ../../
git status -s
↓
結果: 
?? sub1/

git add .
git status -s
↓
結果: 
A  sub1/sub2/test2.sub.txt
A  sub1/test1.sub.txt

git commit -m "message Sub1"
git log --oneline --graph --all
↓
結果: 
* c8e3e2f (HEAD -> branch-R1) message Sub1
* 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

-----

(※別ブランチで前述で作成のフォルダを取り込む)

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

※特定のフォルダだけを別コミットから持ってきて全て上書き
git checkout branch-R1 sub1/sub2
↓
結果: 
Updated 1 path from e20afe5

tree /f
↓
結果: 
│  test1.txt
│  test2.txt
│  test4.txt
│
└─sub1
    └─sub2
            test2.sub.txt

(※内容を変更してみる)
echo Sample-Added-Sub22 >> sub1/sub2/test2.sub.txt
type "sub1\sub2\test2.sub.txt"
↓
結果: 
Sample-Added-Sub21
Sample-Added-Sub22

(※新規にファイルを追加してみる)
echo Sample-Added-Sub31 > sub1/sub2/test3.sub.txt

※特定のフォルダだけを別コミットから持ってきて全て上書き
git checkout branch-R1 sub1
↓
結果: 
Updated 1 path from e20afe5

tree /f
↓
結果: 
│  test1.txt
│  test2.txt
│  test4.txt
│
└─sub1
    │  test1.sub.txt
    │
    └─sub2
            test2.sub.txt
            test3.sub.txt

type "sub1\sub2\test2.sub.txt"
↓
結果: 
Sample-Added-Sub21

(※全て上書きされている)
(※新規に追加したファイルはそのまま残る)

git status -s
↓
結果: 
A  sub1/sub2/test2.sub.txt
A  sub1/test1.sub.txt
?? sub1/sub2/test3.sub.txt

git add .
git status -s
↓
結果: 
A  sub1/sub2/test2.sub.txt
A  sub1/sub2/test3.sub.txt
A  sub1/test1.sub.txt

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

-----

(※「message Sub1」分をマージした形になっているので、コミット履歴にマージ線だけ引きたい場合)

※全て自分側を優先して自分側の内容のままでマージ(ダミーでマージ済みとする用途)
git merge -s ours branch-R1
↓
結果: 
Merge made by the 'ours' strategy.

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

git diff d94cddb..e1c9dd0
↓
結果: 
(なし)

(※マージによる差分はなし)

(※「message Sub2」での差分を表示してみると)
git diff 1247fa9..e1c9dd0 --stat
 sub1/sub2/test2.sub.txt | 1 +
 sub1/sub2/test3.sub.txt | 1 +
 sub1/test1.sub.txt      | 1 +
 3 files changed, 3 insertions(+)

-----

(※サブモジュール等が入ったフォルダを模擬的に更新)

git checkout branch-R1

echo Sample-Added-Sub12 >> sub1/test1.sub.txt
echo Sample-Added-Sub41 > sub1/test4.sub.txt

git add .
git commit -a -m "message Sub3"
git log --oneline --graph --all
↓
結果: 
* b4f3924 (HEAD -> branch-R1) message Sub3
| *   e1c9dd0 (master) Merge branch 'branch-R1'
| |\
| |/
|/|
* | c8e3e2f message Sub1
* | e009b2d (origin/branch-R1) message R2
| * d94cddb message Sub2
| * 1247fa9 (origin/master) message R4
| * fab68d8 (origin/branch-R2) message R3
| * c69a305 message R1
| * 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

(※別ブランチで前述の変更を取り込む)

git checkout master

※そのまま残るファイルを無くす為に、一旦対象フォルダを全削除
rd /s /q "sub1"

※特定のフォルダだけを別コミットから持ってきて全て上書き
git checkout branch-R1 sub1
↓
結果: 
Updated 3 paths from d15145e

tree /f
↓
結果: 
│  test1.txt
│  test2.txt
│  test4.txt
│
└─sub1
    │  test1.sub.txt
    │  test4.sub.txt
    │
    └─sub2
            test2.sub.txt

(※新規に追加していたtest3.sub.txtファイルは消えている)

type "sub1\test1.sub.txt"
↓
結果: 
Sample-Added-Sub11
Sample-Added-Sub12

(※更新されている)

git status -s
↓
結果: 
 D sub1/sub2/test3.sub.txt
M  sub1/test1.sub.txt
A  sub1/test4.sub.txt

git add .
git status -s
↓
結果: 
D  sub1/sub2/test3.sub.txt
M  sub1/test1.sub.txt
A  sub1/test4.sub.txt

git commit -m "message Sub4"
git log --oneline --graph --all
↓
結果: 
* 32cc2bd (HEAD -> master) message Sub4
*   e1c9dd0 Merge branch 'branch-R1'
|\
* | d94cddb message Sub2
* | 1247fa9 (origin/master) message R4
* | fab68d8 (origin/branch-R2) message R3
* | c69a305 message R1
* | 94996a0 message4
| | * b4f3924 (branch-R1) message Sub3
| |/
| * c8e3e2f message Sub1
| * e009b2d (origin/branch-R1) message R2
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

※全て自分側を優先して自分側の内容のままでマージ(ダミーでマージ済みとする用途)
git merge -s ours branch-R1
↓
結果: 
Merge made by the 'ours' strategy.

git log --oneline --graph --all
↓
結果: 
*   dbbeed4 (HEAD -> master) Merge branch 'branch-R1'
|\
| * b4f3924 (branch-R1) message Sub3
* | 32cc2bd message Sub4
* | e1c9dd0 Merge branch 'branch-R1'
|\|
| * c8e3e2f message Sub1
| * e009b2d (origin/branch-R1) message R2
* | d94cddb message Sub2
* | 1247fa9 (origin/master) message R4
* | fab68d8 (origin/branch-R2) message R3
* | c69a305 message R1
* | 94996a0 message4
|/
* 20bbab7 message3
* 00cad71 message2
* 4ace194 message1

-----

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

# 環境

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