Git - belirli bir dalın ilk yürütmesi nasıl bulunur


93

Aşağıdaki örnek ağaçta:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

F'yi arıyorum - xxx dalındaki ilk işlem. Bunun mümkün olduğunu düşünüyorum:

git log xxx --not master

ve son listelenen commit F olmalıdır. Doğru çözüm mü yoksa bazı dezavantajları var mı?

Stackoverflow ile ilgili benzer sorular olduğunu biliyorum, ancak kimse böyle bir çözüm önermedi ve bunu doğru yapıp yapmadığımdan emin değilim.


Yanıtlar:


111
git log master..branch --oneline | tail -1

"Şube" özel şube adınızdır. Nokta-nokta, şubenin sahip olduğu master'ın sahip olmadığı tüm işlemleri size verir. tail -1önceki çıktıdan son satırı döndürür.


3
bu yalnızca `` dal '' varsa işe yarar. Şube silinirse nasıl yaparsınız?
Oz123

2
@ Oz123 dalı HEAD veya sha1 veya etiket gibi herhangi bir ref ile değiştirilebilir. Ama belli ki bir çeşit referansa ihtiyacın var.
Zitrax

3
Bana beklediğimi vermiyor. Dalım (eski olan) zaten ana olarak birleştirildi, bu da xxx'deki tüm işlemlerin zaten ana sürümde olduğu anlamına geliyor. Yine de - o daldaki ilk işlemin hangisi olduğunu bilmem gerekiyor - ya da aslında - sadece o dalın taahhütlerinin geçmişini incelemem gerekiyor - usta olup olmadıkları umurumda değil.
Motti shneor

1
@MottiShneor nasıl birleştiğinize bağlı olarak, bu zor olabilir. Hızlı ileri sararsanız, dal hiç var olmamış gibi. Aksi takdirde, dallanma noktasını bulmanın birkaç yolunu listeleyen bu cevap ilginizi çekebilir . Şube noktanızı aldıktan sonra, SHA yerini alabilir masterve şubeniz silinmediği sürece git log <sha>..branch --oneline | tail -1size aradığınız sonuçları vermeye devam etmelidir.
ND Geek

1
--reverseGünlükleri geriye doğru renklerle vb. Okumak için kullanabilirsiniz .
Dominik

9

merge-baseTam olarak bunu çözmek için tasarlanmış işlevselliği kullanmalısınız :

git merge-base remotes/origin/<branch> develop 

Orijinal çatal noktasına geri dönmek isterseniz bunun işe yarayacağını sanmıyorum. Gelişimi <dal> olarak birleştirirseniz, birleştirme tabanı orijinal çatal noktasından daha yeni olacaktır.
Alexander Mills

5
Ayrıca, bu olur olup F işaret eder, ancak bir ana dal içinde işlemeye (OP çizimde çok zor olmasına rağmen, B veya C gibi görünüyor).
RomainValeri


1

Dalınız (eski olan) bir kez daha ana ile birleştirilirse beklenen sonucu vermez. İlk dal kesinleştirme kimliğini bulmak için python betiğini kullanıyorum.

git rev-list --first-parent changeset

--first-parent , bir birleştirme taahhüdünü gördükten sonra yalnızca ilk üst taahhüdü izler.

Üst dal bulunana kadar değişiklik kümelerini yukarıdaki komuttan yineleyin.

def status_check(exec_command, exec_dir=None, background=False):
    if exec_dir:
        os.chdir(exec_dir)
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if not background:
        result = res.communicate()
    return result



def findNewBranchCommits(changeset=None):
    cmd = "git rev-list --first-parent "+ changeset
    rev_list = status_check(cmd,self.module_dir)
    rev_list = str(rev_list[0]).split('\n')
    rev_list = list(filter(None, rev_list))
    for x in rev_list:                      # Iterate until branch base point
        rev_cmd = "git branch --contains " + x
        rev_cmd = status_check(rev_cmd,self.module_dir)
        rev_cmd = str(rev_cmd[0]).split('\n')
        if(len(rev_cmd) > 2): 
            print "First Commit in xxx branch",x
            break

findNewBranchCommits(changeset)

0
git cherry master -v | tail -1   

ancak bu size yalnızca xxx dalındaki ana işlemde olmayan ilk kesinlemeyi verecektir, dal xxx'deki ilk kesinlemeyi vermeyecektir. ikincisi, xxx dalının silinmesi ve / veya bir veya daha fazla kez yeniden oluşturulması durumunda zor olacaktır. bu durumda aşağıdakileri deneyebilirsiniz:

git reflog | grep checkout | grep xxx | tail -1   

3
head -n 1Bunun yerine yazmak mı istedin tail -1? tail -1ilk yerine en son kaydetmeyi döndürür.
Nelu

0

Bu komutu denedim ve işe yaradı:

git log <source_branch> <feature_branch> --oneline | tail -1

-1

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1


Benim repomda bu, xxx dalının 1. commit'ini değil, master'dan xxx dalına son birleştirmeden sonraki 1. commit'i gösterir.
jk7
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.