Bir yerel git dalı uzak dalı ile nasıl karşılaştırılır?


1050

diffYerel bir şube ile uzak bir şube arasındaki bağlantıyı nasıl görebilirim ?


5
Bu sorular daha sonra tekrar sorulmuştur. Güzel bir cevabı var: stackoverflow.com/questions/11935633/…
rustybeanstalk

3
örnek: git diff ana başlangıç ​​/ ana (burada ana yerel ana dal ve başlangıç ​​/ ana uzak ana daldır).
Gübre

@klyngbaek, özellikle bu cevap ;-)

Başlangıçta istediğimden git diff HEAD origin/HEADfarklı bir uzak şubeye işaret ediyor gibi görünüyordu. Tam şube adını kullanmak beklendiği gibi çalışır.
Deanna

Yanıtlar:


592

Uzaktan izleme dallarını güncellemek için git fetchönce yazmanız ve ardından şunları yazmanız gerekir :

git diff <masterbranch_path> <remotebranch_path>

Şunları yapabilirsiniz git branch -asonra listeden şube adı seçmek (uzaktaki) tüm dallarını listelemek için (sadece kaldırmak remotes/uzaktan şube adından.

Örnek: git diff master origin/master(burada "ana" yerel ana dal ve "başlangıç ​​/ ana" uzak, yani başlangıç ​​ve ana daldır.)


23
Önce getirilmesi gerekebilir ( git fetch)
Houssem Badri

Bu sadece bash değişikliklerine bir gizlice gösterir, bir IDE VS kodu gibi tüm değişiklikleri açmak için herhangi bir yolu var mı?
Sert Phoujdar

@Harsh Phoujdar Aşağıdaki kodu .git / .gitconfig dosyanıza [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseekleyin code.exe dosyasının yolunun doğru olduğundan emin olun.
Aman

1307
git diff <local branch> <remote>/<remote branch>

Örneğin git diff master origin/master, veyagit diff featureA origin/next

Tabii için gelmiş söyledi dalı uzaktan izleme yapmanız gerekiyorsa git fetchilk; ve uzak depodaki şubeler hakkında güncel bilgilere sahip olmanız gerekir.


98
daha kesin olmak
gerekirse

38
Genellikle git diff <remote>/<remote branch> <local branch>uzak repo için itme gücümün ne yapacağını görmek için yapıyorum.
Michał Tatarynowicz

76
git diff originYukarı akış şubenizle karşılaştırırsanız daha da kısa olanı yeterlidir.
Ludder

12
lütfen git fetchbaşlangıçta ekleyin , bu benim gibi yeni başlayanlar için sorun yaratıyor
Saif

1
Hey, öyle değil mi git diff <remote>/<remote branch> <local branch>? Aksi takdirde, bilgisayarımda eklenen ve silinenleri alıyorum (git sürüm 2.7.0.windows.2)
Martín Coll

183

İlk tip

git branch -a

kullanılabilir şubelerin listesini almak için. Çıktıda şöyle bir şey görebilirsiniz:

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

Sonra farkı göster

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master

1
o olmamalı ...yerine ..?
Eliran Malka

9
Bunu kesinlikle cevap olarak seçerdim. Yol tariflerinizin ardından, yerel bir şube ile uzak bir şube arasındaki farkları görebildim. Teşekkürler!
Tass

1
Ben genellikle yerel ref olarak git log origin/my_branch..alacak HEAD, çoğunlukla ne demek istediğimi yapıyorum .
Rudie

4
Benim düşünceme göre en iyi cevap için +1. Klonlanan kaynağın "uzak" görüntüsünü senkronize etmek için "getir" denirseniz +2 değerinde olur. Stat / renk genel bakışı özellikle yararlıdır.
bvj

3
Sonunda yedi veya sekiz "cevaptan" fatal: bad revisionya da daha fazla sonuç veren tek cevap için teşekkürler fatal: ambiguous argument. Tek istediğim, aynı dosyadaki farkı başka bir şubeden görmekti, sormak için çok mu fazla? Evet, evet öyleydi. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>git 1.8.3.1 üzerinde harika çalışıyor
Steve Bonds

143

Belirli bir daldaysanız ve onu izlediğiniz bir yukarı akış dalıyla karşılaştırmak istiyorsanız,

git diff @{upstream}

yukarı akışınız ayarlanmadıysa (genellikle durum, yorumlarda Arijoon'a teşekkürler )

git diff @{push}

Bu cevabın izniyle, revizyonları belirtmek için git dokümanında şunlar bulunur :

<branchname>@{upstream}, örneğin master@{upstream}, Bir dal adının @{u}
soneki @{upstream}(kısa form <branchname>@{u}), tarafından belirtilen dalın branchname, ( branch.<name>.remoteve ile yapılandırılmış branch.<name>.merge) üzerine oluşturulacak şekilde ayarlanmış dalı ifade eder . Eksik branchnameolan, geçerli olanı varsayılan olarak kullanır.


10
Çok iyi bir cevap sadece küçük bir kısmı eksik. Satırı olarak değiştirin git diff @ @{upstream}. Ekstra @, HEADşu anda bulunduğunuz yer, bu nedenle HEADşubenizin izlediği yukarı akışla karşılaştırıyorsunuz . @{push}
İtmek

3
en iyi cevap, uzaktan kumandayı getirmeyi gerektirmez. daha fazla oyu gerekiyor!
jcomeau_ictx

3
Balık kabuk ben sonuç var: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. git diff @\{upstream\}Bunun yerine kullanmak zorunda kaldı . 😥
Landon Kuhn

Önce yapmanız gerekir git fetch, aksi takdirde bu hiçbir şey yapmaz, çıktı göstermez; repo kaynağındaki bir dosyayı silerek test edildi ve bu komutu yerel olarak çalıştırdı. .. sadece getirdikten sonra çalışır.

Ayrıca, verilen cevabın herhangi bir yerel değişikliği içermesi. bazen bu istenir, diğer zamanlarda değil.
Deanna

44

Ben çıktı daha iyi anlıyorum:

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

bu bana ne bırakılacağını ve yerel şubeyi itersem ne ekleneceğini gösterir. Tabii ki aynı, sadece ters, ama benim için daha okunabilir ve ne olacağına bakmak daha rahat.


Şununla tam olarak aynı sonucu alıyorum: git diff <yerel şube> <uzaktan izleme dalı> veya git diff <uzaktan izleme dalı> <yerel şube>
Şununla

32

Kolay yol:

git fetch
git log -p HEAD..FETCH_HEAD

Bu, önce varsayılan uzaktan kumandanızdaki (başlangıç ​​noktanız) değişiklikleri getirecektir. Bir repoyu klonladığınızda bu otomatik olarak oluşturulur. Ayrıca açık olabilir: git fetch origin master.

Ardından git günlüğü, geçerli dalınızı yeni getirilen dalla karşılaştırmak için kullanılır. ( -p(Yama oluştur) seçeneği farkları gösterir .)


14

Ben böyle yaparım.

#To update your local.
git fetch --all

bu uzaktan kumandadan her şeyi alır, bu yüzden farkı kontrol ettiğinizde, farkı uzak dal ile karşılaştırır.

#to list all branches
git branch -a

Yukarıdaki komut tüm dalları gösterecektir.

#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

Şimdi, farkı aşağıdaki gibi kontrol edebilirsiniz.

git diff origin/<branch_name>

bu yerel şubenizi uzak şubeyle karşılaştırır


2
git fetch - all TÜM uzaktan kumandalardan her şeyi alır. Varsayılan başlangıç ​​uzaklığını kullanırsanız git getirme yeterli olmalıdır.
Christophe Keller

8 yıl sonra, adımları düzgün bir şekilde açıklayan tam bir cevap almamız şaşırtıcı. Komutları almak için --help yapabiliriz. SO onları anlamakla ilgilidir.
gdbj

11

Çalışma dalınızın gelişim olmasına ve yerel geliştirme dalı ile uzaktan geliştirme dalı arasında ayrım yapmak istemesine izin verin, bu durumda sözdizimi aşağıdaki gibi olmalıdır git diff remotes/origin/development..development
veya

git fetch origin git diff origin/development


11

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

Kabuk üzerinde git kullanırken, önce etrafa bakarak kendimi yönlendirmek istiyorum. İşte tüm dalları gösterme komutu

$ 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

Burada iki yerel şubesi (varsa my-branchve master(uzaktan) ve 4 some-branch, some-other-branch,master , vemy-branch ).

Ayrıca, yanındaki yıldız işareti my-branchşu anda o dalda olduğumu gösterir (ayrıca şunu bildirirsiniz git status:On branch my-branch. .

Not: git bash kabuğundaki uzak dallar kırmızı, yerel olanlar yeşil olarak gösterilir.

Yalnızca uzak dalları göstermek istiyorsanız :

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

Yalnızca yerel şubeleri göstermek için kullanabilirsiniz, git branch -lancak bu tamamen farklı bir komuttur. To yerel şubeleri göstermek kullanımını git branchhiçbir seçenekleri ile

$ git branch
* my-branch 
  master

Temel şube seçeneklerinin gözden geçirilmesini tamamlamak --listiçin, filtrelemeye izin vermeyi beklediğinizden farklıdır . Bunun gibi bir desenle kullanın:

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

Ayrıca --listseçeneklerle birleştirebilir -ave -rdeseninizi buna göre uyarladığınızdan emin olun ( unutmayın: uzak dallar "uzaktan kumandalar" ile başlar ). Misal:

# 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

Dokümanlar: https://git-scm.com/docs/git-branch

Şimdi tüm mevcut olanlardan herhangi iki dalı karşılaştırabilirsiniz (iki yerel veya iki uzaktan kumanda da karşılaştırabilirsiniz).

Burada yerel uzaktan kumanda ile karşılaştırıyorum my-branch, onlar senkronize böylece herhangi bir çıkış almazsınız:

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

Not: dalların tam isimlerini tırnak işareti olmadan vermelisiniz.

Ayrıca yerel my-branchile uzaktan kumandayı karşılaştırabilirim master. Uzaktan kumandayı my-branchana dalda birleştirilmediğinden burada bazı çıktılar alıyorum .

$ 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
[ . . . ]

11

Farkı sadece dosyaların adları değişti olarak görmek istiyorsanız şunu kullanın::

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

aksi takdirde bu iki dal arasındaki tüm farkları gösterir:

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


9

Şimdiki dalınızı ve istediğiniz bir şeyi karşılaştırıyorsanız, kısa bir cevap git pull.

git fetch
git diff FETCH_HEAD

İlk komut, hangi uzak dalın geçerli dalınıza karşılık geldiğini bulur. FETCH_HEADReferansta bu hesaplamanın bir yapaylığı . Sonra ikinci komut bu başvuruyu geçerli dalınızla karşılaştırmak için kullanır.


6

Zaten bu sorunun birkaç cevabı olduğunu biliyorum ama çoğunu denerken garip bir hata alıyordum.

Benim durumumda ben ikinci uzaktan denilen herokuolduğunu değilorigin ve ben çalıştırmaya çalışırken bu hata var senkronize olmadığı için git diff master heroku/master:

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

veya diğer yaklaşımı denerken git diff master..heroku/master:

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

Çözüm, benim durumumda, git fetchçalıştırmadan önce uzak addan açıkça bahsediyordu git diff:

$ git fetch heroku
$ git diff master heroku/master

Bu aynı konuda başkalarına yardımcı umuyoruz.


4
git difftool <commit> .

Bu, istediğiniz taahhüdü yerel dosyalarınızla karşılaştırır. Sonundaki noktayı unutmayın (yerel için).

Örneğin, yerel dosyalarınızı bazı taahhütlerle karşılaştırmak için:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(ve yeni taahhütlerle karşılaştırılması gerekmedikçe git getirmeye ihtiyacınız yoktur)


Bence bu ilginç çünkü taahhüt ve itmeden önce yapabileceğim bir karşılaştırma. Ne yazık ki Windows vimdiff göstermek için çirkin; notepad ++ gibi daha iyi bir şey kullanmanın bir yolu var mı?
Stefano Scarpanti

3

Misal

git diff 'master' 'testlocalBranch'

Eğer webstorm gibi bir editör kullanıyorsanız, dosya seçimi ile dalın karşılaştırmasını sağ tıklayabilir ve dalınızı yazabilir / seçebilirsiniz.

resim açıklamasını buraya girin

resim açıklamasını buraya girin


2
Bu 170+ upvotes ile 7.5 yaşında kabul edilen cevabı ne ekliyor?
Mark Rotteveel

Bu mrblah için kullanıcı veya kabul edilen cevap için yorum ekleyen benzer kullanıcılar içindir. Sözdizimi bir örnekten farklıdır ve örnek, yeni başlayanların bakış açısından daha fazla yardımcı olur.
Kurkula

2
Bu durumda, bu cevabın yorumunda olmalıdır.
raş

1

VS 2019'da sadece FETCH kodunu çekmeyin.

Ben de öyle yaptım. Karşılaştırmanın Ötesinde kullanabilmem için .gitconfig dosyasına aşağıda eklendi

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

Aşağıdan eklendi

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

Komut istemini açın ve çalışma dizinine gidin. Yerel DEV dalını uzak DEV dalıyla karşılaştırmak için aşağıda verdim

git difftool dev origin/dev --dir-diff

Bu, Karşılaştırmanın Ötesinde açılır ve farklı dosyaları olan dizinleri açar. Hiçbir değişiklik olmazsa Karşılaştırmanın Ötesinde başlamaz.


0

Ana dalımda herhangi bir değişiklik olduğunu merak ediyorum ...

  1. Öncelikle, şubenizi değiştirmeniz gerekiyor (Bu şubenin altındaysanız, bunu yapmanız gerekmez!)

git ödeme yöneticisi

  1. Ana komutunuz altında hangi dosyanın değiştirildiğini bu komutla görebilirsiniz

git durumu

  1. Şubeleri listeleyin

git şubesi -a

  • ana
    uzaktan kumandalar / kökeni / ana
  1. Farkları bulun

git diff orijin / master


0

Kurmak

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

HEAD @ {upstream} ile HEAD'ı dağıtma

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

Keyfi Uzak bir Dal ile Farklılaşma

Bu, başlığınızdaki soruya cevap verir ("uzaktan kumandası"); "bir uzak" a (şube için yukarı akış olarak yapılandırılmamış) karşı çıkmak istiyorsanız, doğrudan hedeflemeniz gerekir. Tüm uzak dalları aşağıdakilerle görebilirsiniz:

git branch -r

Yapılandırılmış tüm uzaktan kumandaları aşağıdakilerle görebilirsiniz:

git remote show

Tek bir uzaktan kumandanın (örn. Başlangıç ​​noktası) şube / izleme yapılandırmasını aşağıdaki gibi görebilirsiniz:

git remote show origin

Uygun başlangıç ​​dalını belirledikten sonra, normal bir fark yapın :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH


0

Bu oldukça basit. Kullanabilirsiniz:git diff remote/my_topic_branch my_topic_branch

my_topic_branchKonu şubeniz nerede .


0

Diyelim ki, önceden originuzak depo olarak ayarladınız . Sonra,

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


0

Deneyin:

git diff origin HEAD

Mevcut Yerel şubelerinizi HEADbaşlangıç noktasına göre ayırmak istediğinizi varsayarsak . Ve yerel şubede olduğunuzu varsayarsak. :)


-3

Eğer kullanırsanız TortoiseGit (o Git için GUI sağlar), doğruca Git repo klasörü ardından tıklayabilirsiniz Git Sync.

Seçili değilse karşılaştırılacak dallarınızı seçebilirsiniz. Farklılıkları görebileceğiniz taahhüt. Ayrıca Compare with previous revisionfarklılıkları yan yana görüntülemek için herhangi bir taahhüdü sağ tıklatabilirsiniz .kaplumbağa git sync uzak ve yerel şube karşılaştırmak için

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.