git resetdreht sich alles um das Bewegen HEAD, und im Allgemeinen ist der Zweig ref .
Frage: Was ist mit dem Arbeitsbaum und dem Index?
Bei Verwendung mit --soft, bewegt sich HEAD, aktualisiert meistens die Zweigreferenz und nur dieHEAD .
Dies unterscheidet sich von commit --amend:
- Es wird kein neues Commit erstellt.
- Es kann HEAD tatsächlich in ein beliebiges Commit verschieben (da
commit --amendes nur darum geht , HEAD nicht zu verschieben, während das aktuelle Commit wiederholt werden kann).
Ich habe gerade dieses Beispiel für das Kombinieren gefunden:
- eine klassische Verschmelzung
- eine Teilbaumzusammenführung
Alles in einem (Octopus, da mehr als zwei Zweige zusammengeführt werden) Commit Merge.
Tomas "wereHamster" Carnecky erklärt in seinem Artikel "Subtree Octopus Merge" :
- Die Strategie zum Zusammenführen von Teilbäumen kann verwendet werden, wenn Sie ein Projekt in ein Unterverzeichnis eines anderen Projekts zusammenführen und anschließend das Teilprojekt auf dem neuesten Stand halten möchten. Es ist eine Alternative zu Git-Submodulen.
- Mit der Octopus-Merge-Strategie können drei oder mehr Zweige zusammengeführt werden. Die normale Strategie kann nur zwei Zweige zusammenführen. Wenn Sie versuchen, mehr als das zusammenzuführen, greift git automatisch auf die Octopus-Strategie zurück.
Das Problem ist, dass Sie nur eine Strategie auswählen können. Aber ich wollte beide kombinieren, um einen sauberen Verlauf zu erhalten, in dem das gesamte Repository atomar auf eine neue Version aktualisiert wird.
Ich habe ein Superprojekt, nennen wir es projectA, und ein Unterprojekt projectB, das ich in ein Unterverzeichnis von zusammengeführt habe projectA.
(das ist der Teilbaum-Zusammenführungsteil)
Ich halte auch ein paar lokale Verpflichtungen aufrecht.
ProjectAwird regelmäßig aktualisiert, projectBhat alle paar Tage oder Wochen eine neue Version und hängt normalerweise von einer bestimmten Version von ab projectA.
Wenn ich mich entscheide, beide Projekte zu aktualisieren, ziehe ich nicht einfach ab projectAund projectB da dies zwei Commits für ein atomares Update des gesamten Projekts erzeugen würde .
Stattdessen erstelle ich ein einzelnes Merge-Commit, das kombiniert wird projectA, projectBund meine lokalen Commits .
Der schwierige Teil hier ist, dass dies eine Octopus-Zusammenführung (drei Köpfe) ist, aber projectBmit der Teilbaumstrategie zusammengeführt werden muss . Das mache ich also:
# Merge projectA with the default strategy:
git merge projectA/master
# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master
Hier verwendete der Autor a reset --hardund stellte dann read-treewieder her, was die ersten beiden Zusammenführungen mit dem Arbeitsbaum und dem Index bewirkt hatten. Hier reset --softkann jedoch
Folgendes hilfreich sein: Wie kann ich die beiden Zusammenführungen wiederholen , die funktioniert haben, dh mein Arbeitsbaum und mein Index sind gut, aber ohne diese beiden Commits aufzeichnen zu müssen?
# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}
Jetzt können wir Tomas 'Lösung wieder aufnehmen:
# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
# And finally do the commit:
git commit
Also jedes Mal:
- Sie sind zufrieden mit dem, was Sie am Ende haben (in Bezug auf Arbeitsbaum und Index).
- Sie sind nicht zufrieden mit all den Verpflichtungen, die Sie dorthin gebracht haben:
git reset --soft ist die Antwort.
git reset --soft: stackoverflow.com/questions/6869705/…