2010-12-26 12 views
32

Użyłem git-winy, aby znaleźć konkretne zatwierdzenie. Teraz chcę znaleźć oddział, z którego pochodzi. (Stamtąd użyję nazwy oddziału, aby znaleźć konkretny bilet)Pokaż oryginalną gałąź zatwierdzenia

Zdefiniujmy "oryginalną gałąź" jako "gałąź, do której dokonano zatwierdzenia, zanim oddział został połączony z jakimkolwiek innym oddziałem".

Odpowiedz

40

Jak inni powiedział, jeśli oddział szukasz nie jest lokalny do repozytorium, na których obwiniają to commit (np oddział tylko w osobistym repo odległego deweloper), jesteś pijany.

Ale zakładając, że poszukiwanym oddział jest coś, co można zobaczyć, i że oczywiście masz hash popełnienia na, powiedzmy d590f2..., częściową odpowiedzią jest to, że można zrobić:

$ git branch --contains d590f2 
    tests 
* master 

Potem tylko do potwierdzić masz winowajcę:

$ git rev-list tests | grep d590f2 

oczywiście, jeśli d590f2 zostały połączone w więcej niż jeden oddział, będzie musiał być bardziej subtelne niż to.

7

To nie ma zastosowania w git. Odgałęzienia są lokalnymi pojęciami dla każdego repozytorium: jedna gałąź "lokalna" może być zupełnie oddzielna od gałęzi "lokalne" danej osoby. Jeśli zrobisz coś takiego, jak patrzenie na główną gałąź integracji i zatwierdzanie kwerend oraz usuwanie wszystkich scalonych baz między tymi dwoma, powinieneś być w stanie uzyskać poddrzewo z historii commitów, które może rzucić trochę światła ... lub może nie . na przykład jeśli prześledzisz link z wyrażenia commit w kierunku "master", powinieneś mieć nadzieję, że znajdziesz połączenie commge z przydatnymi komentarzami mówiącymi, skąd pochodzi scalenie ... ale ta informacja jest tylko informacyjna, a nie zapisana w sposób, który ma być automatycznie pobrany.

np. gitk some-commit...master (co jest prawie skrótem od gitk some-commit master --not $(git merge-base some-commit master))

6

Oddział Git to nic innego jak "nazwany wskaźnik do zatwierdzenia" (to fundamentalna odmienna koncepcja niż w innych znanych VCS).

Ta sytuacja wynika, popełnienia jest branch-1, popełnienia B na branch-2:

o A [branch-1] 
    | 
o | B [branch-2] 
| | 

Po połączeniu to staje się jasne, czy A (lub B), pierwotnie w branch-1 lub branch-2:

o [branch-1] [branch-2] 
| 
o merged 
|\ 
| o A 
| | 
o | B 
| | 

Być może można się domyślić, w jakim odgałęzieniu Git było zatwierdzenie A, jeśli oznakowałeś nadrzędne przypisania A, np. release-1 i wiesz, że ten tag został podany tylko dla zatwierdzeń w branch-1.

o [branch-1] [branch-2] 
| 
o merged 
|\ 
| o A 
| | 
o | B 
| | 
| o <release-1] 
| | 
+0

Ściśle mówiąc, tylko niemożliwe, jeśli połączenie jest szybko przekazywane. Jeśli wszystkie scalenia są wykonywane z '--no-ff', to git zachowuje również historię gałęzi. Po prostu wykonaj 'git log - graph $ commit_id .. HEAD' – slebetman

+5

Ogólnie rzecz biorąc, w Git, zatwierdzenia nie znajdują się w oddziałach, gałęzie są zatwierdzane. –

6

Próbuję, proszę, skomentuj, ponieważ nie jestem całkowicie pewien, ale uważam, że spełnia swoją funkcję.

Poniższe zadziała tylko wtedy, gdy gałęzie nadal wskazują na końcówce przed połączyły się pana, który jest w przypadku, gdy oddziały były na tym samym repo:

o [master] 
| 
o merged branch "great-feature" into master 
|\ 
| o A [great-feature] 
| | 
o | B 
| | 

Jeśli to nie przypadku (na przykład, jeśli wyciągnąłeś z innego repozytorium), możesz je odtworzyć ręcznie.

najpierw uzyskać oddziały gdzie popełnić to:

$ git branch -a --contains=<sha-of-B> 
*master 
great-feature 

następnie dla każdej gałęzi uzyskać liczbę zatwierdzeń, które oddzielają ich głowy do zatwierdzenia: jest to liczba wierszy dziennika wyjście git na określony zakres:

$ git log --pretty=oneline <sha-of-B>..great-feature | wc -l 
1 
$ git log --pretty=oneline <sha-of-B>..master | wc -l 
4 

Zatem B jest najbliżej wspaniałej cechy, co oznacza, że ​​zostało w niej utworzone.

To może być wykonane w ładnym skryptu, nie krępuj się, aby dodać go do odpowiedzi (nie jestem w tym dobry)

+0

Myślę, że możesz użyć 'git rev-list -count' zamiast pipingu' git log' do 'wc'. –

1

znalazłem prostszy sposób to zrobić: to w komunikacie z ostatniego zatwierdzić z git log <sha>..HEAD --merges!

To polecenie pokazuje scalenia, które nastąpiły między wzorcem a zatwierdzeniem; ostatnim wynikiem zatwierdzenia przez to polecenie jest pierwsze zatwierdzenie łączenia, które go zawiera. Zwykle zawiera nazwę oddziału, więc nawet jeśli gałąź została usunięta, możesz znaleźć jej nazwę.

Aby uzyskać tylko nazwę oddziału, wystarczy wpisać git log <sha>..HEAD --merges --oneline |tail -1

+1

Dotyczy to tylko przypadków, w których nie było szybkiego łączenia w przód. – meagar

+0

@meagar zgadzam się, na bocznej nucie połączenie funkcji z mistrzem z przewijaniem do przodu nie jest dobrą praktyką, z tego konkretnego powodu: fajniej jest zobaczyć w historii, że funkcja została scalona – CharlesB

+0

Dziękuję CharlesB, właśnie uratowałeś mój bekon. Przypadkowo usunąłem oddział zdalny i nie miałem lokalnego refloga, ponieważ mój projekt znajdował się na innym komputerze, do którego nie mam dostępu. Muszę więc zrekonstruować ostatnie zatwierdzenie przed scaleniem, abym mógł wskrzesić gałąź. –

4

pierwsze zapewnić Ci pobranych zmian z pilotów

$ git fetch --all 

I

$ git branch -a --contains d590f2 

Bez -a opcji możesz nie znaleziono commitów istniejących tylko w odległych oddziałach

+0

Ta odpowiedź jest najbardziej poprawna. – kivagant

-1

To działało na tyle dobrze dla mnie, aby uzyskać nazwę oddziału z jednorodzinnego głowy w obszarze roboczym Jenkins:

git show -s --pretty=%d

1

Wydaje się, że nie jest to kwestia, że ​​to możliwe, aby odpowiedzieć ze 100% precyzją poprzez git .

git branch --contains --merge <sha1> 

zwraca listę wszystkich gałęzi, do których zatwierdzono scalenie i oryginalną gałąź. --niepołączone zwraca wszystkie kolejne gałęzie, które zawierają zatwierdzenie, ponieważ rozgałęziały się po punkcie scalenia.

Tak, można uzyskać listę każdy połączyć ale nie oryginalny oddział i każdy oddział usunięte przed dowodzić wykonanie jest stracone (lub patrząc na reflogs)

Wyniki

git branch --contains <sha1 for "added feature/inital 1"> 
* develop 
    feature/inital 
    feature/subsequent1 

git branch --contains <sha1 for "added feature/inital 1"> --merged 
* develop 
    feature/inital 

git branch --contains <sha1 for "added feature/inital 1"> --no-merged 
    feature/inital 

Skrypt testowy

function mkbranch { 
    git checkout -b $1 
    git push --set-upstream origin $1 
} 

# Develop 
mkbranch develop 
for f in 1 2 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "added develop $f"; done 
git push 

# Initial Feature Branch 
mkbranch feature/inital 
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/inital $f"; done 
git push 

# Merge 
git checkout -b develop 
git merge feature/inital 
git push 


# Next Feature Branch 
mkbranch feature/subsequent1 
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/subsequent1 $f"; done 
git push 
1

Kiedy jesteś w oddziale "oryginalny oddział" został połączony z. można uruchomić:

git log <SHA>..HEAD --ancestry-path --merges 

Ta komenda pokaże wszystkie merge zobowiązuje między <SHA>..HEAD. Potrzebujesz ostatniego.

Na przykład dla c0118fa commit (przedostatnim) "oryginalny oddział" jest redesign_interactions

* ccfd449 (HEAD -> develop) Require to return undef if no digits found 
* 93dd5ff Merge pull request #4 from KES777/clean_api 
|\ 
| * 39d82d1 Fix tc0118faests for debugging debugger internals 
| * ed67179 Move &push_frame out of core 
| * 2fd84b5 Do not lose info about call point 
| * 3ab09a2 Improve debugger output: Show info about emitted events 
| * a435005 Merge branch 'redesign_interactions' into clean_api 
| |\ 
| | * a06cc29 Code comments 
| | * d5d6266 Remove copy/paste code 
| | * c0118fa Allow command to choose how continue interaction 
| | * 19cb534 Emit &interact event 

Należy uruchomić:

git log c0118fa..HEAD --ancestry-path --merges 

i przewiń w dół do ostatniego zatwierdzenia. Który jest:

commit a435005445a6752dfe788b8d994e155b3cd9778f 
Merge: 0953cac a06cc29 
Author: Eugen Konkov 
Date: Sat Oct 1 00:54:18 2016 +0300 

    Merge branch 'redesign_interactions' into clean_api 
Powiązane problemy