2つのリポジトリの違いを取得する


184

2つのgitリポジトリの違いを取得するにはどうすればよいですか?

シナリオ:repo_aとrepo_bがあります。後者はrepo_aのコピーとして作成されました。その後、両方のリポジトリで並行開発が行われました。これら2つのリポジトリの現在のバージョンの違いをリストする方法はありますか?


回答:


249

repo_a内:

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

3
repo_a / masterをrepo_bの特定のタグと比較する必要がある場合はどうなりますか?
David Torres

2
私にとってはうまくいきません、それは投げています:致命的:あいまいな引数 'remotes / b / master':作業ツリーにない不明なリビジョンまたはパス。次のように、「-」を使用してパスをリビジョンから分離します。 'git <command> [<revision> ...]-[<file> ...]'何かアイデアはありますか?
Andrew Heekin、2015

2
@AndrewHeekinと同じになります。誰かが解決策を持っていますか?
国会

4
むやみに指定するのorigin/masterではなく、指定する必要があるようですmaster。また、これはマスターブランチ間の違いを見つけるので、異なるすべてのブランチを見つけたい場合はどうでしょうか?たとえば、リポジトリバックアップのステータスを確認しますか?
davidA 2016

1
すべての行で何が行われているのか説明できますか?よろしくお願いします!
エンリケ

34

Meldはディレクトリを比較できます。

meld directory1 directory2

2つのgitリポジトリのディレクトリを使用するだけで、グラフィカルな比較ができます。

ここに画像の説明を入力してください

青色の項目の1つをクリックすると、変更点を確認できます。


1
VSソリューションでプロジェクトを比較しているときにMeldがフリーズしますが、BeyondCompareはフリーズしません。
サーシャボンド

4
OSXの場合:diff -rq folder1 folder2
マーク

1
素晴らしいリンク!非常にシンプルなプログラムです。これをOSXの差分プログラムとして使用しています。
dmanexe

1
これは絶対に素敵です!共有いただきありがとうございます。
Shihab Khan、


11

最初に他のリポジトリを現在のリポジトリのリモートとして追加できます。

git remote add other_name PATH_TO_OTHER_REPO

次に、そのリモートからbrachをフェッチします。

git fetch other_name branch_name:branch_name

これにより、そのブランチが現在のリポジトリの新しいブランチとして作成されます。次に、そのブランチを任意のブランチと比較して、たとえば、現在のブランチを新しいブランチ(branch_name)と比較できます。

git diff branch_name

8

1つのリポジトリに両方のブランチを作成したら、を実行できますgit diff。そして、それらを1つのリポジトリーに入れるのは簡単です。

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

少しの変更で履歴を選択する方法はありますか。たとえば、リモートリポジトリのファイルが1つのディレクトリに配置されていますが、同じファイルに変更を適用しますが、ローカルリポジトリの別のディレクトリに配置しますか?
オイゲンコンコフ2017

小さな変更について話している場合は、diffを作成し、パッチを使用してそれを他のファイルに再適用するのが最も簡単だと思います。
マイケルクレリン-ハッカー

同じファイルであるにもかかわらずファイル名が異なるため、パッチが適用されない
Eugen Konkov

ああ、私はファイル名ではなく、さまざまなディレクトリのみを考えていました(ディレクトリはパッチオプションで簡単に処理できます)。ファイル名については、手動またはスクリプトで変更するだけです。とは言っても、これ以上の解決策はありません。何も掘り下げることなく思いつくものだけです。
マイケルクレリン-ハッカー、2017年

すべてのブランチを比較したい場合はどうなりますか?
内石

7
git diff master remotes/b

不正解です。remotes/bリモートですが、ブランチではありません。

それを機能させるために、私はしなければなりませんでした:

git diff master remotes/b/master

2
これは実際に関連する回答へのコメントであるべきです。
EntangledLoops

6

http://git.or.cz/gitwiki/GitTipsの「一般」の「2つのローカルリポジトリを比較する方法」のセクションを参照してください

つまり、GIT_ALTERNATE_OBJECT_DIRECTORIES環境変数を使用して他のリポジトリのオブジェクトデータベースにアクセスし、/ GIT_DIRでgit rev-parseを使用--git-dirして他のリポジトリのシンボリック名をSHA-1識別子に変換しています。

最新バージョンは次のようになります( 'repo_a'にいると仮定します)。

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / objects \
   git diff $(git --git-dir = .. / repo_b / .git rev-parse --verify HEAD)HEAD

ここで../repo_b/.git、repo_b内のオブジェクトデータベースへのパスです(それがベアリポジトリの場合、repo_b.gitになります)。もちろん、HEADだけでなく、任意のバージョンを比較できます。


repo_aとrepo_bが同じリポジトリーである場合は、両方を同じリポジトリーに配置する方が理にかなっていることに注意してください。 " git remote add -f ..."を使用して、繰り返し更新するリポジトリーのニックネームを作成するか、 " "を無視しgit fetch ...ます。他の応答で説明されています。


5

私はPyCharmを使用しており、フォルダーとファイルを比較する優れた機能を備えています。

両方のリポジトリの親フォルダーを開き、インデックスが作成されるまで待ちます。次に、フォルダーまたはファイルを右クリックしCompare to...て、反対側の対応するフォルダー/ファイルを選択します。

異なるファイルだけでなく、その内容も表示されます。コマンドラインよりもはるかに簡単です。


2

あなたの最善の策は、両方のリポジトリをローカルマシンに置き、2つのディレクトリをパラメータとしてlinux diffコマンドを使用することです。

diff -r repo-A repo-B


2
これを使用可能にする唯一の方法は、.gitディレクトリの1つの名前を変更することです。これは、重要ではない2行の違いのページに減少します。そこに行って、それを終えて、より良い答えを探してここに来ました。
2016年

2

リモート設定に触れずにそれを行う簡単な方法。マスターのリポジトリAから(マスターブランチを比較するとします):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

次のコマンドを使用できます。

diff -x .git -r repo-A repo-B

または並べて使用することができます:

diff -x .git -W200 -y -r repo-A repo-B

すべてのdiffファイルをカラー化する場合は、以下を使用できます。

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

@ andrew-heekinソリューションに基づく
Gerard

0

自己通知...最初にフェッチしてください。それ以外の場合、リポジトリにはローカルハッシュがありません(おそらく)。

手順1.アップストリームリモート以上をセットアップします^

単一のファイルの比較は次のパターンに従います。

git diff localBranch uptreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

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