Frage

Angenommen, Sie haben eine Geschichte mit den drei Commits A, B und C :

A-B-C

Ich mag die beiden Commits kombinieren A und B zu einem commit AB :

AB-C

Ich habe versucht,

git rebase -i A

, die meinen Editor mit folgenden Inhalten eröffnet:

pick e97a17b B
pick asd314f C

ich ändern, um dies zu

squash e97a17b B
pick asd314f C

Dann Git 1.6.0.4 sagt:

Cannot 'squash' without a previous commit

Gibt es eine Möglichkeit, oder ist dies einfach unmöglich?

War es hilfreich?

Lösung

Verwenden git rebase -i --root wie von Git Version 1.7.12 .

In der interaktiven rebase-Datei, die zweite Zeile ändern von commit B Squash und lassen Sie die anderen Linien in wählen :

pick f4202da A
squash bea708e B
pick a8c6abc C

Dies wird kombiniert die beiden Commits A und B zu einem commit AB .

Gefunden in diese Antwort .

Andere Tipps

Sie haben versucht:

git rebase -i A

Es ist möglich, so zu starten, wenn Sie mit edit weiterhin statt squash:

edit e97a17b B
pick asd314f C

führen Sie dann

git reset --soft HEAD^
git commit --amend
git rebase --continue

Fertig.

A war die erste begehen, aber jetzt wollen Sie B die anfängliche verpflichten zu sein. git Commits sind ganze Bäume, nicht einmal diffs, wenn sie werden in der Regel in Bezug auf die diff beschrieben und betrachtet, die sie einführen.

Dieses Rezept funktioniert auch, wenn es mehrere Commits zwischen A und B, und B und C.

# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout <sha1_for_B>

# reset the branch pointer to the initial commit,
# but leaving the index and working tree intact.
git reset --soft <sha1_for_A>

# amend the initial tree using the tree from 'B'
git commit --amend

# temporarily tag this new initial commit
# (or you could remember the new commit sha1 manually)
git tag tmp

# go back to the original branch (assume master for this example)
git checkout master

# Replay all the commits after B onto the new initial commit
git rebase --onto tmp <sha1_for_B>

# remove the temporary tag
git tag -d tmp

Im Fall von interaktivem Unterfütterungsmaterial, Sie haben vor ein, es zu tun, damit die Liste sein:

pick A
pick B
pick C

werden:

pick A
squash B
pick C

Wenn A die anfängliche begehen, müssen Sie eine andere Anfangs haben zu begehen, bevor A. Git in Unterschiede denkt, wird es auf der Differenz zwischen (A und B) arbeiten und (B und C). Daraus ergibt sich die Squash nicht in Ihrem Beispiel arbeiten.

Im Fall, dass Sie Hunderte oder Tausende von Commits haben, mit kostmo Antwort von

git rebase -i --root

kann unpraktisch und langsam sein, nur aufgrund der großen Anzahl von verpflichtet, dass das Fütterungsmaterial Skript zu verarbeiten hat zweimal , sobald die interaktive rebase Editor Liste zu erzeugen (in dem Sie festlegen, welche Maßnahmen zu ergreifen jeder begehen) und einmal auszuführen tatsächlich die Wiederanwendung der Commits.

Hier ist ein alternative Lösung , der die Zeit Kosten der Erzeugung der interaktiven rebase Editor Liste vermeiden durch kein interaktives Fütterungsmaterial mit in den ersten Platz. Auf diese Weise ist es ähnlich Charles Bailey Lösung . Erstellen Sie einfach eine Waise Zweig von den zweiten begehen, und dann rebase alle Nachkommen oben drauf verpflichtet:

git checkout --orphan orphan <second-commit-sha>
git commit -m "Enter a commit message for the new root commit"
git rebase --onto orphan <second-commit-sha> master

Dokumentation

In einer verwandten Frage konnte ich mit einem anderen Ansatz, um die Notwendigkeit von Quetschen gegen den ersten verpflichten kommen, das ist gut, es ist die zweiter zu machen.

Wenn Sie Interesse: git: wie einfügen einer Festschreibung als die ersten, Verschieben aller anderen

Git Befehl zum Kader: git rebase -i HEAD ~ [Anzahl der Commits]

Lassen Sie uns sagen Sie unter git haben Geschichte begehen:


5152061 Leistung wählen: Unterstützung Bild zum Speichern. (EIN) Fehlerbehebung:
39c5a04 Fix holen. (B) Pick
839c6b3 fix: Konflikt gelöst. (C)

Jetzt wollen Sie A und B zu AB Squash, führen Sie folgende Schritte aus:


5152061 Leistung wählen: Unterstützung Bild zum Speichern. (EIN)
s 39c5a04 Fix: Bug-Fixes. (B) Pick
839c6b3 fix: Konflikt gelöst. (C)

Hinweis: für Quetschen begehen können wir Squash oder s verwenden. Das Endergebnis wird sein:
5152061 Leistung wählen: Unterstützung Bild zum Speichern. (AB) Pick
839c6b3 fix: Konflikt gelöst. (C)

Sie haben ein bisschen von Befehlszeilen Magie auszuführen.

git checkout -b a A
git checkout B <files>
git commit --amend
git checkout master
git rebase a

Das sollten Sie mit einem Zweig verlassen, die AB und C hat als verpflichtet.

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