git:ローカルリポジトリのファイルとオリジンの差分


190

ローカルリポジトリにあるファイルとにあるファイルの違いを見つけたいのですがorigin master

が存在することはわかっていますがgit diff、それをこの1つの特定のファイルに分離したいだけです。

簡単にするために、ファイルに名前が付けられfile1.txt、ローカルファイルパス=が[local_path]あり、元のファイルにはfilepath =があるとし[remote-path]ます。

入力する必要があるgitコマンドは何ですか?

編集:非常に洞察に満ちた入力をありがとうございました。Eclipseを使用している場合(私は以前述べたはずですが)、右クリック->比較->ブランチ、タグ、またはリファレンス->適切なバージョンを選択するだけで、すぐに使用できることがわかりました。


[リモートパス]は[ローカルパス]と異なりますか?
Code-Apprentice 2014年

私はあなたの編集に気づきました。回答として自由に投稿してください。
Code-Apprentice

「オリジンマスター」ってなんですか?

eclipse
egit

回答:


251

[remote-path][local-path]同じであれば、あなたはできる

$ git fetch origin master
$ git diff origin/master -- [local-path]

注1:上記の2番目のコマンドは、ローカルに保存されたリモート追跡ブランチと比較されます。リモートサーバーのコンテンツと同期するようにリモートトラッキングブランチを更新するには、fetchコマンドが必要です。あるいは、あなたはただ行うことができます

$ git diff master:<path-or-file-name>

注2: master上記の例では、任意のブランチ名に置き換えることができます


15
また、現在のディレクトリの場合は、ローカルパスを省略できます。
Tony Wall

19
私のような非常に初心者のために、ここに例があります:git diff master:README.md -- README.md
fabriciorissetto

24
実際、これはより良い例ですgit diff origin/master -- README.md
。– JDiMatteo

git fetch master代わりに使用することはできませんでしたgit fetch .(origin / masterも機能しませんでした)が、残りはうまくいきました。
2017年

1
@rob私の間違いを最初に指摘したのはあなたです。それはあるはずですgit fetch **origin**
Code-Apprentice

114

リモートファイルからローカルファイルへの差分を表示するには:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

反対方向の違いを表示するには:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

基本的に、この表記を使用して、任意の2つのファイルをどこでも比較できます。

git diff ref1:path/to/file1 ref2:path/to/file2

いつものように、ref1ref2ブランチ名、REMOTENAME / branchname、可能性などシャスを、コミット


17

ローカルリポジトリとリモートリポジトリを比較するには、次の構文を使用します。

git diff @{upstream}

2

そのために私はbashスクリプトを書きました:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

上記のスクリプトでは、リモートのメインブランチ(マスターブランチANYブランチは不要)をにフェッチしてからFETCH_HEAD、変更したファイルのみのリストを作成し、変更したファイルをと比較していますgit difftool

difftoolgit は多くのサポートを提供していますがMeld Diff Viewer、GUIを比較するために構成しました。
上記のスクリプトから、私は同じファイルで他のチームによってどのような変更が行われたかについて事前に知っています。これは、gitステージを実行する前にuntrack-->staged-->commit、リモートチームとのマージの競合を不必要に解決したり、新しいローカルブランチを作成してメインブランチで比較してマージしたりするのに役立ちます。


1

私はいくつかの解決策を試しましたが、私はこのように簡単な方法です(あなたはローカルフォルダにいます):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

次に、ローカルgitとリモートgitの最後のコミット番号を比較しました...


0

ローカルとリモートで考えられる異なるパスについて話していた元の質問に対する完全な回答は以下のとおりです

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

ローカルパスがdocs / file1.txtで、リモートパスがdocs2 / file1.txtであるとすると、 git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

これは、ここの GitHubヘルプページと上記のコード見習いの回答から改作

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