2010-02-11 3 views
328

Ich möchte etwas im ersten Commit meines Projekts ändern, ohne alle nachfolgenden Commits zu verlieren. Gibt es eine Möglichkeit, dies zu tun?Ändern Sie das erste Commit des Projekts mit Git?

Ich versehentlich meine rohe E-Mail in einem Kommentar im Quellcode aufgelistet, und ich möchte es ändern, wie ich von Bots Indexing GitHub Spamming bekommen.

Antwort

484

finden Als below von ecdpalma erwähnt, git 1.7.12+ (August 2012) wurde erweitert die Option --root für git rebase:

"git rebase [-i] --root $tip" kann jetzt verwendet werden, um den gesamten Verlauf, der zu "$tip" führt, auf das Root-Commit umzuschreiben.

Das neue Verhalten zunächst discussed here war:

Ich persönlich denke, „git rebase -i --root“ sollte nur vorgenommen werden, ohne arbeiten „--onto“ zu erfordern und lassen Sie „Bearbeiten“ auch die erste in der Geschichte.
Es ist verständlich, dass sich niemand darum gekümmert hat, denn die Leute schreiben viel seltener am Anfang der Geschichte als sonst.

Die patch followed.


(ursprüngliche Antwort, Februar 2010)

Wie in den Git FAQ erwähnt (und diesen SO question), die Idee ist:

  1. neu erstellen temporären Zweig
  2. es die Rewind commit Sie wollen ändern mit git reset --hard
  3. Ändern Sie das Commit (es wäre Spitze des aktuellen HEAD, und Sie können Ändern Sie den Inhalt einer Datei)
  4. Rebase Zweig auf der Oberseite geändert begehen, mit:

    git rebase --onto <tmp branch> <commit after changed> <branch>` 
    

Der Trick die Informationen, die Sie nicht durch eine später wieder eingeführt entfernen wollen sicher sein, ist verpflichten woanders in deiner Datei. Wenn Sie das vermuten, dann müssen Sie filter-branch --tree-filter verwenden, um sicherzustellen, dass der Inhalt dieser Datei keine der sinnvollen Informationen enthält.

In beiden Fällen überschreiben Sie den SHA1 jedes Commits. Seien Sie also vorsichtig, wenn Sie bereits den Zweig veröffentlicht haben, an dem Sie den Inhalt ändern.Sie sollten es wahrscheinlich nicht tun, es sei denn, Ihr Projekt ist noch nicht öffentlich und andere Leute haben die Arbeit nicht von den Commits, die Sie gerade umschreiben wollen, abhängig gemacht.

+4

auf OS X Mountain Lion mit dem System installierten git 1.7.9.6 (Apple-Git-31.1) verwenden kann, setze ich '' zu sei der gleiche Hash, den ich im Befehl 'git reset --hard' verwendet habe. Abgesehen von dieser kleinen Änderung funktioniert das wunderbar, um die Autorinformationen über alle Commits in einem Repo zu aktualisieren. – berto

+4

können Sie Beispiel geben, was $ Tip sein sollte. 'git rebase -i --root' arbeitete für mich. –

+0

@ RémiBenoit Ja, '$ tip' kann ein beliebiges Commit sein, das du willst. 'Master' (bedeutet' Master HEAD' Commit) ist in Ordnung. – VonC

0

Wenn Sie nur ändern die erste begehen, können Sie git rebase versuchen und ändern, die begehen, die zu diesem Beitrag ähnelt: How to modify a specified commit in git?

Und wenn Sie wollen, dass alle Commits modifizieren, welche die rohe enthalten E-Mail, Filter-Branch ist die beste Wahl. Es ist ein Beispiel dafür, wie E-Mail-Adresse auf dem Buch global ändern Pro Git, und Sie können diesen Link nützlich http://git-scm.com/book/en/Git-Tools-Rewriting-History

71

git rebase -i können Sie bequem alle vorherigen Commits bearbeiten, mit Ausnahme der Root-Commit. Die folgenden Befehle zeigen Ihnen, wie Sie dies manuell tun.

# tag the old root, "git rev-list ..." will return the hash of first commit 
git tag root `git rev-list HEAD | tail -1` 

# switch to a new branch pointing at the first commit 
git checkout -b new-root root 

# make any edits and then commit them with: 
git commit --amend 

# check out the previous branch (i.e. master) 
git checkout @{-1} 

# replace old root with amended version 
git rebase --onto new-root root 

# you might encounter merge conflicts, fix any conflicts and continue with: 
# git rebase --continue 

# delete the branch "new-root" 
git branch -d new-root 

# delete the tag "root" 
git tag -d root 
+10

Ich folgte diesen Anweisungen wie ein n00b und sie funktionierten perfekt - danke! Vielleicht möchten Sie erwähnen, '-a' zu' git commit --amend' hinzuzufügen oder 'git add' zu verwenden, weil ich dieses erste Mal vergessen habe! –

+1

Dies ist nicht mehr wahr, bitte beachten Sie die angenommene Antwort –

+0

Vielen Dank für Ihre Antwort. Ich benutze ein Centos 7 und die Git-Version ist 1.7.1 mit vielen Einschränkungen für Befehle. Die angenommene Antwort funktionierte nicht für mich und diese _ ** wie ** funktionierte wie ein Charme, um den Repository-Verlauf von _ ** anfängliche commit wiederherzustellen ** _ –

126

Wie in 1.7.12 Release Notes erwähnt, Sie

$ git rebase -i --root 
+2

git Version 1.7.9 beschwert sich: 'Sie müssen angeben - -onto bei der Verwendung von --root' –

+2

Es funktioniert gut mit Git 1.9.4 –

+2

Arbeitete wunderbar auch für mich, mit Git 1.9.4. –

Verwandte Themen