Git: İki dalın en yeni ortak atalarını bulun


844

İki Git şubesinin en son ortak atalarını nasıl bulabilirim?


3
En yeni tanımla: gerçek dünya saati, taahhüt sayısı, diğer metrik?
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

2
İlgili (criss-cross
merges

1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 herhangi bir metrikte aynı, değil mi?
YakovL

@YakovL Dallanma nedeniyle hayır inanıyorum ve taahhüt nesnelerinize keyfi kesin tarihler ayarlayabildiğiniz için: bu tarihin kendisi muhtemelen istediğiniz şey değildir.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1
@CiroSantilli 中心 改造 中心 996ICU 六四 to bana öyle geliyor ki, sadece ağaçtaki son ortak işlemden önce daha eski bir zaman damgası olan bir taahhüt varsa farklı olabilir. Daha az önemsiz bir örnek verebilir misiniz?
YakovL

Yanıtlar:


1019

Arıyorsun git merge-base. Kullanımı:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

85
Unutmayın ki bu en son ortak atayı bulur. Sadece dikkat edin, kimse buraya geldiğinde (benim yaptığım gibi) en eski ortak atayı bulmaya çalışıyorsa - bunun için ayrıca bakınız: stackoverflow.com/questions/1527234/…
9'da 52

16
@funroll: Veya bunun için stenografi:git log master...HEAD
CB Bailey

17
@lindes en eski ortak ata ilk taahhüt olmaz mı?
Thorbjørn Ravn Andersen

8
@ ThorbjørnRavnAndersen, evet, sanırım öyle ... Açıklamanın zorluğu git'in Yönlü Bir Döngüsel Grafik kullandığı gerçeğiyle birlikte geliyor ve yine de teknik olarak olmadığı bir ağaç olarak düşünülüyor. İfadelerimde daha dikkatli olmak için, "dallar" ın ilk örneğinin ebeveyninin ayrılmasını istediğiniz durumdan bahsediyordum ... çünkü yeniden birleşip yeniden ayrıldıkları birden fazla noktaya sahip olabilirler, bu Bunların "en eski "'si, ama gerçekte en eski ata değil, (bence) her zaman ilk taahhüttür.
4'te lindes

5
Bu soru kesinlikle iki dalın ortak bir atasını bulmakla ilgili olsa da , üç veya daha fazla dalın ortak atalarını isteyen herkes --octopus, doğru sonucu elde etmek için bayrağı geçmeleri gerektiğini not etmelidir . Açık ama yanlış git merge-base branch1 branch2 branch3size bir taahhüt verecektir, ancak dokümanlardaki Tartışma bölümünde açıklandığı gibi , her üç dalın da ortak bir atası değildir .
Mark Amery

46

git diff master...feature

mevcut (büyük olasılıkla çoklu taahhüt) özellik dalınızın tüm yeni taahhütlerini gösterir.

man git-diff belgeler:

git diff A...B

aynıdır:

git diff $(git merge-base A B) B

ancak ...yazması ve hatırlaması daha kolaydır.

Dave'in belirttiği gibi , özel durumu HEADatlanabilir. Yani:

git diff master...HEAD

aynıdır:

git diff master...

mevcut dal ise bu yeterlidir feature.

Son olarak, siparişin önemli olduğunu unutmayın! Bunu git diff feature...masteryaptığınızda, açık masterolmayan değişiklikler gösterilir feature.

Daha fazla git komutunun sözdizimini desteklemesini dilerdim, ama yaptıklarını sanmıyorum. Ve hatta bazıları için farklı semantikler var ...: Git taahhüt aralıklarında çift nokta ".." ve üçlü nokta "..." arasındaki farklar nelerdir?


8
Ya da sadece farklı bir git diff master...özel durumdaHEAD
Dave

"..." powershell benim için işe yaramadı, komik git konsolda çalıştı belki repo tamamlanmadı, git diff $ (git merge-base AB) B yaptı ve git için biraz yeni olduğum için Bunun dalları birleştirebileceğinden biraz şüpheliydim :)
Moiz Ahmed

1
vay. oldukça harika. ve hiçbir zaman teslim almadığınız için yerel şubenizde bulunmayan şube yoksa, bunu yapabilirsinizgit diff origin/branchname...
Mark Ch

25

Önceki bir cevapta belirtildiği gibi git merge-baseçalışır:

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

ancak myfeaturegeçerli dal ise, yaygın olduğu gibi, kullanımı kullanabilirsiniz --fork-point:

$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

Bu argüman sadece git'in son sürümlerinde işe yarar. Ne yazık ki her zaman işe yaramıyor ve neden olduğu belli değil. Lütfen bu cevabın sonuna doğru belirtilen sınırlamalara bakınız .


Tüm taahhüt bilgileri için şunları göz önünde bulundurun:

$ git log -1 $(git merge-base --fork-point develop) 

Ben var git version 2.14.1.windows.1. Koşu git merge-base --fork-point branch2bir şube ile (kendi kaydedilmesini birlikte) olduğunu bildiğim hiçbir sonuç vermez geçerli şubesinden çatallı olan, oysa git merge-base branch1 branch2doğru çatal noktasını gösterir. Sorun ne olabilir?
ADTC

@ ADTC Checkout branch2ve ardından çalıştırın git merge-base --fork-point branch1.
Acumenus

@ADTC gitkAğacın neye benzediğini görmek için grafiksel bir gösterim görüntüleyici, örn . Vb. Kullanın . Belki cevabını alacaksın.
Acumenus

Grafik olarak görüntülerken ağaç hakkında tuhaf bir şey görmüyorum. Yolları izleyebilir ve sonucuna uyan ortak ataları bulabilirim git merge-base branch1 branch2. Ama garip olan --fork-pointher iki şekilde de hiçbir şey vermiyor. İstediğiniz gibi çalıştığını onayladınız mı?
ADTC

1
@ADTC ile aynısını alıyorum. 'Git log -1 $ (git merge-base --fork-point anotherBranch)' komutu git sürüm 2.16.2.windows.1 kullanılarak herhangi bir sonuç göstermez.
masinger

10

İle gitkiki dalı grafik olarak görüntüleyebilirsiniz:

gitk branch1 branch2

Ve sonra iki dalın tarihinde ortak ata bulmak kolaydır.


6
Her durumda her şey görsel olarak yapılamaz. İşlerin programlı olarak otomatik hale getirilmesi gerekmesinin nedenleri vardır.
ADTC
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.