webentwicklung-frage-antwort-db.com.de

Die ersten beiden Commits eines Git-Repositorys kombinieren?

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

A-B-C

Ich möchte die beiden Commits kombinieren EIN und B zu einem begehen AB:

AB-C

Ich habe es versucht

git rebase -i A

das öffnet meinen Editor mit folgenden Inhalten:

pick e97a17b B
pick asd314f C

Ich ändere das zu

squash e97a17b B
pick asd314f C

Dann sagt Git 1.6.0.4:

Cannot 'squash' without a previous commit

Gibt es einen Weg oder ist das einfach unmöglich?

186
Christian

Verwenden Sie git rebase -i --rootas von Git Version 1.7.12 .

Ändern Sie in der interaktiven Rebase-Datei die zweite Zeile von commit B in squash und belassen Sie die anderen Zeilen bei pick:

pick f4202da A
squash bea708e B
pick a8c6abc C

Dadurch werden die beiden Commits A und B zu einem Commit AB zusammengefasst.

Gefunden in diese Antwort .

147
kostmo

Du versuchtest:

git rebase -i A

Es ist möglich, so zu beginnen, wenn Sie mit edit statt mit squash fortfahren:

edit e97a17b B
pick asd314f C

dann renne

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

Erledigt.

125

A war das anfängliche Commit, aber jetzt soll B das anfängliche Commit sein. Git-Commits sind ganze Bäume, keine Unterschiede, selbst wenn sie normalerweise beschrieben und in Bezug auf die Unterschiede betrachtet werden, die sie einführen.

Dieses Rezept funktioniert auch, wenn zwischen A und B sowie B und C mehrere Commits vorhanden sind.

# 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
63
CB Bailey

Bei interaktiver Rebase müssen Sie dies vor A tun, damit folgende Liste angezeigt wird:

pick A
pick B
pick C

werden:

pick A
squash B
pick C

Wenn A das ursprüngliche Commit ist, müssen Sie ein anderes initiales Commit haben, bevor A. Git an Unterschiede denkt, es wird auf den Unterschied zwischen (A und B) und (B und C) eingegangen. Daher funktioniert der Squash in Ihrem Beispiel nicht.

10
Loki

Für den Fall, dass Sie Hunderte oder Tausende von Commits haben, verwenden Sie Kostmos Antwort von

git rebase -i --root

kann unpraktisch und langsam sein, nur aufgrund der großen Anzahl von Festschreibungen, die das Rebase-Skript ausführen muss zweimal, um die interaktive Rebase-Editor-Liste einmal zu generieren (wobei Sie auswählen, welche Aktion für jede Aktion ausgeführt werden soll) commit) und einmal, um die erneute Anwendung von Commits tatsächlich auszuführen.

Hier ist eine alternative Lösung , die den Zeitaufwand für die Erstellung der interaktiven Rebase-Editor-Liste vermeidet indem keine interaktive Rebase verwendet wird = an erster Stelle. Auf diese Weise ähnelt es Charles Baileys Lösung . Sie erstellen einfach einen Orphan Branch aus dem zweiten Commit und setzen dann alle untergeordneten Commits darauf auf:

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

9
user456814

In einer verwandten Frage gelang es mir, eine andere Herangehensweise zu finden als das erste Commit.

Wenn Sie interessiert sind: git: Wie füge ich als erstes ein Commit ein und verschiebe alle anderen?

1
kch

Git-Befehl für den Kader: Git rebase -i HEAD ~ [Anzahl der Commits]

Nehmen wir an, Sie haben die Geschichte von git commit unterschritten:


pick 5152061 feat: Unterstützung für das Speichern von Bildern hinzugefügt. (EIN)
pick 39c5a04 Fix: Fehlerbehebungen. (B)
pick 839c6b3 Korrektur: Konflikt gelöst. (C)

Jetzt wollen Sie A und B gegen AB quetschen. Führen Sie die folgenden Schritte aus:


pick 5152061 feat: Unterstützung für das Speichern von Bildern hinzugefügt. (EIN)
s 39c5a04 Fix: Fehlerbehebungen. (B)
pick 839c6b3 Korrektur: Konflikt gelöst. (C)

Hinweis: Für das Squashing-Commit können wir Squash oder s ..__ verwenden. Das Endergebnis lautet:
pick 5152061 feat: Unterstützung für das Speichern von Bildern hinzugefügt. (AB)
pick 839c6b3 Korrektur: Konflikt gelöst. (C)

0
Sumit