web-dev-qa-db-ja.com

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

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

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

150
sanjayav

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
213
iamamac

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

meld directory1 directory2

2つのgitリポジトリのディレクトリを使用するだけで、素敵なグラフィック比較が得られます。

enter image description here

青い項目のいずれかをクリックすると、変更内容を確認できます。

17
Martin Thoma

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

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

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

git remote add other_name PATH_TO_OTHER_REPO

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

git fetch other_name branch_name:branch_name

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

git diff branch_name
6
M.Kouchi

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

つまり、GIT_ALTERNATE_OBJECT_DIRECTORIES環境変数を使用して他のリポジトリのオブジェクトデータベースにアクセスし、 git rev-parse with --git-dir/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
Jakub Narębski
git diff master remotes/b

それは間違っています。 remotes/bはリモートですが、ブランチではありません。

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

git diff master remotes/b/master
5
James

フォルダーとファイルを比較する優れた機能を持つPyCharmを使用します。

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

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

2
MrE

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

diff -r repo-A repo-B

1
Andrew Heekin

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

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