pull –rebase

git pull と git pull –rebase の違いって?図を交えて説明します! – KRAY Inc.

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 pullfetch + merge
  • --rebasefetch + rebase

git pull --rebase origin main

最後の最後でつまづいた

  • とても分かりやすい説明で理解も進んだものの、本題の「git pull と git pull --rebase の違い」の章で「?」となってしまった
  • 落ち着いて考えると ↓ の図になるということ(だと思う)

実際にやってみる

  • メインブランチ、トピックブランチそれぞれでコミットがある状態を作っておく
% gl      
* 7d0e1a8 (HEAD -> dev) dev 1
* 35a1131 (main) main 1
* 088c790 first commit
  1. メインブランチをチェックアウト
  2. メインブランチのファイルを修正(メインブランチにあるファイル差分を、トピックブランチより進めた状態にしておく)
  3. リモートリポジトリにプッシュ
% 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'.
  1. トピックブランチをチェックアウト
  2. リモートリポジトリから 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 つ分のコミットがある
  2. メインブランチでコミットが 1 つ進む
  3. その状態を取り込んだ先に、トピックブランチの内容を rebase した
% gl
* c079dad (HEAD -> dev) dev 1
* 6ecf3c7 (origin/main, main) edit main.txt
* 35a1131 main 1
* 088c790 first commit