Git - як знайти перший коміт конкретної гілки


93

У наступному прикладі дерева:

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

Я шукаю F - перший коміт у гілці xxx. Я думаю, що це можливо за допомогою:

git log xxx --not master

і останній перерахований коміт повинен бути F. Це правильне рішення чи, можливо, є деякі недоліки?

Я знаю, що були подібні запитання щодо stackoverflow, але ніхто не пропонував такого рішення, і я не впевнений, чи правильно це роблю.


Можливий дублікат stackoverflow.com/questions/6058308 / ...
nyzm

Відповіді:


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

Де "філія" - це ваша конкретна назва філії. Крапка-точка надає вам усі коміти, які гілка має, що немає у майстра. tail -1повертає останній рядок з попереднього виводу.


3
це працює лише в тому випадку, якщо існує гілка. Як би ви це зробили, якщо гілку видалено?
Oz123

2
@ Oz123 гілка може бути замінена будь-яким посиланням, наприклад HEAD, sha1 або тегом. Але, очевидно, вам потрібна якась довідка.
Zitrax

3
Не дає мені того, на що я очікував. Мою гілку (стару) вже було об’єднано з master, що означає, що всі коміти в xxx вже в master. Тим не менше - мені потрібно знати, який коміт був першим на цій гілці - або насправді - мені потрібно вивчити історію комітів цієї гілки самостійно - мені все одно, головний він чи ні.
Motti Shneor

1
@MottiShneor, залежно від того, як ви об’єдналися, це може бути складно. Якщо ви зробили перемотування вперед, це наче гілка ніколи не існувала. В іншому випадку вас може зацікавити ця відповідь , де перелічено ряд способів знайти точку відгалуження. Після того, як у вас є точка відгалуження, SHA може замінити її master, і поки ваша гілка не буде видалена, вона git log <sha>..branch --oneline | tail -1все одно надаватиме вам результати, які ви шукаєте.
ND Geek

1
Ви можете використовувати --reverseдля читання журналів назад кольорами тощо
Домінік

8

Ви повинні використовувати merge-baseфункціонал, призначений для вирішення саме цього:

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

Я не думаю, що це спрацює, якщо ви хочете повернутися до початкової точки розгалуження. Якщо ви об'єднаєте розробку в <branch>, основа злиття буде новішою, ніж вихідна точка форка.
Олександр Міллс

5
Крім того, це буде вказувати не на F, а на коміт у гілці master (хоча це важко побачити на кресленні OP, схоже, це B або C).
RomainValeri


1

Якщо ваша гілка (стара) знову об'єднана назад у master не дає очікуваного результату. Я використовую скрипт python для пошуку початкового ідентифікатора коміту гілки.

git rev-list --перший батьківський набір змін

--перший з батьків виконує лише перший батьківський коміт, побачивши коміт злиття.

Ітераціюйте набір змін зверху, доки не знайдеться батьківська гілка.

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   

однак це дасть вам лише перший коміт у гілці xxx, який не є в master, а не перший коміт у гілці xxx коли-небудь. останнє буде важким, якщо гілку xxx було видалено та / або заново створено один або кілька разів. у цьому випадку ви можете спробувати наступне:

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

3
Ви мали намір писати head -n 1замість tail -1? tail -1повертає найновіший коміт замість першого.
Нелу


-1

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


У моєму репо це показано перший коміт з моменту останнього злиття з ведучого у гілку xxx, а не перший коміт гілки xxx.
jk7,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.