LoginSignup
0
0

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

Posted at

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

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

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

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

実行例

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

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