master ve branş arasındaki ileri / geri git?


203

Yerel repo'mda ( test-branch) test etmek için bir şube oluşturdum Github.

GithubHesabıma gidip test-branchbunu seçersem bilgileri gösterir:

This branch is 1 commit ahead and 2 commits behind master

Sorularım:

  1. Bu bilgileri yerel olarak nasıl görüntüleyebilirim (ör: Githubbunu görmek için açmak yerine terminalde gösteren bir komut )?
  2. Şube kullanarak arasındaki farkları görebildiğimi biliyorum:

    git diff master..test-branch
    

    veya Meld(tercih ettiğim) kullanarak :

    git difftool master..test-branch
    

    ancak ön ve arka taahhütleri ayrı ayrı görmenin bir yolu olup olmadığını merak ediyordum . IE: 1'in kendi başına ilerlediğini ve sonra bu 2'nin kendi başına geri geldiğini göstermenin bir yolu var mı?



1
Git 2.5+ (2. Çeyrek 2015) tanıtılacak git for-each-ref --format="%(push:track)" refs/heads. Aşağıdaki cevabımı
VonC

1
Ben yazma üzereyim anahtar kelimeler kullanarak bu soruyu bulamadı Çünkü, sadece alarak bu miktarlar o notta istediğiniz göreli bir tamamlayıcı (veya "set farkı") kaydedilmesini kümeleri arasında bu dalları oluşturan (ve sonra öğeleri saymak). Umarım bu arama motoru endeksleri haline getirir.
pmos

Yanıtlar:


312

İşte iki dalı karşılaştırmak için bulduğum bir püf noktası ve her bir dalın diğerinden önce ne kadar taahhüt verdiğini göstermek (1. sorunuzda daha genel bir cevap):

İçin yerel şubeleri: git rev-list --left-right --count master...test-branch

İçin uzaktan dalları: git rev-list --left-right --count origin/master...origin/test-branch

Bu, aşağıdaki gibi çıktı sağlar:

1 7

Bu çıkış aracı: "karşılaştırıldığında master, test-branch7 kaydedilmesini önde ve 1 arkasında işlemek."

Ayrıca, yerel şubeleri uzak şubelerle karşılaştırabilirsiniz, örneğin origin/master...masteryerel masterşubenin uzaktaki karşılığının önünde / arkasında ne kadar taahhütte bulunduğunu öğrenmek için .


1
Bu, bir dalı silebilir miyim veya hala geliştirilmeden önce olup olmadığını öğrenmek için harika bir çözüm.
Maverick1st

1
@ Maverick1st, evet, bu komut özellikle gitflow iş akışını (ki ben)
izlediğinizde kullanışlıdır

2
Bu, mevcut özellik dalınızın uzak ana bilgisayarın ( git rev-list --left-right --count origin/master...@) arkasında olup olmadığını bulmak için kullanışım için en iyisidir - kullanıcının daha git fetchönce yaptığı şartıyla ; modası geçmiş şubelerden çekme taleplerini önlemek için yararlıdır.
jakub.g

9
Sadece kaç hareketin kontrol etmek arkasında akım dalıdır:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g

8
@ jakub.g kullanırsanız kesmeniz gerekmez --left-onlyveya--right-only
jasonkarns

39

Her şeyden önce yerel olarak kaç revizyon olduğunu görmek git fetchiçin uzaktan kumandanızdan en son bilgilere sahip olduğunuzdan emin olmak için bir yapmalısınız.

Varsayılan çıktı git statussize kaç revizyon olduğunu ileri veya geri söyler, ancak genellikle bunu çok ayrıntılı buluyorum:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Ben tercih ederim git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

Aslında bunu basitçe takma olarak kullanıyorum git sve bu durumu kontrol etmek için kullandığım ana komut.

"İlerideki revizyonlardaki" farkı görmek için, "revizyonların masterardındaki" ifadeyi hariç tutabilirim origin/master:

git diff master..origin/master^

"Arka revizyonlar" daki farkı görmek için origin/master, "ileri revizyonları" hariç tutabilirim master:

git diff origin/master..master^^

Önünde veya arkasında 5 düzeltme varsa, bu şekilde yazmak daha kolay olabilir:

git diff master..origin/master~5
git diff origin/master..master~5

GÜNCELLEME

İleri / geri düzeltmeleri görmek için dalın başka bir dalı izleyecek şekilde yapılandırılması gerekir. Benim için bu, uzak bir depoyu klonladığımda ve bir dalı ittikten sonra varsayılan davranıştır git push -u remotename branchname. Sürümüm 1.8.4.3, ancak hatırladığım sürece böyle çalışıyor.

Sürüm 1.8 itibariyle, izleme dalını şu şekilde ayarlayabilirsiniz:

git branch --track test-branch

1.7 sürümünden itibaren sözdizimi farklıydı:

git branch --set-upstream test-branch

Hangi sürümünü gitkullanıyorsunuz? Ne ile git statusne de ne ile elde edemiyorum git status -sb. Komutlardan birini denediğimde (yaptıktan sonra git fetch) önden / arkadan taahhütler hakkında herhangi bir bilgi almıyorum.
Gabriel

8
Önde ve arkada taahhütleri görme şekliniz uygulanır masterve origin/masterbu farkları masterve başka bir dalı görmek istiyorum test-branch. Cevabınızı bu sorunu çözebilir misiniz?
Gabriel

"Arkasında" ve "öncesinde" revizyonlarındaki fark sadece şube isimleri arasında (2 değil) 3 nokta kullanırsam benim için çalışır. Ve ^ ve ^^ burada önemli görünmüyordu Örneğin: git diff master ... origin / master git diff origin / master ... master Her neyse, "git status -sb" çok yardımcı oldu.
Vituel

10

Git 2.5+ ile, bir şubeye gönderilecek şekilde yapılandırılmış tüm dallar için ileri / geri görmek için başka bir seçeneğiniz vardır.

git for-each-ref --format="%(push:track)" refs/heads

" Unpushed Git Commits'i Görüntüleme "


Bunu sadece mevcut şube ve uzaktan izleme dalı için yapabilir misiniz?
spex

@spex yes: refs/headsmevcut dalın adıyla tamamlandı ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC

3

awkBiraz daha güzel yapmak için de kullanabilirsiniz :

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Her zaman önce başlangıç ​​noktasını alan ve daha sonra dalları karşılaştıran bir takma ad bile oluşturabilirsiniz.

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"

1

Git getirme işleminden sonra, yerel şubenin uzak sürümün önüne veya arkasına kaç tane taahhüt verdiğini göstermek için git durumunu çalıştırabilirsiniz.

Bu, farklı bir dalın önünde veya arkasında kaç taahhüt olduğunu göstermez. Seçenekleriniz tam fark, github'a bakma veya yukarıda bağlı Vimhsa gibi bir çözüm kullanma: Tüm repolar üzerindeki Git durumu

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.