Bagaimana cara membandingkan cabang git lokal dengan cabangnya yang jauh?

1052

Bagaimana saya bisa melihat diffantara cabang lokal dan cabang terpencil?

mrblah
sumber
5
Pertanyaan ini ditanyakan lagi nanti. Ini memiliki jawaban yang bagus: stackoverflow.com/questions/11935633/…
rustybeanstalk
3
contoh: git diff master origin / master (di mana master adalah cabang master lokal dan asal / master adalah cabang master jarak jauh).
Kotoran
@ klyngbaek, jawaban ini khususnya ;-)
Saya awalnya mencoba git diff HEAD origin/HEADyang tampaknya menunjuk ke cabang jauh yang berbeda dari yang saya maksudkan. Menggunakan nama cabang lengkap berfungsi seperti yang diharapkan.
Deanna

Jawaban:

594

Untuk memperbarui cabang pelacakan jarak jauh, Anda harus mengetikkan git fetchterlebih dahulu dan kemudian:

git diff <masterbranch_path> <remotebranch_path>

Anda dapat git branch -amembuat daftar semua cabang (lokal dan jarak jauh) kemudian memilih nama cabang dari daftar (cukup hapus remotes/dari nama cabang jarak jauh.

Contoh: git diff master origin/master(di mana "master" adalah cabang master lokal dan "asal / master" adalah remote yaitu asal dan cabang master.)

meder omuraliev
sumber
23
Dia mungkin perlu mengambil sebelum ( git fetch)
Houssem Badri
Itu hanya menunjukkan menyelinap ke dalam perubahan di bash, apakah ada cara untuk membuka semua perubahan dalam IDE seperti kode VS?
Harsh Phoujdar
@Harsh Phoujdar Tambahkan kode di bawah ini di file .git / .gitconfig [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseAnda. Pastikan jalur Anda ke file code.exe benar.
Aman
1307
git diff <local branch> <remote>/<remote branch>

Misalnya git diff master origin/master, ataugit diff featureA origin/next

Tentu saja untuk telah mengatakan cabang terpencil-pelacakan yang Anda butuhkan untuk git fetchpertama; dan Anda perlu memiliki informasi terkini tentang cabang di repositori jarak jauh.

Jakub Narębski
sumber
98
lebih tepatnya: git diff <cabang lokal> <remote> / <remote branch>
nalply
38
Saya biasanya melakukan git diff <remote>/<remote branch> <local branch>untuk melihat apa yang akan mendorong saya untuk repo jarak jauh.
Michał Tatarynowicz
76
Bahkan lebih pendek git diff originsudah cukup jika Anda hanya membandingkan dengan cabang hulu Anda.
Ludder
12
tolong tambahkan git fetchdi awal, itu menyebabkan masalah bagi pemula seperti saya
Saif
1
Hei, bukankah seharusnya begitu git diff <remote>/<remote branch> <local branch>? Kalau tidak, saya mendapatkan add dan delete diaktifkan di komputer saya (git versi 2.7.0.windows.2)
Martín Coll
183

Tipe pertama

git branch -a

untuk mendapatkan daftar cabang yang tersedia. Pada output Anda mungkin melihat sesuatu seperti

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Kemudian tunjukkan diff

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master
YSN
sumber
1
bukankah seharusnya itu ...bukan ..?
Eliran Malka
9
Saya pasti akan memilih ini sebagai jawabannya. Mengikuti arahan Anda, saya dapat melihat perbedaan antara cabang lokal dan cabang terpencil. Terima kasih!
Tass
1
Saya biasanya melakukan git log origin/my_branch..yang akan mengambil HEADsebagai ref lokal, yang sebagian besar adalah apa yang Anda maksudkan.
Rudie
4
+1 untuk jawaban terbaik menurut pendapat saya yang sederhana. Akan bernilai +2 jika Anda menyebutkan "fetch" untuk menyinkronkan gambar "remote" dari sumber yang dikloning. Langkah ikhtisar stat / warna sangat membantu.
bvj
3
Terima kasih atas satu jawaban yang akhirnya berhasil dari tujuh atau delapan "jawaban" yang menghasilkan sedikit lebih dari fatal: bad revisionatau fatal: ambiguous argument. Yang saya inginkan adalah melihat perbedaan pada file yang sama dari cabang lain, apakah itu terlalu banyak untuk ditanyakan? Ya, ya itu. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>berfungsi dengan baik pada git 1.8.3.1
Steve Bonds
144

Jika Anda menggunakan cabang tertentu, dan ingin membandingkannya dengan cabang upstream yang Anda lacak, gunakan

git diff @{upstream}

jika hulu Anda tidak disetel (biasanya demikian, terima kasih Arijoon dalam komentar)

git diff @{push}

Atas perkenan jawaban ini , dokumentasi git untuk menentukan revisi memiliki:

<branchname>@{upstream}, misalnya master@{upstream}, @{u}
Akhiran @{upstream}ke nama cabang (bentuk pendek <branchname>@{u}) merujuk ke cabang yang ditetapkan oleh cabang branchnamediatur untuk membangun di atas (dikonfigurasi dengan branch.<name>.remotedan branch.<name>.merge). Hilang branchnamedefault ke yang saat ini.

Andrew Grimm
sumber
10
Jawaban yang sangat bagus hanya melewatkan sebagian kecil. Ubah baris ke git diff @ @{upstream}. Ekstra @adalah HEAD, di mana Anda berada sekarang, jadi Anda membandingkan HEADdengan upstream yang dilacak cabang Anda. Anda dapat menggunakan @{push}alih-alih ke hulu untuk mendapatkan perbedaan di antara cabang yang akan Anda dorong
Arijoon
3
jawaban terbaik, tidak perlu mengambil remote. butuh lebih banyak upvotes!
jcomeau_ictx
3
Pada ikan shell saya mendapat hasil: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Harus digunakan git diff @\{upstream\}sebagai gantinya. 😥
Landon Kuhn
Anda harus git fetchterlebih dahulu, kalau tidak ini tidak menghasilkan apa-apa, tidak menunjukkan output; diuji dengan menghapus file dalam asal repo dan menjalankan perintah ini secara lokal. ..bekerja hanya setelah mengambil.
Juga, karena jawaban yang diberikan mencakup setiap perubahan lokal. terkadang ini diinginkan, di waktu lain, tidak.
Deanna
44

Saya mengerti jauh lebih baik hasil dari:

git diff <remote-tracking branch> <local branch>

itu menunjukkan kepada saya apa yang akan dijatuhkan dan apa yang akan ditambahkan jika saya mendorong cabang lokal. Tentu saja sama, hanya kebalikannya, tetapi bagi saya lebih mudah dibaca dan saya lebih nyaman melihat apa yang akan terjadi.

manfer
sumber
Saya mendapatkan hasil yang persis sama dengan: git diff <cabang lokal> <cabang pelacakan jarak jauh> atau git diff <cabang pelacakan jarak jauh> <cabang lokal>
user2928048
32

Cara mudah:

git fetch
git log -p HEAD..FETCH_HEAD

Ini pertama-tama akan mengambil perubahan dari jarak jauh default Anda (asal). Ini akan dibuat secara otomatis ketika Anda mengkloning repo. Anda juga dapat eksplisit: git fetch origin master.

Kemudian git log digunakan untuk membandingkan cabang Anda saat ini dengan yang baru saja diambil. (Opsi -p(menghasilkan tambalan) adalah yang menunjukkan perbedaan .)

Brent Faust
sumber
14

Beginilah cara saya melakukannya.

#To update your local.
git fetch --all

ini akan mengambil semuanya dari jarak jauh, jadi ketika Anda memeriksa perbedaan, ia akan membandingkan perbedaannya dengan cabang jarak jauh.

#to list all branches
git branch -a

perintah di atas akan menampilkan semua cabang.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Sekarang, Anda dapat memeriksa perbedaan sebagai berikut.

git diff origin/<branch_name>

ini akan membandingkan cabang lokal Anda dengan cabang jarak jauh

Sahith Vibudhi
sumber
2
git fetch --all akan mengambil semuanya dari SEMUA remote. git fetch harus memadai jika Anda menggunakan remote asal default.
Christophe Keller
Luar biasa bahwa setelah 8 tahun, kami mendapatkan jawaban lengkap yang menjelaskan langkah-langkahnya. Kita dapat melakukan --help untuk mendapatkan perintah. SO adalah tentang memahami mereka.
gdbj
11

Biarkan cabang kerja Anda adalah pengembangan dan ingin membedakan antara cabang pengembangan lokal dan cabang pengembangan jarak jauh, dalam hal ini, sintaksinya harus seperti git diff remotes/origin/development..development
atau

git fetch origin git diff origin/development

Ratna Halder
sumber
11

tl; dr :git diff <local branch> <remote branch>

Saat menggunakan git di shell, saya lebih suka mengorientasikan diri dengan melihat-lihat. Berikut adalah perintah untuk menampilkan semua cabang

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Di sini saya memiliki dua cabang lokal ( my-branchdan master) dan 4 jarak jauh ( some-branch, some-other-branch, master, dan my-branch).

Juga, tanda bintang di sebelah my-branchsinyal fakta bahwa saya saat ini di cabang itu (Anda juga akan tahu bahwa dengan menggunakan perintah git statusyang akan menampilkan:) On branch my-branch..

Catatan: cabang jarak jauh di shell git bash ditampilkan dengan warna merah sedangkan cabang lokal ditampilkan dalam warna hijau.

Jika Anda hanya ingin menampilkan cabang jarak jauh :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Untuk hanya menampilkan cabang lokal, Anda mungkin tergoda untuk menggunakan git branch -ltetapi itu perintah yang sama sekali berbeda. Untuk menampilkan cabang lokal, gunakan git branchtanpa opsi

$ git branch
* my-branch 
  master

Untuk menyelesaikan peninjauan opsi cabang dasar ada --listyang bertentangan dengan apa yang Anda harapkan ada di sana untuk memungkinkan pemfilteran . Gunakan dengan pola seperti ini:

$ git branch --list 'my*'
* my-branch

Anda juga dapat menggabungkan --listdengan opsi -adan -rtetapi pastikan untuk menyesuaikan pola Anda sesuai ( ingat: cabang jarak jauh mulai dengan "remote" ). Contoh:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Documents: https://git-scm.com/docs/git-branch

Sekarang Anda dapat membandingkan dua cabang dari semua cabang yang tersedia (Anda juga dapat membandingkan dua penduduk lokal atau dua remote).

Di sini saya membandingkan lokal dengan remote my-branch, mereka disinkronkan jadi saya tidak mendapatkan output:

$ git diff my-branch remotes/origin/my-branch

Catatan: Anda harus memberikan nama lengkap cabang tanpa tanda kutip.

Saya juga bisa membandingkan lokal my-branchke remote master. Di sini saya mendapatkan beberapa output karena remote my-branchbelum digabungkan ke cabang master.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]
pengguna2314737
sumber
11

Jika Anda ingin melihat perbedaan karena hanya nama-nama file yang diubah lalu gunakan :, kalau tidak

git diff --name-status <remote-branch> <local-branch>,

ini akan menunjukkan semua perbedaan antara dua cabang:

git diff <remote-branch> <local-branch>

Sarvesh Kesharwani
sumber
9

Berikut adalah jawaban singkat jika Anda membandingkan cabang saat ini dan dengan sesuatu yang Anda inginkan git pull.

git fetch
git diff FETCH_HEAD

Perintah pertama akan mencari tahu cabang jarak jauh mana yang sesuai dengan cabang Anda saat ini. Artefak perhitungan itu dalam FETCH_HEADreferensi. Kemudian perintah kedua menggunakan referensi yang dibandingkan dengan apa yang dimiliki cabang Anda saat ini.

William Entriken
sumber
6

Saya tahu sudah ada beberapa jawaban untuk pertanyaan ini tetapi saya mendapatkan kesalahan aneh ketika mencoba sebagian besar dari mereka.

Dalam kasus saya saya memiliki kedua terpencil yang disebut herokuyang tidak yang origindan karena itu tidak sinkron saya punya kesalahan ini ketika mencoba untuk menjalankan git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

atau ini ketika mencoba pendekatan lain git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

Solusinya secara eksplisit menyebutkan nama jarak jauh git fetchsebelum berjalan git diff, dalam kasus saya:

$ git fetch heroku
$ git diff master heroku/master

Harapan yang membantu orang lain dengan masalah yang sama ini.

fagiani
sumber
4
git difftool <commit> .

Ini akan membandingkan komit yang Anda inginkan dengan file lokal Anda. Jangan lupa titik pada akhirnya (untuk lokal).

Misalnya, untuk membandingkan file lokal Anda dengan beberapa komit:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(dan Anda tidak perlu git fetch, kecuali membandingkan dengan commit baru diperlukan)

Izik
sumber
Saya pikir ini menarik karena merupakan perbandingan yang dapat saya lakukan sebelum melakukan dan mendorong. Sayangnya di windows vimdiff untuk ditampilkan jelek; apakah ada cara untuk menggunakan sesuatu yang lebih baik, seperti notepad ++?
Stefano Scarpanti
3

Contoh

git diff 'master' 'testlocalBranch'

Jika Anda menggunakan editor seperti webstorm, Anda dapat mengklik kanan pada file pilih bandingkan dengan cabang dan ketik / pilih cabang Anda.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Kurkula
sumber
2
Apa ini menambahkan lebih dari jawaban yang diterima 7,5 tahun dengan 170+ upvotes?
Mark Rotteveel
Ini Untuk mrblah pengguna atau untuk pengguna serupa yang menambahkan komentar untuk jawaban yang diterima. Sintaks berbeda dari contoh dan contoh lebih banyak membantu dari sudut pandang pemula.
Kurkula
2
Dalam hal ini, itu harus dalam komentar atas jawaban itu.
rachit
1

Di VS 2019, lakukan saja FETCH Jangan menarik kode.

Inilah yang saya lakukan. Ditambahkan di bawah ini dalam file .gitconfig sehingga saya dapat menggunakan Beyond Compare

File location: C:\Users\[username]\.gitconfig

Ditambahkan di bawah

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Buka command prompt dan buka direktori kerja. Di bawah ini saya berikan untuk membandingkan cabang DEV lokal dengan cabang DEV jauh

git difftool dev origin/dev --dir-diff

Ini akan membuka Beyond Compare dan membuka direktori yang memiliki file yang berbeda. Jika tidak ada perubahan, Beyond Compare tidak akan diluncurkan.

Ziggler
sumber
0

Saya bertanya-tanya apakah ada perubahan di cabang master saya ...

  1. Pertama, Anda perlu mengubah cabang Anda (Jika Anda sudah berada di bawah cabang ini, Anda tidak perlu melakukan ini!)

git checkout master

  1. Anda dapat melihat file mana yang telah dimodifikasi di bawah cabang master Anda dengan perintah ini

status git

  1. Daftar cabang

cabang git -a


  • remote master / asal / master
  1. Carilah perbedaannya

asal git / master git

Ali Atakan
sumber
0

Mendirikan

git config alias.udiff 'diff @{u}'

Diffing HEAD dengan HEAD @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Berbeda dengan Cabang Jarak Jauh Sewenang-wenang

Ini menjawab pertanyaan di heading Anda ("remote"); jika Anda ingin melakukan diff terhadap "remote" (yang tidak dikonfigurasikan sebagai upstream untuk cabang), Anda perlu menargetkannya secara langsung. Anda dapat melihat semua cabang jarak jauh dengan yang berikut:

git branch -r

Anda dapat melihat semua remote yang dikonfigurasi dengan yang berikut:

git remote show

Anda dapat melihat konfigurasi cabang / pelacakan untuk satu remote (misalnya asal) sebagai berikut:

git remote show origin

Setelah Anda menentukan cabang asal yang tepat, lakukan saja perbedaan normal :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH

DylanYoung
sumber
0

Ini cukup sederhana. Kamu bisa menggunakan:git diff remote/my_topic_branch my_topic_branch

Di mana my_topic_branchcabang topik Anda.

Elisha Senoo
sumber
0

Katakanlah Anda telah mengatur originrepositori jarak jauh Anda. Kemudian,

git diff <local branch> <origin>/<remote branch name>

Tirtha
sumber
0

mencoba:

git diff origin HEAD

Dengan asumsi Anda ingin membedakan Anda cabang lokal saat ini HEADdengan yang asli. Dan dengan asumsi Anda berada di cabang lokal. :)

Sourabh Pandit
sumber
-3

Jika Anda menggunakan TortoiseGit (menyediakan GUI untuk Git), Anda dapat mengklik kanan folder repo Git Anda lalu mengklik Git Sync.

Anda dapat memilih cabang untuk dibandingkan jika tidak dipilih. Daripada Anda dapat melihat perbedaan komit. Anda juga dapat mengklik kanan komit lalu Compare with previous revisionuntuk melihat perbedaan secara berdampingan.tortoise git sync untuk membandingkan cabang jarak jauh dan lokal

Halil İbrahim Oymacı
sumber