Wie kann ich erkennen, ob ein git commit ein Elternteil von anderen Commits ist?

StackOverflow https://stackoverflow.com/questions/3435010

  •  26-09-2019
  •  | 
  •  

Frage

Ich schreibe ein Skript, das einige triviale Änderungen vornimmt und dann begeht sie git. Da diese triviale Änderungen sind, mag ich git commit --amend tun, wenn ich damit durchkommen kann - speziell, wenn eine Änderung nicht „versauen“ jeder anderen Zweiges Geschichte. Wenn eine Änderung würde vermasseln einen anderen Zweig, ich möchte stattdessen eine Standard-git commit tun.

Zum Beispiel, wenn meine Zweige so aussehen (a la "visualisieren alle Branchen Geschichte" in Git GUI):

* [experimental branch] Added feature.
* [master branch] Trivial change from script
* ...

und ich dieses Skript auf dem Master-Zweig ausgeführt wird, dann will ich nicht ändern tun, weil ich Teil der experimentellen Zweig der Geschichte ersetzt werden würde. Technisch wird dies nicht wirklich etwas brechen - das Original immer noch einen Teil der experimenteller Geschichte und wird noch referenziert werden, so es Müll gesammelt bekommt nicht begehen - aber mit fast-but-not-quite-identischen Commits in später zwei verschiedene Zweige machen das Leben schwer, wenn ich rebase oder merge will, so ist es eine Situation, das ich vermeiden will.

Wie kann ich mein Skript automatisch machen erkennen, ob ein etwas davon hat verzweigt begehen?

Wenn Annahmen Hilfe zu vereinfachen, ich laufe immer dieses Skript auf dem Kopf des Herren, und ich nur git als lokalen Repository verwenden -. Ich weiß nicht drücken oder ziehen ändert überall

Dieses Skript ist in Ruby, so dass ich entweder mit dem git Befehlszeile berappen kann, oder ich kann Ruby-Bindings für git verwenden -. Unabhängig davon, welche diese Aufgabe einfacher machen würde

War es hilfreich?

Lösung

Just run git branch --contains HEAD eine Liste der Filialen zu erhalten, dass „enthalten“ diese begehen. Wenn die Liste leer ist, dass begehen sollte für ammending sicher sein. Sie können auch die -a Flagge zur Liste lokalen und entfernten Niederlassungen aufnehmen möchten.

Alternativ können Sie die Ausgabe von git rev-parse HEAD mit git merge-base HEAD other-branch vergleichen. Wenn diese IDs identisch sind begehen, die aktuelle begehen ist in anderen Zweig der Geschichte begehen.

Andere Tipps

Die Commit Graph ist eine unidirektionale: Da ein begehen, Sie alle seiner Vorfahren wissen, aber nichts von seinen Kindern. Sie werden an den Endpunkten und denselben Weg zurückverfolgen starten, bis Sie auf die bekommen begehen (n), die Sie wollen.

Mit git rev-list [some commit] --children (HEAD ist die Standardeinstellung):

$ git rev-list HEAD --children
6edbee61c87fb063700751815f0ad53907d0b7a4
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
[...]

Die linke Spalte ist eine Liste der Commit SHA-1 s in umgekehrter chronologischer Reihenfolge. Alles, was dazu verpflichtet Recht sind die Kinder (--children) dieser begehen. Die Top-Commit ist HEAD und hat somit keine Kinder.

Wenn Sie also grep für SHA-1 in dieser Liste, und es hat nichts zu sein Recht, es hat mindestens ein Kind:

$ git rev-list --children | grep '^6910'
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349

Im obigen Beispiel, begehen 6910... ein Kind hat, ef8a....

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top