2016-05-05 13 views
3

Wenn ich zwischen Zweigen zusammenfasse, führt Git eine rekursive Zusammenführung mit Konflikten durch und setzt <<<<<<< Temporary merge branch x Blöcke.git-merge-base gibt nur einen Commit zurück

Ich die Zusammenführung abbrechen, und dann git merge-base <source-commit> <target-commit> tun, aber es gibt nur eine SHA1 zurück.

Ist es möglich herauszufinden, was die Mehrfachbasis-Commits sind?

Antwort

4

Sie möchten die Option --all zu git-merge-base. Aus der Dokumentation:

-a, --all 
    Output all merge bases for the commits, instead of just one. 

Dadurch werden alle Merge-Basen zeigen, die verwendet wird, um einen temporären Baum als rekursive merge Basis zu schaffen.

Betrachten wir zum Beispiel einige Zweige ‚A‘ und ‚B‘, die kreuz und quer waren verschmolzen:

 3a4f5a6 -- 973b703 -- a34e5a1 (branch A) 
    /  \/
7c7bf85   X 
     \  /\ 
     8f35f30 -- 3fd4180 -- 723181f (branch B) 

Es ist klar, dass Zweige A und B zwei gemeinsame Vorfahren haben, die in einem kreuz und quer beteiligt waren Zusammenführen: 3a3f5a6 und 8f35f30. git-merge-base wird ein der gemeinsamen Vorfahren als merge Basis wählen, aber die --all Flag verwendet wird, schließen sowohl:

% git-merge-base A B 
3a3f5a6ec1c968d1d2d5d20dee0d161a4351f279 
% git-merge-base --all A B 
3a3f5a6ec1c968d1d2d5d20dee0d161a4351f279 
8f35f30bfe09513f96cf8aa4df0834ae34e93bae 

In dieser Situation, wie Sie beachten, würde git-merge-recursive die beiden merge Basis verschmelzen, um eine virtuelle zu erstellen Commit, das als der eigentliche gemeinsame Vorgänger für den Dreiwege-Merge-Algorithmus verwendet wird.

+0

Perfekt, ich habe es vermisst, dass in der Docs, ich werde es versuchen. In Ihren Kommentaren scheint es, Sie sagten, 973b703 und 3fd4180 sind die gemeinsamen Vorfahren. Sind das nicht 3a4f5a6 und 8f35f30? – Lee

+0

Hah, ja, verzeih mir. Mein Write-up war falsch, ich konnte offensichtlich die Grafik * oder * die Ausgabe des Tools nicht lesen. Bearbeitet. –

+2

Im Idealfall haben alle Zusammenführungsbasen identische Bäume, und das dazwischen liegende Zusammenführungsprodukt ist mit allen seinen Eingaben identisch. In der Praxis, gelegentlich nicht, wie Sie (OP) gefunden haben! :-) Noch eine Anmerkung, eine Weile zurück habe ich den Code für Merge-Recursive überprüft: Wenn es drei oder mehr Merge-Basen gibt, ist der Prozess tatsächlich auf diesen Basen iterativ. Das heißt, zuerst merge die "all" -Liste, merge dann die ersten beiden zusammen und fügt dann jeden weiteren Eintrag wiederholt in das Merge-Ergebnis ein. – torek

0

Weitere Informationen zum erneuten Zusammenführen einer bestimmten Datei mit einer bestimmten Basis finden Sie unter this answer bis your related question. [Historischer Hinweis: Das OP hat die Frage gelöscht, aber jetzt wiederbelebt; Ich hatte die Antwort hier, aber es gehört dorthin; daher alle diese Links ....]

+0

Danke für deine Zeit, ich habe die Frage, auf die du dich beziehst, wiederhergestellt, zögere nicht, diese Antwort zu verschieben :) http://stackoverflow.com/questions/37049055/git-choose-simpler-base-in -rekursive Zusammenführung – Lee

Verwandte Themen