私はこれを理解できません。私はウェブや本でたくさん読んでいて、何かが頭に残っていません。誰かが私に次のダミーバージョンを教えてもらえますか?
- git fetch vs pull
- git merge vs rebase
私はこれを理解できません。私はウェブや本でたくさん読んでいて、何かが頭に残っていません。誰かが私に次のダミーバージョンを教えてもらえますか?
回答:
fetch
リモート*ブランチから変更をダウンロードし、リポジトリデータを更新しますが、ローカル*ブランチは変更しません。
pull
を実行しfetch
、さらにmerge
ローカルブランチに変更を加えます。
違いは何ですか? pull
プルされたブランチからの変更でローカルブランチを更新します。A fetch
はローカルブランチを進めません。
次の履歴があるとします。
C --- D --- Eローカル / A --- B --- F --- Gリモート
merge
2つの開発履歴を結合します。これは、リモートブランチの上に分岐した後にローカルブランチで発生した変更を再生し、その結果を新しいコミットに記録することによって行われます。この操作では、各コミットの祖先が保持されます。
aの効果はmerge
次のとおりです。
C --- D --- Eローカル / \ A --- B --- F --- G --- Hリモート
rebase
ローカルブランチに存在するコミットを取り、リモートブランチの上にそれらを再適用します。この操作は、ローカルコミットの祖先を書き換えます。
aの効果はrebase
次のとおりです。
C '-D'-E 'ローカル / A --- B --- F --- Gリモート
違いは何ですか?A merge
はコミットの祖先を変更しません。Aは、rebase
ローカルのコミットの祖先を書き換えます。
*
この説明は、現在のブランチをローカルブランチであることを前提とし、分岐が引数として指定されていることfetch
、pull
、merge
、またはrebase
リモートブランチです。これは通常のケースです。pull
たとえば、指定したブランチから変更をダウンロードし、リポジトリとmerge
変更を現在のブランチに更新します。
フェッチとプル
Gitフェッチはリポデータを更新するだけですが、Gitプルは基本的にフェッチを実行し、プルされたブランチをマージします
「git pull」と「git fetch」の違いは何ですか?
マージとリベース
Atlassian SourceTreeブログ、マージまたはリベースから:
マージは、各コミット履歴の祖先を維持しながら、2つの開発ラインを統合します。
対照的に、リベースは、ソースブランチからの変更を書き直して宛先ブランチの子として表示することにより、開発ラインを統合します。これらのコミットが宛先ブランチの上にずっと書き込まれたように見せかけます。
また、Learn Git Branchingもチェックしてください。これは、HackerNews(postへのリンク)に投稿されたばかりの素晴らしいゲームで、分岐とマージの多くのトリックを教えています。私はそれがこの問題で非常に役立つと信じています。
git merge <remote>/<branch>
。たとえば、自分がマスターブランチで、リモートがoriginという名前の場合、次のようにできますgit merge origin/master
。
プル対フェッチ:
私がこれを理解する方法は、それgit pull
は単にがgit fetch
続くことgit merge
です。つまり、リモートブランチから変更をフェッチし、それを現在のブランチにマージします。
マージとリベース:
コマンドが言うようにマージは行います。現在のブランチと指定されたブランチの違いを(現在のブランチに)マージします。つまり、コマンドgit merge another_branch
はanother_branch
現在のブランチにマージされます。
リベースの動作は少し異なり、ちょっとクールです。コマンドを実行するとしますgit rebase another_branch
。Gitはまず、現在のブランチとの間の最新の共通バージョンを見つけますanother_branch
。つまり、分岐が分岐する前のポイント。次に、gitはこの分岐点をの先頭に移動しanother_branch
ます。最後に、元の分岐点以降の現在のブランチのすべてのコミットが、新しい分岐点から再生されます。これにより、ブランチとマージが少なくなり、非常にクリーンな履歴が作成されます。
ただし、落とし穴がないわけではありません。バージョン履歴は「書き換え」られるため、ローカルgitリポジトリにのみコミットが存在する場合にのみ、これを行う必要があります。それは次のとおりです。決してあなたがリモートレポにコミットをプッシュしている場合は、これを行いません。
このオンラインブックで説明されているリベースの説明は、わかりやすいイラストで非常にわかりやすくなっています。
マージではなくリベースでプルする
私は実際にはリベースをかなり使用していますが、通常はプルと組み合わせています:
git pull --rebase
リモートの変更をフェッチし、マージではなくリベースします。つまり、最後にプルを実行したときからのローカルコミットをすべて再生します。これは、マージで通常のプルを実行するよりもはるかにクリーンだとわかります。マージを使用すると、追加のコミットが作成されます。
マージ -HEADブランチは新しいコミットを生成し、各コミット履歴の祖先を保持します。同じブランチで並行して作業する複数の人がマージコミットを行うと、履歴が汚染される可能性があります。
リベース -新しいコミットを作成せずに、ブランチの変更を別のブランチに再書き込みします。コード履歴は単純化され、線形で読みやすくなっていますが、プルリクエストでは機能しません。誰かが行った小さな変更を確認できないためです。
git merge
機能ベースのワークフローを扱う場合、またはリベースに慣れていない場合に使用します。しかし、よりクリーンで線形の履歴git rebase
が必要な場合は、その方が適切です。詳細については、このマージまたはリベースの記事を確認してください。