web-dev-qa-db-ja.com

フェッチせずにgit-pullをプレビューするにはどうすればよいですか?

それも可能ですか?

基本的に、リモートリポジトリがあり、そこから次のものを使用してプルします。

git pull

次に、このプルが何を変更するか(差分)を、自分の側に何も触れずにプレビューします。理由は、私が引っ張っているものは「良い」ものではないかもしれず、私のリポジトリを「ダーティ」にする前に他の誰かにそれを修正してほしいからです。

190
Milan Babuškov

git fetchを実行した後、git log HEAD..Origin/masterを実行して、最後の共通コミットとOriginのmasterブランチ間のログエントリを表示します。差分を表示するには、git log -p HEAD..Origin/masterを使用して各パッチを表示するか、git diff HEAD...Origin/master(2つではなく3つのドット)を使用して1つの差分を表示します。

フェッチを実行するとremoteブランチのみが更新され、yourブランチは更新されないため、通常、フェッチを元に戻す必要はありません。すべてのリモートコミットでプルとマージを行う準備ができていない場合は、git cherry-pickを使用して、必要な特定のリモートコミットのみを受け入れることができます。後で、すべてを取得する準備ができたら、git pullが残りのコミットにマージされます。

更新:git fetchの使用を避けたい理由が完全にはわかりません。 git fetchは、リモートブランチのローカルコピーを更新するだけです。このローカルコピーは、どのブランチとも関係がなく、コミットされていないローカル変更とは関係ありません。 git fetchをcronジョブで実行する人は聞いたことがあります。これは非常に安全だからです。 (しかし、私は通常、そうすることはお勧めしません。)

214
Greg Hewgill

git fetchがあなたが探しているものだと思います。

ローカルリポジトリのインデックスにコミットせずに、変更とオブジェクトをプルします。

それらは後でgit mergeとマージできます。

マニュアルページ

編集:さらなる説明

Git- SVNクラッシュコースから直接リンク

さて、リモートリポジトリから新しい変更をどのように取得しますか?それらを取得します:

git fetch http://Host.xz/path/to/repo.git/ 

この時点で、それらはリポジトリにあり、次を使用して調べることができます。

git log Origin 

変更を比較することもできます。 git log HEAD..Originを使用して、ブランチにない変更だけを確認することもできます。次に、それらをマージしたい場合-ちょうど:

git merge Origin

フェッチするブランチを指定しない場合、トラッキングリモートがデフォルトになります。

マニュアルページを読むことで、オプションとその使用方法を最もよく理解できます。

私は例と記憶によってこれをやろうとしていますが、現在テストするための箱はありません。以下をご覧ください:

git log -p //log with diff

フェッチはgit reset --hardlink )で元に戻すことができますが、ツリー内のコミットされていない変更はすべて失われます取得した変更も同様です。

42

リモートリポジトリからフェッチし、違いを確認してからプルまたはマージできます。

これは、Originというリモートリポジトリと、リモートブランチOrigin/masterを追跡するmasterというブランチの例です。

git checkout master                                                  
git fetch                                        
git diff Origin/master
git pull --rebase Origin master
18

私はそれを行うためにカスタムgitエイリアスを作成しました:

alias.changes=!git log --name-status HEAD..

それでこれを行うことができます:

$git fetch
$git changes Origin

これにより、mergeを実行する前に変更をプレビューするための素敵で簡単な方法が得られます。

7
Matthias

私はパーティーに遅刻するかもしれませんが、これは私をあまりにも長く悩ませたものです。私の経験では、作業コピーを更新してそれらの変更に対処するよりも、保留中の変更を確認したいです。

これは~/.gitconfigファイルに含まれます:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

現在のブランチをフェッチし、作業コピーとフェッチしたブランチとの差分をとります。したがって、git pullに伴う変更のみが表示されるはずです。

2
Andy P

これら2つのコマンドを使用すると、変更するファイルを確認できます。

  1. 最初にgit fetchを実行すると、次のような出力が得られます(出力の一部):

    ... 
     72f8433..c8af041開発-> Origin/develop 
     ...

この操作により、2つのコミットIDが得られます。1つ目は古いもの、2つ目は新しいものです。

  1. 次に、git diffを使用してこれら2つのコミットを比較します

    git diff 72f8433..c8af041 | grep "diff --git"

このコマンドは、更新されるファイルをリストします。

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

たとえば、app/controller/xxxx.phpおよびapp/view/yyyy.php 更新されます。

git diffを使用して2つのコミットを比較すると、更新されたすべてのファイルが変更された行で出力されますが、grepを使用すると、diff --gitを含む行のみが検索および取得されます出力から。

1
cowboycb