Die verschiedenen Methoden unten sind pragmatische, nützliche und funktionierende Methoden, um auf eine wahrscheinliche Antwort zu schließen. Beachten wir jedoch, dass die Frage selbst in git ein Missverständnis darstellt und Commits nicht aus Zweigen stammen. Zweige kommen und gehen, sie bewegen sich, nur Commits repräsentieren die wahre Repo-Geschichte. Andererseits ist dies keine Möglichkeit zu sagen, dass die folgenden Lösungen schlecht sind. Nur wissen, dass keiner von ihnen eine absolut vertrauenswürdige Antwort gibt, die von Design in Git nicht erreichbar ist. (Ein einfacher Fall ist das Löschen von Zweigen: Ich verzweige, ich schreibe zweimal fest, ich verschmelze in einen anderen Zweig, ich lösche den ersten Zweig. Woher kommt das
Festschreiben
1
Ich habe einen Fall, in dem ich explizit einen flachen Klon der Tiefe 1 aus einem Tag ziehe. Es ist billig und einfach und effizient ... und hat bis jetzt alles wunderbar gemacht, was ich wollte. Jetzt, da ich wissen möchte, auf welchem Zweig sich das Tag befand, bin ich zumindest für dieses Detail abgespritzt. Sie können nicht immer nach Hause gehen, lol
Paul Hodges
Antworten:
864
Während Dav richtig ist, dass die Informationen nicht direkt gespeichert sind, heißt das nicht, dass Sie es nie herausfinden können. Hier sind einige Dinge, die Sie tun können.
Suchen Sie nach Zweigen, für die das Commit aktiviert ist
git branch -a --contains <commit>
Hier erfahren Sie alle Zweige, die in ihrer Geschichte das angegebene Commit haben. Dies ist natürlich weniger nützlich, wenn das Commit bereits zusammengeführt wurde.
Durchsuchen Sie die Reflogs
Wenn Sie in dem Repository arbeiten, in dem das Commit durchgeführt wurde, können Sie die Reflogs nach der Zeile für dieses Commit durchsuchen. Reflogs, die älter als 90 Tage sind, werden von git-gc beschnitten. Wenn das Commit also zu alt ist, werden Sie es nicht finden. Das heißt, Sie können dies tun:
git reflog show --all | grep a871742
Commit finden a871742. Beachten Sie, dass Sie die abgekürzten 7 ersten Ziffern des Commits verwenden MÜSSEN. Die Ausgabe sollte ungefähr so aussehen:
a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite
Dies zeigt an, dass das Commit für den Zweig "Abschluss" vorgenommen wurde. In der Standardausgabe werden abgekürzte Commit-Hashes angezeigt. Suchen Sie daher nicht nach dem vollständigen Hash, da Sie sonst nichts finden.
git reflog showist eigentlich nur ein Alias für git log -g --abbrev-commit --pretty=oneline. Wenn Sie also mit dem Ausgabeformat herumspielen möchten, um verschiedene Dinge zur Verfügung zu stellen, nach denen Sie suchen können, ist dies Ihr Ausgangspunkt!
Wenn Sie nicht in dem Repository arbeiten, in dem das Commit durchgeführt wurde, können Sie in diesem Fall am besten die Reflogs untersuchen und feststellen, wann das Commit zum ersten Mal in Ihr Repository eingeführt wurde. Mit etwas Glück haben Sie den Zweig geholt, für den er bestimmt war. Dies ist etwas komplexer, da Sie nicht gleichzeitig den Commit-Baum und die Reflogs durchlaufen können. Sie möchten die Reflog-Ausgabe analysieren und jeden Hash untersuchen, um festzustellen, ob er das gewünschte Commit enthält oder nicht.
Suchen Sie ein nachfolgendes Merge-Commit
Dies ist vom Workflow abhängig. Bei guten Workflows werden jedoch Commits für Entwicklungszweige vorgenommen, die dann zusammengeführt werden. Sie können dies tun:
git log --merges <commit>..
um Merge-Commits zu sehen, die das angegebene Commit als Vorfahren haben. (Wenn das Commit nur einmal zusammengeführt wurde, sollte das erste das Zusammenführen sein, nach dem Sie suchen. Andernfalls müssen Sie vermutlich einige untersuchen.) Die Commit-Nachricht zum Zusammenführen sollte den zusammengeführten Zweignamen enthalten.
Wenn Sie sich darauf verlassen möchten, können Sie die --no-ffOption verwenden, git mergeum die Erstellung von Zusammenführungs-Commits auch im Schnellvorlauf zu erzwingen. ( Seien Sie jedoch nicht zu eifrig. Das könnte bei Überbeanspruchung verschleiern.) VonCs Antwort auf eine verwandte Frage geht hilfreich auf dieses Thema ein.
+1. Das bloße Fehlen von Informationen für dieses spezielle Problem lässt Sie sich fragen, ob es sich tatsächlich um ein Problem handelt. Zweige können jederzeit geändert, umbenannt oder gelöscht werden. Möglicherweise reicht dies git describeaus, da (mit Anmerkungen versehene) Tags als wichtiger als Zweige angesehen werden können.
VonC
9
Ich stimme definitiv zu - Filialen sollen leicht und flexibel sein. Wenn Sie einen Workflow verwenden, in dem diese Informationen wichtig werden, können Sie mithilfe der --no-ffOption sicherstellen, dass immer ein Zusammenführungs-Commit vorhanden ist, sodass Sie den Pfad eines bestimmten Commits immer verfolgen können, wenn es zum Master zusammengeführt wird.
Cascabel
32
Zu Ihrer Information, wenn Sie Commits finden möchten, die nur auf der Fernbedienung vorhanden sind, fügen Sie das -aFlag zum ersten Befehl hinzu, z. B.git branch -a --contains <commit>
Jonathan Day,
8
@ JonathanDay: Nein, das findet Commits in jedem Zweig. Wenn Sie nur diejenigen auf der Fernbedienung möchten , verwenden Sie -r.
Cascabel
7
@SimonTewsi Wie ich bereits sagte, wenn es wirklich ein Problem ist, verwenden Sie merge --no-ff, um den Filialnamen beim Zusammenführen zuverlässig aufzuzeichnen. Stellen Sie sich ansonsten Filialnamen als temporäre Kurzbezeichnungen vor und schreiben Sie Beschreibungen als permanente fest. "Mit welchem Kurznamen haben wir uns während der Entwicklung darauf bezogen?" sollte wirklich keine so wichtige Frage sein wie "Was macht dieses Commit?"
Cascabel
152
Dieser einfache Befehl funktioniert wie ein Zauber:
git name-rev <SHA>
Zum Beispiel (wobei test-branch der Name des Zweigs ist):
Du hast meinen Tag gerettet. Dies ist die perfekte Lösung.
Taco
7
Und diese perfekte Lösung dauerte nur 8 Jahre. Vielen Dank!
S1J0
6
Ich fand git name-rev --name-only <SHA>es nützlicher, nur den Filialnamen zu erhalten. Meine Frage ... Kann es unter keinen Umständen mehr als einen Zweig zurückgeben?
Dean Kayton
1
Dies sollte die beste Antwort sein.
JCollier
1
Vielen Dank an @JCollier für Ihre freundlichen Worte.
git-what-branch(Perl-Skript, siehe unten) scheint nicht mehr gepflegt zu sein.
git-when-mergedist eine in Python geschriebene Alternative, die für mich sehr gut funktioniert.
Finden Sie heraus, wann ein Commit in einem oder mehreren Zweigen zusammengeführt wurde.
Suchen Sie das Zusammenführungs-Commit, das COMMITin die angegebenen BRANCHEN eingeführt wurde.
Suchen Sie insbesondere nach dem ältesten Commit im Verlauf des ersten übergeordneten Elements BRANCH, das das COMMITals Vorfahr enthält.
Teilen Sie uns (standardmäßig) den frühesten kausalen Pfad von Commits und Zusammenführungen mit, damit das angeforderte Commit in einen benannten Zweig gelangt. Wenn ein Commit direkt für einen benannten Zweig durchgeführt wurde, ist dies offensichtlich der früheste Pfad.
Mit dem frühesten kausalen Pfad meinen wir den Pfad, der am frühesten zu einem benannten Zweig verschmolzen ist, mit Festschreibungszeit (sofern --topo-ordernicht anders angegeben).
PERFORMANCE
Wenn viele Zweige (z. B. Hunderte) das Commit enthalten, kann es lange dauern, bis das System den Pfad gefunden hat (für ein bestimmtes Commit im Linux-Baum dauerte es 8 Sekunden, um einen Zweig zu untersuchen, aber es gab über 200 Kandidatenzweige) zu jedem Commit.
Die Auswahl einer --reference-branch --reference tagzu untersuchenden Person ist hunderte Male schneller (wenn Sie Hunderte von Kandidatenzweigen haben).
BEISPIELE
# git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4
1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path:
v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May 5 08:59:37 2005)
v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May 3 18:27:24 2005)
v2.6.12-rc3-461-g84e48b6 is on master
v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n
[...]
Dieses Programm berücksichtigt nicht die Auswirkungen der Auswahl des interessierenden Commits, sondern nur Zusammenführungsvorgänge.
git-what-branchscheint nicht mehr gepflegt zu sein. Git-When-Merged ist eine in Python geschriebene Alternative, die für mich sehr gut funktioniert.
Sschuberth
@sschuberth danke für dieses update. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
37
Um dieses c0118faCommit zu finden, kam es beispielsweise von 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
Du solltest rennen:
git log c0118fa..HEAD --ancestry-path --merges
Scrollen Sie nach unten, um das Commit für die letzte Zusammenführung zu finden . Welches ist:
commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date: Sat Oct 1 00:54:18 2016 +0300
Merge branch 'redesign_interactions' into clean_api
Dies war die einzige Lösung, die mir das gewünschte Ergebnis brachte. Ich habe den Rest versucht.
Crafter
Beachten Sie, dass dies nur funktioniert, wenn die Zusammenführungs-Commit-Zusammenfassungen die in den Zusammenführungen verwendeten Zweignamen enthalten, was normalerweise standardmäßig der Fall ist. Allerdings git merge -m"Any String Here"wird die Quell- und Zielbranchen Informationen verschleiern.
Qneill
@qneill: Nein, die Zusammenführung enthält immer Informationen zu zusammengeführten Zweigen : Merge: f6b70fa d58bdcb. Sie können Ihr Merge-Commit so benennen, wie Sie es möchten. Ich werde keine Materie haben
Eugen Konkov
1
@EugenKonkov Sobald die Zweige die Zusammenführung durchlaufen haben, wird der Verlauf des Pfads im Diagramm, von dem sie stammen, im Reflog belassen, jedoch nicht in der Git-Objektdatenbank. Ich habe eine Antwort gepostet, um zu erklären, was ich sage
qneill
UPD-Version funktioniert für mich, einfacher Befehl, der das ursprüngliche Commit findet
vpalmu
9
git branch --contains <ref>ist der offensichtlichste "Porzellan" -Befehl, um dies zu tun. Wenn Sie etwas Ähnliches nur mit "Sanitär" -Befehlen tun möchten:
COMMIT=$(git rev-parse <ref>) # expands hash if needed
for BRANCH in $(git for-each-ref --format "%(refname)" refs/heads); do
if $(git rev-list $BRANCH | fgrep -q $COMMIT); then
echo $BRANCH
fi
done
Ich habe die Beschreibung aktualisiert. Danke für das Feedback.
Phyatt
4
Die Option eines armen Mannes besteht darin, das Tool tig1 zu verwenden HEAD, nach dem Commit zu suchen und dann der Linie von diesem Commit visuell zu folgen, bis ein Zusammenführungs-Commit angezeigt wird. Die Standard-Zusammenführungsnachricht sollte angeben, welcher Zweig wo zusammengeführt wird :)
1 Tig ist eine ncurses-basierte Textmodus-Oberfläche für Git. Es fungiert hauptsächlich als Git-Repository-Browser, kann aber auch beim Staging von Änderungen für das Festschreiben auf Chunk-Ebene helfen und als Pager für die Ausgabe verschiedener Git-Befehle fungieren.
Als Experiment habe ich einen Post-Commit-Hook erstellt, der Informationen über den aktuell ausgecheckten Zweig in den Commit-Metadaten speichert. Ich habe auch gitk leicht modifiziert, um diese Informationen anzuzeigen.
Um ehrlich zu sein, wusste ich nicht, dass es Git-Notizen gibt, als ich das schrieb. Ja, es ist wahrscheinlich eine bessere Idee, Git Notes zu verwenden, um dasselbe zu erreichen.
pajp
3
Ich beschäftige mich mit demselben Problem ( Jenkins Multibranch-Pipeline) - ich habe nur Commit-Informationen und versuche, einen Zweigstellennamen zu finden, von dem dieses Commit ursprünglich stammt. Es muss für Remote-Zweige funktionieren, lokale Kopien sind nicht verfügbar.
Damit arbeite ich:
git rev-parse HEAD | xargs git name-rev
Optional können Sie die Ausgabe entfernen:
git rev-parse HEAD | xargs git name-rev | cut -d' ' -f2 | sed 's/remotes\/origin\///g'
Ich denke, jemand sollte mit dem gleichen Problem konfrontiert sein, das den Zweig nicht herausfinden kann, obwohl er tatsächlich in einem Zweig existiert.
Wenn das OP versucht, den Verlauf zu ermitteln, der von einem Zweig beim Erstellen eines bestimmten Commits durchlaufen wurde ("Finden Sie heraus, von welchem Zweig ein Commit aufgrund seines SHA-1-Hashwerts stammt"), gibt es ohne das Reflog keine Datensätze in der Git-Objektdatenbank , die zeigen, welcher benannte Zweig an welchen Commit-Verlauf gebunden war.
(Ich habe dies als Antwort auf einen Kommentar gepostet.)
Hoffentlich veranschaulicht dieses Skript meinen Standpunkt:
Und was ist die Ausgabe für git log 80c10e5..HEAD --ancestry-path --merges --oneline --color | tail -n 1und git log 086c9ce..HEAD --ancestry-path --merges --oneline --color | tail -n 1Befehle für beide Fälle?
Eugen
Die SHAs ändern sich natürlich jedes Mal, wenn die Befehle ausgeführt werden. Um Ihre Befehle zu wiederholen, habe ich HEAD ^ 1 und HEAD ^ 2 bei einem neuen Lauf verwendet. Die Befehle und Ausgaben sind: $ git log HEAD^1..HEAD --ancestry-path --merges --oneline --color | tail -n 1welche Ausbeuten 376142d merge branchesund $ git log HEAD^2..HEAD --ancestry-path --merges --oneline --color | tail -n 1welche Ausbeuten 376142d merge branches - welche die Zusammenfassung des Zusammenführungs-Commits zeigen, die (wie ich behauptet habe) beim Erstellen der Zusammenführung überschrieben werden kann, wodurch möglicherweise der Verzweigungsverlauf der Zusammenführung verschleiert wird.
Qneill
0
TL; DR:
Verwenden Sie Folgendes, wenn Sie sich für den Status des Shell-Exits interessieren:
branch-current - Name der aktuellen Filiale
branch-names - saubere Filialnamen (einer pro Zeile)
branch-name - Stellen Sie sicher, dass nur ein Zweig zurückgegeben wird branch-names
Beide branch-nameund branch-namesakzeptieren ein Commit als Argument und standardmäßig, HEADwenn keines angegeben ist.
Ich möchte das nicht wirklich ablehnen, denn genau genommen ist es wahr, dass Git diese Informationen nicht dauerhaft speichert, aber es ist sehr oft möglich, es trotzdem herauszufinden. Siehe meine Antwort.
Antworten:
Während Dav richtig ist, dass die Informationen nicht direkt gespeichert sind, heißt das nicht, dass Sie es nie herausfinden können. Hier sind einige Dinge, die Sie tun können.
Suchen Sie nach Zweigen, für die das Commit aktiviert ist
Hier erfahren Sie alle Zweige, die in ihrer Geschichte das angegebene Commit haben. Dies ist natürlich weniger nützlich, wenn das Commit bereits zusammengeführt wurde.
Durchsuchen Sie die Reflogs
Wenn Sie in dem Repository arbeiten, in dem das Commit durchgeführt wurde, können Sie die Reflogs nach der Zeile für dieses Commit durchsuchen. Reflogs, die älter als 90 Tage sind, werden von git-gc beschnitten. Wenn das Commit also zu alt ist, werden Sie es nicht finden. Das heißt, Sie können dies tun:
Commit finden a871742. Beachten Sie, dass Sie die abgekürzten 7 ersten Ziffern des Commits verwenden MÜSSEN. Die Ausgabe sollte ungefähr so aussehen:
Dies zeigt an, dass das Commit für den Zweig "Abschluss" vorgenommen wurde. In der Standardausgabe werden abgekürzte Commit-Hashes angezeigt. Suchen Sie daher nicht nach dem vollständigen Hash, da Sie sonst nichts finden.
git reflog show
ist eigentlich nur ein Alias fürgit log -g --abbrev-commit --pretty=oneline
. Wenn Sie also mit dem Ausgabeformat herumspielen möchten, um verschiedene Dinge zur Verfügung zu stellen, nach denen Sie suchen können, ist dies Ihr Ausgangspunkt!Wenn Sie nicht in dem Repository arbeiten, in dem das Commit durchgeführt wurde, können Sie in diesem Fall am besten die Reflogs untersuchen und feststellen, wann das Commit zum ersten Mal in Ihr Repository eingeführt wurde. Mit etwas Glück haben Sie den Zweig geholt, für den er bestimmt war. Dies ist etwas komplexer, da Sie nicht gleichzeitig den Commit-Baum und die Reflogs durchlaufen können. Sie möchten die Reflog-Ausgabe analysieren und jeden Hash untersuchen, um festzustellen, ob er das gewünschte Commit enthält oder nicht.
Suchen Sie ein nachfolgendes Merge-Commit
Dies ist vom Workflow abhängig. Bei guten Workflows werden jedoch Commits für Entwicklungszweige vorgenommen, die dann zusammengeführt werden. Sie können dies tun:
um Merge-Commits zu sehen, die das angegebene Commit als Vorfahren haben. (Wenn das Commit nur einmal zusammengeführt wurde, sollte das erste das Zusammenführen sein, nach dem Sie suchen. Andernfalls müssen Sie vermutlich einige untersuchen.) Die Commit-Nachricht zum Zusammenführen sollte den zusammengeführten Zweignamen enthalten.
Wenn Sie sich darauf verlassen möchten, können Sie die
--no-ff
Option verwenden,git merge
um die Erstellung von Zusammenführungs-Commits auch im Schnellvorlauf zu erzwingen. ( Seien Sie jedoch nicht zu eifrig. Das könnte bei Überbeanspruchung verschleiern.) VonCs Antwort auf eine verwandte Frage geht hilfreich auf dieses Thema ein.quelle
git describe
aus, da (mit Anmerkungen versehene) Tags als wichtiger als Zweige angesehen werden können.--no-ff
Option sicherstellen, dass immer ein Zusammenführungs-Commit vorhanden ist, sodass Sie den Pfad eines bestimmten Commits immer verfolgen können, wenn es zum Master zusammengeführt wird.-a
Flag zum ersten Befehl hinzu, z. B.git branch -a --contains <commit>
-r
.merge --no-ff
, um den Filialnamen beim Zusammenführen zuverlässig aufzuzeichnen. Stellen Sie sich ansonsten Filialnamen als temporäre Kurzbezeichnungen vor und schreiben Sie Beschreibungen als permanente fest. "Mit welchem Kurznamen haben wir uns während der Entwicklung darauf bezogen?" sollte wirklich keine so wichtige Frage sein wie "Was macht dieses Commit?"Dieser einfache Befehl funktioniert wie ein Zauber:
git name-rev <SHA>
Zum Beispiel (wobei test-branch der Name des Zweigs ist):
Auch dies funktioniert für komplexe Szenarien wie:
Hier
git name-rev commit<SHA2>
gibt branchB .quelle
git name-rev --name-only <SHA>
es nützlicher, nur den Filialnamen zu erhalten. Meine Frage ... Kann es unter keinen Umständen mehr als einen Zweig zurückgeben?Update Dezember 2013:
sschuberth Kommentare
Es basiert auf " Find Merge Commit, das ein bestimmtes Commit enthält ".
Ursprüngliche Antwort September 2010:
Sebastien Douche hat gerade gezwitschert (16 Minuten vor dieser SO-Antwort):
Dies ist ein Perl-Skript von Seth Robertson , das sehr interessant erscheint:
quelle
git-what-branch
scheint nicht mehr gepflegt zu sein. Git-When-Merged ist eine in Python geschriebene Alternative, die für mich sehr gut funktioniert.Um dieses
c0118fa
Commit zu finden, kam es beispielsweise vonredesign_interactions
:Du solltest rennen:
Scrollen Sie nach unten, um das Commit für die letzte Zusammenführung zu finden . Welches ist:
Aktualisieren
Oder nur ein Befehl:
quelle
git merge -m"Any String Here"
wird die Quell- und Zielbranchen Informationen verschleiern.Merge: f6b70fa d58bdcb
. Sie können Ihr Merge-Commit so benennen, wie Sie es möchten. Ich werde keine Materie habengit branch --contains <ref>
ist der offensichtlichste "Porzellan" -Befehl, um dies zu tun. Wenn Sie etwas Ähnliches nur mit "Sanitär" -Befehlen tun möchten:(Crosspost von dieser SO Antwort )
quelle
khichar.anil behandelte das meiste davon in seiner Antwort.
Ich füge nur das Flag hinzu, mit dem die Tags aus der Liste der Revisionsnamen entfernt werden. Dies gibt uns:
quelle
Die Option eines armen Mannes besteht darin, das Tool
tig
1 zu verwendenHEAD
, nach dem Commit zu suchen und dann der Linie von diesem Commit visuell zu folgen, bis ein Zusammenführungs-Commit angezeigt wird. Die Standard-Zusammenführungsnachricht sollte angeben, welcher Zweig wo zusammengeführt wird :)quelle
Als Experiment habe ich einen Post-Commit-Hook erstellt, der Informationen über den aktuell ausgecheckten Zweig in den Commit-Metadaten speichert. Ich habe auch gitk leicht modifiziert, um diese Informationen anzuzeigen.
Sie können es hier überprüfen: https://github.com/pajp/branch-info-commits
quelle
Ich beschäftige mich mit demselben Problem ( Jenkins Multibranch-Pipeline) - ich habe nur Commit-Informationen und versuche, einen Zweigstellennamen zu finden, von dem dieses Commit ursprünglich stammt. Es muss für Remote-Zweige funktionieren, lokale Kopien sind nicht verfügbar.
Damit arbeite ich:
Optional können Sie die Ausgabe entfernen:
quelle
Ich denke, jemand sollte mit dem gleichen Problem konfrontiert sein, das den Zweig nicht herausfinden kann, obwohl er tatsächlich in einem Zweig existiert.
Du solltest besser zuerst alles ziehen:
Führen Sie dann die Zweigsuche durch:
oder:
quelle
Wenn das OP versucht, den Verlauf zu ermitteln, der von einem Zweig beim Erstellen eines bestimmten Commits durchlaufen wurde ("Finden Sie heraus, von welchem Zweig ein Commit aufgrund seines SHA-1-Hashwerts stammt"), gibt es ohne das Reflog keine Datensätze in der Git-Objektdatenbank , die zeigen, welcher benannte Zweig an welchen Commit-Verlauf gebunden war.
(Ich habe dies als Antwort auf einen Kommentar gepostet.)
Hoffentlich veranschaulicht dieses Skript meinen Standpunkt:
Die Ausgabe zeigt, dass es keine Möglichkeit gibt zu wissen, ob das Commit mit 'Add f1' vom Zweig b1 oder b2 vom Remote-Klon / tmp / r2 stammt.
(Letzte Zeilen der Ausgabe hier)
quelle
git log 80c10e5..HEAD --ancestry-path --merges --oneline --color | tail -n 1
undgit log 086c9ce..HEAD --ancestry-path --merges --oneline --color | tail -n 1
Befehle für beide Fälle?$ git log HEAD^1..HEAD --ancestry-path --merges --oneline --color | tail -n 1
welche Ausbeuten376142d merge branches
und$ git log HEAD^2..HEAD --ancestry-path --merges --oneline --color | tail -n 1
welche Ausbeuten376142d merge branches
- welche die Zusammenfassung des Zusammenführungs-Commits zeigen, die (wie ich behauptet habe) beim Erstellen der Zusammenführung überschrieben werden kann, wodurch möglicherweise der Verzweigungsverlauf der Zusammenführung verschleiert wird.TL; DR:
Verwenden Sie Folgendes, wenn Sie sich für den Status des Shell-Exits interessieren:
branch-current
- Name der aktuellen Filialebranch-names
- saubere Filialnamen (einer pro Zeile)branch-name
- Stellen Sie sicher, dass nur ein Zweig zurückgegeben wirdbranch-names
Beide
branch-name
undbranch-names
akzeptieren ein Commit als Argument und standardmäßig,HEAD
wenn keines angegeben ist.Aliase nützlich in der Skripterstellung
Commit nur von nur einem Zweig aus erreichbar
0
.Commit von mehreren Zweigen aus erreichbar
1
.Aufgrund des Exit-Status können diese sicher aufgebaut werden. So verwenden Sie beispielsweise die zum Abrufen verwendete Fernbedienung:
quelle
So finden Sie die lokale Niederlassung:
So finden Sie den Remote-Zweig:
quelle
Abgesehen davon, dass Sie den gesamten Baum durchsuchen, bis Sie einen passenden Hash gefunden haben, nein.
quelle