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