Mendapatkan perbedaan antara dua repositori

184

Bagaimana kita bisa mendapatkan perbedaan antara dua repositori git?

Skenario: Kami memiliki repo_a dan repo_b. Yang terakhir dibuat sebagai salinan repo_a. Ada perkembangan paralel di kedua repositori sesudahnya. Apakah ada cara kita dapat membuat daftar perbedaan dari versi saat ini dari dua repositori ini?

sanjayav
sumber
2
kemungkinan duplikat Bagaimana cara membandingkan dua repositori git?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

249

Dalam 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
iamamac
sumber
3
Bagaimana jika Anda perlu membandingkan repo_a / master dengan tag repo_b tertentu?
David Torres
2
tidak bekerja untuk saya, itu melempar: fatal: argumen ambigu 'remote / b / master': revisi yang tidak diketahui atau jalan tidak di pohon kerja. Gunakan '-' untuk memisahkan jalur dari revisi, seperti ini: 'git <command> [<revision> ...] - [<file> ...]' Ada ide di sini?
Andrew Heekin
2
Saya mendapatkan yang sama dengan @AndrewHeekin. Adakah yang punya solusi?
parlemen
4
Saya tampaknya perlu menentukan origin/masterdaripada telanjang master. Juga, ini menemukan perbedaan antara cabang-cabang utama, jadi bagaimana jika Anda ingin menemukan semua cabang yang berbeda? Misalnya untuk memeriksa status cadangan repositori?
davidA
1
Bisakah Anda menjelaskan apa yang dilakukan setiap baris? Terima kasih!
Enrique
34

Meld dapat membandingkan direktori:

meld directory1 directory2

Cukup gunakan direktori dari dua repo git dan Anda akan mendapatkan perbandingan grafis yang bagus:

masukkan deskripsi gambar di sini

Ketika Anda mengklik salah satu item biru, Anda dapat melihat apa yang berubah.

Martin Thoma
sumber
1
Meld membeku sambil membandingkan proyek dalam solusi VS saya, BeyondCompare tidak.
Sasha Bond
4
di OSX: diff -rq folder1 folder2
Tandai
1
Tautan yang luar biasa! Program yang sangat sederhana, saya sekarang menggunakan ini sebagai program diff saya untuk OSX.
dmanexe
1
Ini benar-benar indah! Terima kasih telah berbagi.
Shihab Khan
Saya tidak yakin apakah berbaur mampu menangani file yang diabaikan oleh git - Anda harus mempertimbangkan ini saat menggunakannya
noamgot
11

Anda dapat menambahkan repo lain terlebih dahulu sebagai remote ke repo Anda saat ini:

git remote add other_name PATH_TO_OTHER_REPO

lalu ambil brach dari jarak jauh itu:

git fetch other_name branch_name:branch_name

ini membuat cabang itu sebagai cabang baru di repo Anda saat ini, maka Anda dapat membedakan cabang itu dengan cabang mana saja, misalnya, untuk membandingkan cabang saat ini dengan cabang baru (branch_name):

git diff branch_name
M.Kouchi
sumber
8

Setelah Anda memiliki kedua cabang dalam satu repositori, Anda dapat melakukan a git diff. Dan mendapatkannya dalam satu repositori semudah

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*
Michael Krelin - hacker
sumber
Apakah ada cara untuk memilih-ceri sejarah dengan sedikit perubahan: Misalnya dalam file repo jarak jauh ditempatkan di satu direktori, tetapi saya ingin menerapkan perubahan pada file yang sama tetapi yang ditempatkan di direktori berbeda di repo lokal?
Eugen Konkov
Jika Anda berbicara tentang perubahan kecil, saya pikir yang paling mudah adalah dengan membuat diff dan kemudian menerapkannya kembali ke file lain menggunakan patch.
Michael Krelin - hacker
Patch tidak diterapkan karena nama file yang berbeda meskipun pada file yang sama
Eugen Konkov
Oh, saya hanya memikirkan direktori yang berbeda, bukan nama file (direktori dapat dengan mudah ditangani melalui opsi tambalan). Nah, untuk nama file saya hanya mengubahnya secara manual atau melalui skrip. Yang mengatakan, saya tidak mengatakan tidak ada solusi yang lebih baik, hanya apa yang bisa saya buat tanpa menggali di mana saja.
Michael Krelin - hacker
bagaimana jika saya ingin membandingkan semua cabang?
endolith
7
git diff master remotes/b

Itu tidak benar. remotes/badalah remote, tetapi bukan cabang.

Untuk membuatnya bekerja, saya harus melakukan:

git diff master remotes/b/master
James
sumber
2
Ini harus benar-benar menjadi komentar pada jawaban yang relevan.
TerjebakLoops
6

Lihat http://git.or.cz/gitwiki/GitTips , bagian "Cara membandingkan dua repositori lokal" di "Umum".

Singkatnya Anda menggunakan variabel lingkungan GIT_ALTERNATE_OBJECT_DIRECTORIES untuk memiliki akses ke database objek dari repositori lain, dan menggunakan git rev-parse dengan --git-dir/ GIT_DIR untuk mengonversi nama simbolis dalam repositori lain ke pengidentifikasi SHA-1.

Versi modern akan terlihat seperti ini (dengan asumsi Anda berada di 'repo_a'):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / objek \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse --verver HEAD) KEPALA

di mana ../repo_b/.gitpath ke objek database di repo_b (itu akan menjadi repo_b.git jika itu repositori telanjang). Tentu saja Anda dapat membandingkan versi sewenang-wenang, tidak hanya KEPALA.


Perhatikan bahwa jika repo_a dan repo_b adalah repositori yang sama, mungkin lebih masuk akal untuk menempatkan keduanya dalam repositori yang sama, baik menggunakan " git remote add -f ..." untuk membuat nama panggilan untuk repositori untuk pembaruan berulang, atau mengabaikan " git fetch ..."; seperti yang dijelaskan dalam tanggapan lain.

Jakub Narębski
sumber
5

Saya menggunakan PyCharm yang memiliki kemampuan hebat untuk membandingkan antara folder dan file.

Cukup buka folder induk untuk kedua repo dan tunggu hingga indeks. Kemudian Anda dapat menggunakan klik kanan pada folder atau file dan Compare to...dan memilih folder / file yang sesuai di sisi lain.

Ini menunjukkan tidak hanya file apa yang berbeda tetapi juga isinya. Jauh lebih mudah daripada baris perintah.

MrE
sumber
2

Taruhan terbaik Anda adalah memiliki kedua repo di mesin lokal Anda dan menggunakan perintah diff linux dengan dua direktori sebagai parameter:

diff -r repo-A repo-B

Andrew Heekin
sumber
2
Satu-satunya cara untuk membuat ini dapat digunakan adalah mengubah nama salah satu direktori .git. ini mengurangi menjadi dua baris halaman perbedaan yang tidak penting. Berada di sana, melakukan itu, datang ke sini mencari jawaban yang lebih baik.
Hildred
2

Cara mudah untuk melakukannya tanpa menyentuh konfigurasi remote Anda. Dari repo A, di master (anggap Anda ingin membandingkan cabang master):

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

Anda dapat menggunakan perintah berikut:

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

atau untuk berdampingan Anda dapat menggunakan:

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

Jika Mewarnai setiap file berbeda, Anda dapat menggunakan:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"
Gerard
sumber
berdasarkan pada solusi @ andrew-heekin
Gerard
0

Pengingat untuk diri sendiri ... ambil dulu, kalau tidak repositori belum hash lokal (kurasa).

langkah 1. Atur remote upstream dan di atasnya ^

diffing satu file mengikuti pola ini:

git beda localBranch uptreamBranch --spacepath / singlefile

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

Hillsie
sumber