Wie füge ich eine Datei zu einem vorherigen Commit hinzu?

83

In der letzten Stunde habe ich Dateien geändert

A
ATest
B
BTest

Um sicherzustellen, dass meine Festschreibungsnachrichten mit der tatsächlichen Änderung übereinstimmen, werden sie Amit einer Beschreibung festgeschrieben . Leider habe ich nicht ATestin dieses Commit aufgenommen.

Inzwischen sind noch nicht verpflichtet Bund BTest.

Wie gehe ich an dieser Stelle am besten vor? Ich möchte entweder:

  1. Zurücksetzen des vorherigen Commits ohne Auswirkungen auf meine derzeit nicht festgeschriebenen Dateien?
  2. Eine weitere Datei unter derselben Beschreibung zum vorherigen Commit hinzufügen?
James Raitsev
quelle
Ich denke, 2 sollte der normale Weg sein. Was ist das Problem daran?
Adrian Shum

Antworten:

139

So fügen Sie dem vorherigen Commit eine neue Datei hinzu:

$ git add new-file
$ git commit --amend

Sie können verwenden, git commit --amend --no-editwenn Sie die Festschreibungsnachricht nicht ändern möchten.

William Pursell
quelle
3
Vielen Dank. Wenn die sha1 des Commits bekannt wäre und das Commit nicht "zuletzt" wäre, wie wäre es aus Neugier möglich gewesen, dieses Commit zu ändern ?
James Raitsev
6
@Jam Ich würde sagen, versuche wirklich, das nicht zu tun ;-) Aber wenn du musst, besteht eine Möglichkeit (nicht sicher, ob es die beste ist) darin, die neue Datei als eigenes Commit festzuschreiben und dann git rebase -idie Commits neu zu ordnen und zusammenzuführen das Festschreiben der neuen Datei mit dem anderen Festschreiben. Das könnte für eine separate Frage wesentlich sein.
David Z
3
Wenn Sie das tun, git rebase -iwas @DavidZ vorschlägt, müssen Sie das neue Commit nur bis knapp unter dasjenige verschieben, mit dem Sie es kombinieren möchten, und das Wort des neuen Commits in squashanstelle vonpick
MM
Was ist, wenn ich viele Dateien bereitgestellt habe, aber nur eine einzige zum geänderten Commit hinzufügen möchte?
dfrankow
Entfernen Sie alle bereitgestellten Dateien (z. B. git reset), stellen Sie dann die Datei bereit , die Sie hinzufügen möchten, ändern Sie das Commit und stellen Sie dann alle Dateien erneut bereit .
William Pursell
53

Hier ist ein amüsantes Flussdiagramm 1, das auch überraschend praktisch ist: Es gibt die richtige Empfehlung sowohl für die ursprüngliche Frage als auch für das geänderte "Was wäre, wenn es nicht das letzte Commit wäre?" Frage.

Git-hübsches Flussdiagramm

1 Entnommen aus http://justinhileman.info/article/git-pretty/

Amalloy
quelle
12

Fügen Sie einem vorherigen Commit eine Datei hinzu

Wenn Sie den Zweig, an dem Sie arbeiten, bereits verschoben haben, lesen Sie bitte zuerst die Manpages . Bitte beachten Sie insbesondere:

Das Wiederherstellen (oder jede andere Form des Umschreibens) eines Zweigs, auf dem andere basieren, ist eine schlechte Idee: Jeder, der ihm nachgeschaltet ist, muss seinen Verlauf manuell korrigieren.

Wenn Sie Ihren Zweig jedoch nicht geschoben haben, bereiten Sie sich darauf vor, die Gefahrenzone zu betreten .

Suchen Sie den Commit-Hash

Zunächst müssen Sie den Commit-Hash des Commits kennen, zu dem Sie hinzufügen möchten. Dies wird durch gezeigt git log. Sie wollen eigentlich die commit angeben vor dem einen zu dem Sie hinzufügen möchten. (Sie können sich das als Startindex für das Commit-Segment vorstellen, das Sie ändern möchten.) Sie können sicherstellen, dass Sie das richtige Commit haben, indem Sie es ausführen git log -1 HEAD~n. Wobei 'n' eine Ganzzahl ist, die Sie erhöhen, bis Sie das richtige Commit haben. Oder du könntest zählen, nein wirklich.

Aber wenn Sie zählen, bestätigen Sie zumindest, dass Sie das richtige Commit haben git log -1 HEAD~5oder was auch immer Ihre Zählung war. Sie sollten das Commit, zu dem Sie hinzufügen möchten, NICHT sehen.

GEFAHR , heh

Jetzt können Sie loslegen git rebase -i HEAD~5. Oder was auch immer Ihr Commit-Hash ist. Dadurch wird Ihr bevorzugter Texteditor und eine zu bearbeitende Datei angezeigt. Die Datei ist die Aufgabenliste für den Befehl rebase. Die Kommentare in der Datei geben an, welche Optionen Sie haben. Suchen Sie einfach die Zeile mit dem Commit, zu dem Sie hinzufügen möchten, und ändern Sie in dieser Zeile "Auswählen" in "Bearbeiten". Speichern und schließen Sie nun die Datei.

Die Rebase wird beendet, sobald das Commit erreicht ist, das Sie bearbeiten sollen. Führen Sie a aus git status, um die zusätzlichen Informationen anzuzeigen. Stellen Sie Ihre Dateien so bereit, dass sie dem Commit mit git add .oder wie auch immer die Dateinamen hinzugefügt werden.

Dann tu es git commit --amend. Dadurch wird das Commit geändert, das Sie bearbeiten möchten.

Zum Schluss laufen git rebase --continue.

Im Zweifelsfall können Sie unter Linux mehr herausfinden, indem Sie die von man git-rebaseoder ausgegebenen Dokumente lesen git --help rebase.

BaseZen
quelle
2
In Bezug auf "Find the Commit Hash". Sie müssen nicht mit dem Zählen beginnen. Verwenden git logSie einfach , um Ihr Commit zu finden und seinen Hash zu kopieren, und verwenden Sie dann , um das vor Ihnen festgelegte Commit neu git rebase -i hash^zu erstellen.
Viktor