web-dev-qa-db-ja.com

git pull VS git fetch git rebase

別の質問git pullgit fetch + git mergeのようなものだと言いました。

しかし、git pull VS git fetch + git rebaseの違いは何ですか?

279
michael

git mergegit rebaseの違いについて質問しているだけであることは、あなたの質問からかなり明白なはずです。

あなたがよくあるケースだとしましょう-masterブランチでいくつかの作業を行い、Originから引き出します。これもいくつかの作業を行いました。取得後、次のようになります。

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (Origin/master)

この時点でマージする場合(git pullのデフォルトの動作)、競合がないと仮定すると、次のようになります。

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (Origin/master)

一方、適切なリベースを実行すると、次のようになります。

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (Origin/master)

どちらの場合も、作業ツリーの内容は同じになるはずです。それまでの異なる履歴を作成したばかりです。リベースは履歴を書き換え、最初にコミットした場所(R)ではなく、Originの新しいマスターブランチ(H)でコミットしたかのように表示します。マスターブランチから他の誰かが既にプルしている場合は、リベースアプローチを使用しないでください。

最後に、設定パラメーターgit pullをtrueに設定することで、マージの代わりにリベースを使用するように、特定のブランチのbranch.<name>.rebaseを実際に設定できることに注意してください。 git pull --rebaseを使用して、1回のプルでこれを行うこともできます。

328
Cascabel

TLDR:

git pullget fetchを実行してからgit mergeを実行するようなものです
git pull --rebasegit fetchのようなもので、次にgit rebaseのようなものです

最初の声明への返信で、

git pullgit fetch + git mergeに似ています。

「デフォルトモードでは、git pullはgit fetchの省略形であり、その後にgit merge FETCH_HEADが続きます」正確には、git pullは指定されたパラメーターでgit fetchを実行し、git mergeを呼び出して、取得したブランチヘッドを現在のブランチにマージします。

(参照: https://git-scm.com/docs/git-pull


2番目のステートメント/質問:

'しかし、git pull VS git fetch + git rebaseの違いは何ですか'

繰り返しますが、同じソースから:
git pull --rebase

「--rebaseを使用すると、git mergeではなくgit rebaseが実行されます。」


今、あなたが尋ねたいなら

'mergerebaseの違い'

ここでも回答されています:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(バージョン履歴の記録方法を変更する場合としない場合の違い)

3
harshvchawla