Pertanyaan Bagaimana cara memeriksa diff git nyata sebelum bergabung dari cabang jarak jauh?


Saya ingin memeriksa diff nyata antara cabang jarak jauh dan cabang lokal. Bagaimana saya bisa melakukannya?

Menerbitkan perintah di bawah sebagian berfungsi, tetapi ini menunjukkan perbedaan dari perubahan baru cabang lokal saya juga.

git diff remote/branch

42
2018-02-09 11:42


asal


Jawaban:


Dari dokumentasi:

git diff [--options] <commit>...<commit> [--] [<path>…]

Formulir ini untuk melihat perubahan pada   cabang yang berisi dan sampai   kedua <commit>, mulai dari yang umum   leluhur keduanya <commit>. "git diff   A ... B "sama dengan" git diff   $ (git-merge-base A B) B ". Anda dapat menghilangkan   salah satu dari <commit>, yang memiliki   efek yang sama seperti menggunakan HEAD.

apakah kamu mencoba ini?


13
2018-02-09 11:58



Karena topik ini sering muncul, dan dapat membingungkan tanpa sedikit latar belakang tentang cara kerja git, saya pikir saya akan mencoba menjelaskan kasus yang paling sederhana mungkin, tetapi dengan kedalaman yang cukup bahwa pendatang baru akan memiliki cukup pegangan untuk melakukan penelitian tambahan.

Jika Anda mengatur repositori git Anda melalui 'klon' normal dan memiliki refspec default, yang berarti bahwa remote Anda bernama 'origin' dan Anda menarik / mengambil dari 'master' cabang, Anda kadang-kadang perlu melihat apa yang ada di remote repositori sebelum menariknya ke bawah.

Karena "git pull" melakukan penggabungan otomatis (kecuali ada konflik), akan lebih baik untuk melihat apa yang "masuk" selanjutnya. Jika Anda tidak terbiasa dengan cara kerja git, dan bagaimana refspecs secara khusus dikelola, ini bisa sedikit tidak intuitif.

Misalkan seseorang membuat perubahan di repositori jarak jauh (Untuk kepentingan ilustrasi, menambahkan garis ke repositori jarak jauh dengan melakukan perubahan dan mendorongnya), dan Anda mengetik:

$ git diff origin/master

Anda mungkin tidak akan melihat perubahan apa pun; namun jika Anda melakukan hal berikut:

$ git fetch; git diff ..origin/master 

Anda akan melihat perbedaan antara apa yang telah berkomitmen untuk repositori git lokal Anda dan apa yang ada di repositori jarak jauh. Anda TIDAK akan melihat perubahan apa pun yang ada di sistem file lokal Anda atau ditampilkan dalam indeks Anda.

Ok, mengapa kita melakukan ini? asal / master adalah a refspec (lihat halaman manual). Singkatnya, inilah yang kami maksud untuk membandingkan melawan, menarik atau mengambil dari, dan mendorong ke. Semua hal berikut ini secara fungsional setara:

origin/master
remotes/origin/master
refs/remotes/origin/master

Untuk mulai menguraikan ini, cukup intip struktur direktori git repositori Anda. Tata letak tipikal terlihat seperti ini:

.git/refs
.git/refs/heads
.git/refs/heads/master
.git/refs/remotes
.git/refs/remotes/origin
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master
.git/refs/tags

Lihatlah .git / refs / remote / origin / HEAD; dalam kasus default ini akan mengarah ke cabang yang Anda gunakan untuk menarik dan mendorong ke. Dalam kasus saya, karena saya di master, isi file teks ini terlihat seperti ini:

ref: refs/remotes/origin/master

Ini memberitahu saya bahwa HEAD remote saya diidentifikasi oleh refspec 'refs / remote / origin / master' (yang kebetulan memiliki alias yang disebutkan di atas).

Ini tidak memberi tahu kita banyak; apa status dari repositori jarak jauh? Lihatlah keadaan master jarak jauh:

$ cat .git/refs/heads/master     
6d0fb0adfdfa5af861931bb06d34100b349f1d63

Ok, ini adalah SHA1 hash; mungkin komit. Bagaimana cara memasukkannya ke dalam file ini? Nah, kapan pun Anda melakukan tarikan atau pengambilan, file ini diperbarui dengan commit terbaru dari remote yang ditarik atau diambil. Ini menjelaskan mengapa kita harus melakukannya git fetchsebelum melakukan diff. Ingat, git fetch cukup perbarui salinan lokal dari cabang jarak jauh, tetapi jangan gabungkan dengan copy pekerjaan Anda. Itu benar-benar aman. SEBUAH git fetch; git merge setara dengan a git pull.

Setelah Anda melakukan pengambilan, git akan dapat melihat commit terbaru di remote repositori pada saat pengambilan.

Anda dapat menggunakan berbagai kombinasi penentu untuk git untuk melihat diff Anda seperti yang Anda inginkan (contoh-contoh berikut menggunakan copy pekerjaan lokal sebagai commit implisit pertama):

$ git diff remote/origin   
This shows the incoming remote additions as deletions; any additions in your local 
repository are shown as additions.

$ git diff ...remote/origin
Shows incoming remote additions as additions; the triple-dot excludes changes
committed to your local repository.

$ git diff ..remote/origin
Shows incoming remote additions as additions; the double-dot includes changes
committed to your local repository as deletions (since they are not yet pushed).

Untuk info tentang ".." vs "..." lihat git help diff serta dokumentasi yang sangat baik di pilihan revisi git-scm: rentang commit  Secara singkat, untuk contoh di atas, sintaks dua titik menunjukkan semua commit yang dapat dijangkau dari asal / master tetapi tidak copy pekerjaan Anda. Demikian juga, sintaks triple-titik menunjukkan semua komit yang dapat dicapai baik dari commit (copy pekerjaan implisit, remote / asal) tetapi tidak dari keduanya.

Saya akan melalui langkah ini selangkah demi selangkah karena saya cukup baru untuk git dan ini adalah persis jenis hal yang dimiliki saya bingung ... Saya yakin bahwa para ahli git dapat menemukan kekurangan dengan perincian ... Saya hanya berharap jawaban ini menjembatani celah untuk beberapa orang yang menemukan semua posting yang sedikit singkat.


105
2017-07-30 17:32



Apa yang ingin Anda lakukan adalah, seperti yang disarankan oleh Evgen Bodunov:

git diff ...remote/branch

Ini akan membuat perubahan dari jarak jauh / cabang dan mengabaikan perubahan dari HEAD Anda saat ini.


7
2018-02-09 12:10