Git - jak znaleźć pierwsze zatwierdzenie określonej gałęzi

93

W poniższym drzewie przykładowym:

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

Szukam F - pierwszego zatwierdzenia w gałęzi xxx. Myślę, że jest to możliwe dzięki:

git log xxx --not master

a ostatnim wymienionym zatwierdzeniem powinno być F. Czy jest to poprawne rozwiązanie, czy może ma jakieś wady?

Wiem, że były podobne pytania dotyczące stackoverflow, ale nikt nie zaproponował takiego rozwiązania i nie jestem pewien, czy zrobię to dobrze.

user2699113
źródło

Odpowiedzi:

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

Gdzie „oddział” to nazwa Twojej gałęzi. Kropka-kropka daje ci wszystkie zatwierdzenia, których gałąź ma, której nie ma ten master. tail -1zwraca ostatnią linię z poprzedniego wyjścia.

konyak
źródło
3
działa to tylko wtedy, gdy istnieje `gałąź`. Jak byś to zrobił, gdyby usunięto oddział?
Oz123
2
@ Oz123 gałąź można zastąpić dowolnym ref, takim jak HEAD, sha1 lub tag. Ale oczywiście potrzebujesz jakiegoś odniesienia.
Zitrax
3
Nie daje mi tego, czego oczekiwałem. Moja gałąź (stara) została już scalona z powrotem do mastera, co oznacza, że ​​wszystkie zatwierdzenia w xxx są już w master. Mimo to - muszę wiedzieć, który commit był pierwszym w tej gałęzi - a właściwie - muszę zbadać historię zatwierdzeń samej tylko tej gałęzi - nie obchodzi mnie, czy są na master, czy nie.
Motti Shneor
1
@MottiShneor, w zależności od sposobu połączenia, może to być trudne. Jeśli przewinąłeś do przodu, to tak, jakby gałąź nigdy nie istniała. W przeciwnym razie możesz być zainteresowany tą odpowiedzią , która zawiera listę sposobów znalezienia punktu rozgałęzienia. Gdy masz już punkt odgałęzienia, SHA może zastąpić masteri, o ile twoja gałąź nie zostanie usunięta, git log <sha>..branch --oneline | tail -1powinna nadal dawać wyniki, których szukasz.
ND Geek
1
Możesz użyć --reversedo czytania logów od tyłu z kolorami itp.
Dominik
8

Powinieneś użyć merge-basefunkcji, która jest przeznaczona do rozwiązania dokładnie tego problemu:

git merge-base remotes/origin/<branch> develop 
Fabrizio Stellato
źródło
Nie sądzę, żeby to zadziałało, jeśli chcesz wrócić do pierwotnego punktu rozwidlenia. Jeśli scalisz rozwój w <branch>, podstawa scalania będzie nowsza niż oryginalny punkt rozwidlenia.
Alexander Mills,
5
Ponadto nie wskazywałoby to na F, ale na zatwierdzenie w gałęzi głównej (chociaż trudne do zobaczenia na rysunku OP, wydaje się, że jest to B lub C).
RomainValeri
5
git cherry master -v | head -n 1
Nelu
źródło
1

Jeśli twoja gałąź (stara) ponownie scalona z powrotem do mastera nie daje oczekiwanego wyniku, używam skryptu Python, aby znaleźć początkowy identyfikator zatwierdzenia gałęzi.

git rev-list - zestaw zmian pierwszego rodzica

--first-parent podąża za zatwierdzeniem tylko pierwszego rodzica po zobaczeniu zatwierdzenia scalającego.

Iteruj zestaw zmian od powyższego polecenia, aż zostanie znaleziona gałąź nadrzędna.

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)
Nayagam
źródło
0
git cherry master -v | tail -1   

jednakże da ci to tylko pierwsze zatwierdzenie w gałęzi xxx, która nie znajduje się w gałęzi master, a nie pierwsze zatwierdzenie w gałęzi xxx kiedykolwiek. to drugie byłoby trudne, gdyby gałąź xxx została usunięta i / lub ponownie utworzona jeden lub więcej razy. w takim przypadku możesz spróbować następujących rzeczy:

git reflog | grep checkout | grep xxx | tail -1   
Doc Unid
źródło
3
Czy head -n 1zamiast tego chciałeś pisać tail -1? tail -1zwraca najnowsze zatwierdzenie zamiast pierwszego.
Nelu
0

Wypróbowałem to polecenie i zadziałało:

git log <source_branch> <feature_branch> --oneline | tail -1
Abderrahmen
źródło
-1

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

wedens
źródło
W moim repozytorium pokazuje to pierwsze zatwierdzenie od ostatniego scalenia z mastera do gałęzi xxx, a nie pierwsze zatwierdzenie gałęzi xxx.
jk7