2013-08-23 5 views
39

Im folgenden Beispiel Baum:Git - wie zuerst findet spezifischen Zweig verpflichten

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

ich für F suchen - die ersten in xxx Zweig begehen. Ich denke, dass es möglich ist, mit:

git log xxx --not master 

und den letzten commit aufgeführt sein soll F. Ist es richtig, Lösung oder vielleicht gibt es einige Nachteile davon?

Ich weiß, dass es ähnliche Fragen zu Stackoverflow gab, aber niemand schlug eine solche Lösung vor, und ich bin mir nicht sicher, ob ich es richtig mache.

+0

Mögliche Duplikat http://stackoverflow.com/questions/6058308/in-git-how-can-i-find-the-revision-at-which-a-branch-was-created – nyzm

Antwort

-3

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

+0

In Mein Repo zeigt das erste Commit seit der letzten Zusammenführung vom Master in den Zweig xxx, nicht das erste Commit des Zweigs xxx. – jk7

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

Punkt-Punkt gibt Ihnen alle Commits, dass der Zweig, der Meister hat nicht hat. tail -1 gibt die letzte Zeile der vorherigen Ausgabe zurück.

+2

dies funktioniert nur, wenn 'branch'' existiert. Wie würden Sie es tun, wenn Zweig gelöscht wird? – Oz123

+1

@ Oz123 Zweig kann durch jede ref, wie HEAD oder ein sha1 oder ein Tag ersetzt werden. Aber offensichtlich brauchen Sie eine Art Referenz. – Zitrax

+2

Gibt mir nicht, was ich erwartet hatte. Mein Zweig (alter) wurde bereits wieder mit dem Master zusammengeführt, was bedeutet, dass alle Commits in xxx bereits im Master sind. Trotzdem - ich muss wissen, welcher Commit WAS der erste in diesem Zweig war - oder eigentlich - ich muss die Geschichte der Commits dieses Zweiges allein untersuchen - es ist mir egal, ob sie Master sind oder nicht. –

0

sollten Sie verwenden die merge-base Funktionalität, die genau zu lösen ausgelegt ist dies:

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

Wenn Ihr Zweig (alte) wieder zurück zum Master fusionierte nicht erwartet result.I geben haben Python-Skript um die Initial Branch Commit Id zu finden.

git rev-list --first-parent changeset

--first-parent nur der erste Elternteil eine Zusammenführung beim Anblick begehen begehen folgen.

Iterate Changeset von oben Befehl, bis übergeordneten Zweig gefunden.

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)