2013-08-23 17 views
39

Nel seguente esempio albero:Git - come trovare primo commit di una specifica branca

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

Sto cercando F - il primo commit nel ramo xxx. Penso che sia possibile con:

git log xxx --not master 

e l'ultimo elencato commit dovrebbe essere F. È corretto soluzione o forse ci sono alcuni svantaggi di esso?

So che c'erano domande simili sullo stackoverflow, ma nessuno ha proposto tale soluzione e non sono sicuro di farlo nel modo giusto.

+0

Eventuali duplicati di http://stackoverflow.com/questions/6058308/in-git-how-can-i-find-the-revision-at-which-a-branch-was-created – nyzm

risposta

-3

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

+0

In il mio repo mostra il primo commit dall'ultima fusione dal master al branch xxx, non il primo commit del branch xxx. – jk7

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

dot-dot ti dà tutti i commit che il ramo ha che il maestro non ha. tail -1 restituisce l'ultima riga dall'output precedente.

+2

funziona solo se 'branch''exists. Come lo faresti se il ramo viene cancellato? – Oz123

+1

@ Il ramo Oz123 può essere sostituito da qualsiasi riferimento, come HEAD o sha1 o tag. Ma ovviamente hai bisogno di un qualche tipo di riferimento. – Zitrax

+2

Non mi dà quello che mi aspettavo. Il mio ramo (quello vecchio) era già stato riunito al master, il che significa che tutti i commit in xxx sono già in master. Eppure - ho bisogno di sapere quale commit è stato il primo su quel ramo - o in realtà - ho bisogno di esaminare la storia dei commit di quel ramo da solo - non mi interessa se sono sul master o no. –

0

si consiglia di utilizzare la funzionalità merge-base che è stato progettato per risolvere esattamente questo:

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

Se il ramo (vecchio), ancora una volta si è fusa ritorna al maestro non dà result.I attesi usufruendo script python per trovare l'ID di commit della diramazione iniziale.

git rev-list --first-genitore changeset

--first-genitore seguono solo il primo genitore commettere dopo aver visto una fusione commesso.

Iterare il set di modifiche dal comando precedente finché non è stato trovato il ramo padre.

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) 
Problemi correlati