フェッチせずにgit-pullをプレビューする方法は?


204

可能ですか?

基本的に、リモートリポジトリがあり、そこから私は単に以下を使用してプルします。

git pull

ここで、私の側の何にも触れずに、このプルが何を変更するか(diff)をプレビューしたいと思います。その理由は、私が引っ張っているものが「良い」ものではない可能性があり、私のリポジトリを「ダーティ」にする前に誰かに修正して欲しいからです。


4
あなたの編集は奇妙です。「git fetch」を実行しても、作業ツリーは変更されないため、コミットされていないローカル変更があるかどうかは関係ありません。そして、それはあなたの作業ツリーに触れないので、取り消したいフェッチのどの部分が不明確なのでしょうか。
dkagedal 2008年

dkagedalに感謝します。Gitがどのように機能するかを完全に理解する前にこれを書きました。その編集を削除しました。
MilanBabuškov、2010年

回答:


233

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

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

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


ドキュメントを読んでいる間、「MYブランチとは何の関係もない」という部分を逃したと思います。ありがとう。
ミラノバブスコフ2008年

1
どういうわけかそれは私のために動作しません。私はgit diff HEAD ... origin / masterを試してみましたが、 'pull origin master'を実行すると、変更がフェッチされてマージされますが、まだ変更はリストされていません。git remote addを使用してリモートリポジトリをセットアップしたからですか?
screenm0nkey

@ screenm0nkey:わからない(詳細がわからない)。それでもわからない場合は、新しい質問を開いてこれについて尋ねることをお勧めします。
グレッグ

1
私にとって
有効

2
git diff ...@{u}同じであるとしてgit diff HEAD...origin/master、原点/マスターが上流分岐である場合
cambunctious

47

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)で元に戻すことができますが、ツリー内のコミットされていないすべての変更と、フェッチした変更は失われます。


2つのことを説明するなら、それは良いかもしれません:1.どうすればgit-fetchを元に戻すことができますか?2.どうやって差分を見ますか?
ミラノバブスコフ2008年

1
1)git-fetchを元に戻しますか?2)git diff HEAD..origin
Chris Vest

差分はクリスチャンが言ったように行われ、フェッチはgit reset --hardで元に戻すことができますが、ツリー内のコミットされていないすべての変更と、フェッチした変更は失われます。
Brian Gianforcaro 2008年

あなたは探していますgit reset --soft--mixed?マンページを確認してください。
アリストテレス・パガルツィス2008年

1
私が正しく理解していれば、「git fetch」を元に戻す必要はありません。作業コピーやリポジトリには影響しないためです。「git fetch」はオブジェクトと参照を.git / FETCH_HEADに格納します
Thorsten Niehues

21

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

これは、リモートoriginブランチが呼び出されmaster、リモートブランチを追跡するというブランチの例ですorigin/master

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

これを行うためのカスタムgitエイリアスを作成しました。

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

これであなたはこれを行うことができます:

$git fetch
$git changes origin

これにより、を実行する前に変更をプレビューする簡単で便利な方法が得られますmerge


あなたは神です。これはgit自体に含まれるはずです
Z. Khullah

3

これら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.phpapp / view / yyyy.phpが更新されます。

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


3

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

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

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

現在のブランチをフェッチしてから、作業コピーとこのフェッチされたブランチを比較します。したがって、に伴う変更のみが表示されgit pullます。


1
ref文字列を交換できますHEAD..@{u}か?これはより単純で、リモートに「origin」という名前を付ける必要はなく、ブランチにリモートと同じ名前を付ける必要もありません。
マイケル-どこですかクレイシャーキー

これはよくできたエイリアスですが、そもそもなぜこれをしたいのかわかりません。あなたはいつか変化に対処しなければならないでしょう?マージ処理git pullが気に入らない場合は、マージの一部を中止できるはずです。そのため、これのユースケースが何かはわかりません。
Marnen Laibow-Koser

ある時点で変更に対処する必要があることはわかっていますが、私が書いたように、たまにしたくない場合もあります。何かが壊れるかどうかを知りたいので、このためにさらに時間を確保する必要がありますgit pull。あるいは、後で行うことができるかどうかだけです。また、それはopの質問が何であったかだと思います。
アンディP

-1

git-fetchでローカル.gitを更新したくない場合は、ローカルリポジトリを一時ディレクトリにコピーし、そこでプルします。これがショルハンドです:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

例:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

'gtp'は、.gitが配置されているローカルリポジトリのルートで実行する必要があります。
AX Labs

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.