2013-08-18 6 views
7

私は$git push origin masterを使用していくつかのコードをプッシュしようとしているが、私はその後、$ git diff master origin/master$ git fetch origin masterをした私は2つのレポの間で異なっていたすべてのファイルと変更のリストを持っエラー最後のgit pullからリモートリポジトリのどのファイルが変更されたかを知るには?

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'https://github.com/' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

を取得します。しかし私はリモートリポジトリと最後にローカルボックスに$ git pull origin masterを行ったときに変更されたファイルのリストにのみ興味があります。

これを行う方法はありますか?

答えて

2
git diff --stat master origin/master 
+0

これは実際にあなたの現在のコミット( 'master')とそれらのもの(' origin/master')を比較します。これはまったく同じことではありません。 – torek

6

git pullgit merge(又はgit rebase)続いgit fetchと同じです。

git fetchは、refがどこで更新されたかを示します。これは、それがa8e5e4eにあったあなたフェッチされたマスターは、今では295bf31である最後の時間を意味

a8e5e4e..295bf31 master  -> origin/master 

:それは次のように表示されます。 次のようなもので変更されたファイルを見ることができます:

git diff --name-status a8e5e4e..295bf31 

しかし、多分もっと面白いgitk master...origin/masterの出力は、フェッチした後です。このようにして、あなた側の変更と元の側の変更の両方を検査することができます。

+0

--name-statusを指定すると、ファイル名だけを表示し、違いは表示しないように--name-onlyも必要であることがわかりました。 – bgoodr

4

michas' answerは、尋ねられた質問のための正しいものです。

古くなったref:a8e5e4eの部分がa8e5e4e..295bf31 master -> origin/masterの場合はどうなりますか?おそらくあなたは実際に気にしないでしょう:彼が示唆したように、master...origin/masterを見ることはさらに興味深いことがあります。 しかし、この3ドットは実際には...の構文は何ですか平均

答えはgit rev-listドキュメントである:

別の特別な表記が マージするのに便利です<commit1>...<commit2>です。結果のコミットのセットは、2つのオペランドの間に対称の差 です。 ...

私はおそらく十分な言い回しが混乱していると思っています(実際にはかなり異なる意味を使用しています)。しかし、実際にはそれほど複雑ではありません。このように描くことができ、いくつかのコミットを考える

:あなたが持っている

master origin/master 

    E  G 
    |  | 
    D  F 
    \ /
     C 
     | 
     B 
     | 
     A 

何がコミットCで発散です。 masterorigin/masterの両方がCを指しているときに作業を開始しました。明らかに、あなたはDEをコミットし、 "彼ら"(彼らが誰であれ)はFGをコミットしました。ちなみにCマージベースと呼ばれています。

何を意味するのですか:私を見つけてCとし、左右の両方に "すべてそこから"私にすべてを渡してください。つまり、すべてのコミットはmasterorigin/masterの両方でコミットされますが、最初に会った時点でのコミットを除きます。

あなたがgitk master...origin/masterを実行する場合は、ちょうどそれが表示されます:すべてのコミットあなた作ら、と彼らは行われたすべてのコミット。しかし、git diff flags master...origin/masterを実行した場合、git diffはこれをほとんどスローします。代わりに、マージベースC、を見つけ、右側の名前と比較します。

masterブランチを使用しているとします(HEADはとにかく「マスター」を意味します)。これをさらに短縮することができます。あなたとその枝が分岐するのでどのファイルを参照するには、彼らは単に実行し、修正:

$ git diff --stat ...origin/master # or --name-status, etc 

名を残すにはHEADを意味し、これはmaster...origin/masterと同じであるHEAD...origin/masterと同じです。

$ git diff --stat '[email protected]{u}' 

を(引用符を保護するために、次のとおりです。あなたが実行できるように

あなたのgitが十分に新しい場合

は、@{u}は、「現在のブランチの上流分岐」(すなわち、masterから、origin/masterを見つける。)を指しシェルからの中カッコ;あなたの特定のシェルでは必要ないかもしれません)。

$ git log --graph --boundary ...origin/master 
:これは、あなたがgitkを持っていない場合は、してみてください


など、あなたがその上流、またはその上流などorigin/featureXfeatureXとしてorigin/developdevelopにしている場合でも動作します

(または上記のように'[email protected]{u}')。マージコミットを含めるには--boundaryが必要です。 --oneline --decorateを追加することもできます。

実際gitkが、それは(これは、マージ拠点と全く同じではありませんコミットが、近いミーティングポイントを含めるように--boundaryを使用して、ちょうどある脚注1のコマンドのように、マージがあまりにもコミットを紹介します十分な)。

これは、正確に1つのマージベースコミットがあることを前提としています。これらの場合、それは真実であるはずです。したがって、git diffは、Cのツリーと、上流ブランチの先頭のGのツリーを比較します。あなたはおそらく任意の長いドライブで彼らが訪問した中間点にかかわらず、 "彼らがどこにあった"と彼らがどこにあったかを比較します。 :-)たとえば、コミットFがファイルthis/thatを追加してからコミットGを再度削除すると、そのファイルは表示されません。

関連する問題