web-dev-qa-db-ja.com

git rebase upstream / master vs git pull --rebase upstream master

git rebase upstream/mastergit pull --rebase upstream masterに違いはありますか?リモートは任意のリモートにすることができ、必ずしもアップストリームではありません。

40
Dennis

git pull --rebasefetch(git fetch を最初に更新し、upstream/masterコミットを更新します。

なし最初にupstream/masterを更新するだけでリベースした場合、同じ結果は得られません。

masterブランチと「Origin/master」が分岐したことを示します。「分岐を「分岐解除」する方法」


SnakEのコメントに記載されていますgit pull --rebaseちょうどgit fetch && git rebase Origin/masterではありません。
git pull --rebase」は何をしますか? 」を参照してください。

(Origin/master)
   |
A--B--C (master)
 \ 
  B'--D (actual Origin/master after changing B and force pushing)

この場合、git pull --rebaseが行うことは:

git fetch Origin
git rebase --onto Origin/master B master

ここに:

  • Origin/masterは新しく更新されたOrigin/masterB'
  • Bは古いOrigin/master(フェッチが更新する前)
  • masterは、Origin/masterの上で再生するブランチです

これは、git fetch + git rebase Origin/masterとは異なり、pull --rebaseコマンドは、どのコミットが本当にローカルコミットであり、以前のアップストリームからのものかを見つけようとしますフェッチ。

これを行うには、リモートトラッキングブランチのreflog(この場合はOrigin/master)を調べます。このreflogは、Originでの連続したgit fetch操作のヒントを「最新の最初」の順序で表します。

Reflogエントリごとに(Origin/master@{1}、次に...{2}など)、そのコミットが現在のブランチヘッドmasterの祖先であるかどうかをチェックします。見つかるとすぐに、それをリベースの開始点として選択します(上記の例ではB)。

41
VonC