fetch
- 「リモートのコピーをローカルにダウンロードする」コマンド
- ローカルのリモート追跡ブランチ(リモートのコピー置き場)にコピーしてくるだけなのでワーキングツリーには影響しない
- 「リモート追跡ブランチ」とはあくまでリモートの状態を示すもので、ユーザー自身がこのブランチの内容を変更することはできない
- 内容の確認はできる
- リモートの状態は自動的に反映されるわけではなく、
git fetch
で明示的に行う必要がある
- 「リモート追跡ブランチ」とはあくまでリモートの状態を示すもので、ユーザー自身がこのブランチの内容を変更することはできない
リモートリポジトリのブランチをマージする場合
リモートの master ブランチをマージするには以下のコマンドを実行
git fetch # 先にリモートの状態をリモート追跡ブランチにコピー
git merge origin/main # リモートのコピーからマージ
↑ を一度に実行するのが pull
Git pullを使うべきでない
git fetchとgit mergeとgit rebaseだけですべての用は足せます。
Git pullを使うべきでない3つの理由 · DQNEO日記
「Git pullを使うべきでない」は少し極端な表現?とも思ったが、初心者(僕)ほど pull は、「fetch と merge のコンビである」ということをしっかり理解した方が良いと思った
pull
git fetch && git merge origin/main
は、git pull origin main
と同じ
git pull --rebase
git pull
はfetch + merge
--rebase
はfetch + rebase
git pull --rebase origin main
最後の最後でつまづいた
- とても分かりやすい説明で理解も進んだものの、本題の「git pull と git pull --rebase の違い」の章で「?」となってしまった
- 落ち着いて考えると ↓ の図になるということ(だと思う)
実際にやってみる
- メインブランチ、トピックブランチそれぞれでコミットがある状態を作っておく
% gl
* 7d0e1a8 (HEAD -> dev) dev 1
* 35a1131 (main) main 1
* 088c790 first commit
- メインブランチをチェックアウト
- メインブランチのファイルを修正(メインブランチにあるファイル差分を、トピックブランチより進めた状態にしておく)
- リモートリポジトリにプッシュ
% gck main
Switched to branch 'main'
% vi main.txt
% ga .
% gc 'edit main.txt'
[main 6ecf3c7] edit main.txt
1 file changed, 1 insertion(+)
% grao https://github.com/htksn-git/pull-rebase.git
% gps -u origin main
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 699 bytes | 699.00 KiB/s, done.
Total 9 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/htksn-git/pull-rebase.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.
- トピックブランチをチェックアウト
- リモートリポジトリから
pull --rebase
でプルする
% gck dev
Switched to branch 'dev'
% g pull --rebase origin main
From https://github.com/htksn-git/pull-rebase
* branch main -> FETCH_HEAD
Successfully rebased and updated refs/heads/dev.
- ログを見たところ 1 本線でつながっているよう
- メイン / トピックブランチからそれぞれ 1 つ分のコミットがある
- メインブランチでコミットが 1 つ進む
- その状態を取り込んだ先に、トピックブランチの内容を rebase した
% gl
* c079dad (HEAD -> dev) dev 1
* 6ecf3c7 (origin/main, main) edit main.txt
* 35a1131 main 1
* 088c790 first commit