Ich möchte den Autor eines bestimmten Commits in der Geschichte ändern. Es ist nicht das letzte Commit.
Ich weiß über diese Frage Bescheid - Wie ändere ich den Autor eines Commits in Git?
Aber ich denke über etwas nach, bei dem ich das Commit durch Hash oder Short-Hash identifiziere.
git
git-commit
MicTech
quelle
quelle
Antworten:
Interaktives Rebase von einem Punkt früher im Verlauf als dem Commit, den Sie ändern müssen (
git rebase -i <earliercommit>
). In der Liste der Commits indexiert wird, ändern Sie den Text aus ,pick
umedit
neben dem Hash - Wert des von Ihnen ändern möchten. Wenn git Sie dann auffordert, das Commit zu ändern, verwenden Sie Folgendes:Wenn Ihr Commit-Verlauf beispielsweise
A-B-C-D-E-F
mitF
asHEAD
ist und Sie den Autor vonC
und ändern möchten,D
würden Sie ...git rebase -i B
( hier ist ein Beispiel dafür, was Sie nach der Ausführung desgit rebase -i B
Befehls sehen werden ).A
, verwenden Siegit rebase -i --root
C
undD
vonpick
bisedit
:wq
).C
git commit --amend --author="Author Name <[email protected]>"
git rebase --continue
D
git commit --amend --author="Author Name <[email protected]>"
wiedergit rebase --continue
git push -f
diese Option, um Ihren Ursprung mit den aktualisierten Commits zu aktualisieren.quelle
git rebase -i <commit>
vim
. Geben Sie zum Speichern und Beenden Esc: wq Enter ein. Wenn es sich dagegen um Nano handelt und Sie unten Dinge wie "WriteOut: ^ O" sehen, sollten Sie stattdessen Strg + O, Enter, Strg + X verwenden.--no-edit
Option.git commit --amend --reset-author --no-edit
öffnet keinen Editor. Verfügbar seit Git 1.7.9.git rebase -i --root
Die akzeptierte Antwort auf diese Frage ist eine wunderbar clevere Verwendung der interaktiven Rebase, die jedoch leider zu Konflikten führt, wenn sich das Commit, von dem wir versuchen, den Autor zu ändern, in einem Zweig befand, der später zusammengeführt wurde. Im Allgemeinen funktioniert es nicht beim Umgang mit unordentlichen Geschichten.
Da ich besorgt bin, Skripte auszuführen, die vom Festlegen und Deaktivieren von Umgebungsvariablen abhängen, um den Git-Verlauf neu zu schreiben, schreibe ich basierend auf diesem Beitrag eine neue Antwort, die dieser Antwort ähnelt, aber vollständiger ist.
Im Gegensatz zur verknüpften Antwort wird Folgendes getestet und funktioniert. Nehmen Sie zur Klarheit der Darstellung an, dass
03f482d6
es sich um das Commit handelt, dessen Autor wir ersetzen möchten, und42627abe
um das Commit mit dem neuen Autor.Überprüfen Sie das Commit, das wir ändern möchten.
Nehmen Sie den Autorwechsel vor.
Jetzt haben wir ein neues Commit mit angenommenem Hash
42627abe
.Kasse der ursprünglichen Filiale.
Ersetzen Sie das alte Commit lokal durch das neue.
Schreiben Sie alle zukünftigen Commits basierend auf dem Ersatz neu.
Entfernen Sie den Ersatz für die Sauberkeit.
Übertragen Sie den neuen Verlauf (verwenden Sie --force nur, wenn das Folgende fehlschlägt, und erst nach Überprüfung der Integrität mit
git log
und / odergit diff
).Anstelle von 4-6 können Sie einfach auf ein neues Commit zurückgreifen:
quelle
git rebase -i
. Noch nie davon gehörtgit replace
. +1--force-with-lease
anstelle von-f
. Es ist sicherer.git filter-branch -- --all
Commits in allen Zweigen geändert werden, in denen sich das ursprüngliche Commit befand. Wenn Sie nicht über genügend Anmeldeinformationen verfügen (oder den Verlauf anderer Zweige einfach nicht ändern möchten), sollten Sie mit dieser Antwort vorsichtig sein.Die Github-Dokumentation enthält ein Skript, das die Committer-Informationen für alle Commits in einem Zweig ersetzt .
Führen Sie das folgende Skript vom Terminal aus, nachdem Sie die Variablenwerte geändert haben
Übertragen Sie den korrigierten Verlauf an GitHub:
ODER wenn Sie ausgewählte Referenzen der Zweige verschieben möchten, verwenden Sie
quelle
clone
/ vermeiden . Ich konnte keinen Weg finden, diesen Namespace intelligent zu entfernen, und löschte schließlich das Verzeichnis , was funktionierte.push
refs/original/
.git/refs/original
git push -f
Push-Änderungen am Repo erzwingen.Setzen Sie Ihre E-Mail global auf die Konfiguration zurück:
git config --global user.email [email protected]
Setzen Sie nun den Autor Ihres Commits zurück, ohne dass eine Bearbeitung erforderlich ist:
git commit --amend --reset-author --no-edit
quelle
It's not last commit.
Wie würden sieamend
es also tun?git reset HEAD~
, Ihre vorgeschlagenen Zeilen ausgeführt und dann das nächste Commit erneut manuell ausgeführt. Hat gut funktioniert!git config --local user.name FirstName LastName
und den richtigen Autor für das aktuelle Git-Repo eingit config --local user.email [email protected]
. Dann bewerben Sie sich mit den letzten sechs Commitsgit rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
. Schieben Sie es schließlich auf Remote-Git-Repo mitgit push --force-with-lease
.Sie können den Autor des letzten Commits mit dem folgenden Befehl ändern.
git commit --amend --author="Author Name <[email protected]>"
Wenn Sie jedoch mehr als einen festgeschriebenen Autorennamen ändern möchten, ist dies etwas schwierig. Sie müssen eine interaktive Rebase starten, dann Commits als Bearbeiten markieren, sie nacheinander ändern und beenden.
Starten Sie mit
git rebase -i
. Es wird Ihnen so etwas zeigen.Ändern Sie das
pick
Schlüsselwort inedit
für die Commits , für die Sie den Autorennamen ändern möchten.Schließen Sie dann den Editor. Für die Anfänger drücken,
Escape
dann tippen:wq
und drückenEnter
.Dann sehen Sie Ihr Terminal, als wäre nichts passiert. Eigentlich befinden Sie sich mitten in einer interaktiven Rebase. Jetzt ist es Zeit, den Autorennamen Ihres Commits mit dem obigen Befehl zu ändern. Der Editor wird erneut geöffnet. Beenden Sie und fahren Sie mit Rebase fort
git rebase --continue
. Wiederholen Sie dies für die Anzahl der Festschreibungen, die Sie bearbeiten möchten. Sie können sicherstellen, dass die interaktive Wiederherstellung abgeschlossen ist, wenn Sie dieNo rebase in progress?
Nachricht erhalten.quelle
pick
Aktion auch zulassen und nach jeder Zeile hinzufügenexec git commit --no-edit --amend --author="MyNewAuthor <[email protected]>"
Die Antworten in der Frage, auf die Sie verlinkt haben, sind gute Antworten und decken Ihre Situation ab (die andere Frage ist allgemeiner, da mehrere Commits neu geschrieben werden müssen).
Als Ausrede zum Ausprobieren habe
git filter-branch
ich ein Skript geschrieben, um den Autorennamen und / oder die Autoren-E-Mail für ein bestimmtes Commit neu zu schreiben:quelle
Commit vor:
Um den Autor für alle Commits festzulegen, können Sie den Befehl aus der Antwort von @ Amber anwenden:
Oder um Ihren Namen und Ihre E-Mail-Adresse wiederzuverwenden, können Sie einfach schreiben:
Commit nach dem Befehl:
Zum Beispiel, um alle ab zu ändern
4025621
:Du musst rennen:
Hinweis: Um einen Autor einzuschließen, der Leerzeichen wie einen Namen und eine E-Mail-Adresse enthält, muss der Autor von Anführungszeichen umgeben sein. Zum Beispiel:
oder fügen Sie diesen Alias hinzu in
~/.gitconfig
:Und dann laufen:
quelle
git shortlog -e -s
.Wenn Sie ein zentrales Repository verwenden, gibt es einen zusätzlichen Schritt zu Bernsteins Antwort :
git push -f
um die Aktualisierung des zentralen Repositorys zu erzwingen.Achten Sie darauf, dass nicht viele Leute an demselben Zweig arbeiten, da dies die Konsistenz beeinträchtigen kann.
quelle
Wenn Sie dies tun,
git rebase -i
gibt es dieses interessante Stück im Dokument:A-B-C-D-E-F
,B
undD
(= 2 Commits) ändern ,dann können Sie tun:
git config user.name "Correct new name"
git config user.email "[email protected]"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
wählt das übergeordnete Element von ausB
.pick
umsquash
für diejenigen.Beispiel für das, was
git rebase -i B^
Sie erhalten:Ändern Sie das in:
Sie werden aufgefordert, die Nachrichten zu bearbeiten:
und Sie können einfach die ersten paar Zeilen entfernen.
quelle
Um die Antwort von Eugen Konkov zu unterstützen, verwenden Sie das
--root
Flag , um mit dem Root-Commit zu beginnen . Die--no-edit
Flagge ist auch hilfreichquelle
Finden Sie einen Weg, der den Benutzer schnell wechseln kann und keine Nebenwirkungen für andere Commits hat.
Einfacher und klarer Weg:
detaillierte Operationen
refs/heads/master.
quelle
Wenn das Commit, das Sie ändern möchten, nicht das letzte Commit ist, führen Sie die folgenden Schritte aus. Wenn sich Ihr Commit in einem anderen Zweig befindet, wechseln Sie zuerst zu diesem Zweig.
git checkout branch_name
Suchen Sie das Commit vor dem Commit, das Sie ändern möchten, und suchen Sie den Hash. Geben Sie dann den Befehl rebase aus.
Git Rebase -i -p Hash von Commit
Dann öffnet sich ein Editor und gibt "Bearbeiten" für die Commits ein, die Sie ändern möchten. Belassen Sie andere mit der Standardoption "Auswählen". Einmal geändert, geben Sie 'esc' ein und wq! beenden.
Geben Sie dann den Befehl git commit mit der Änderungsoption aus.
git commit --amend --author = "Benutzername email" --no-edit
Geben Sie dann den folgenden Befehl ein.
Git Rebase - weiter
Sobald der Commit-Autor im lokalen Repository aktualisiert wurde, übertragen Sie die Änderungen in das Remote-Repository.
quelle
Es gibt auch einen faulen Ansatz für dieses Problem, insbesondere wenn Sie mehr als ein Commit haben, das Sie ändern möchten. In meinem Fall hatte ich eine neue Niederlassung mit mehreren Commits mit einem falschen Autor. Was hat mir also geholfen:
Gehen Sie zu Ihrer ursprünglichen Filiale:
Erstellen Sie einen neuen Zweig daraus:
Führen Sie es ohne Commit-Informationen zu einem Commit zusammen:
Möglicherweise möchten Sie auch Änderungen vornehmen:
Ändern Sie den Namen des Autors und übernehmen Sie Änderungen:
Und das war's, Sie können die Änderungen vorantreiben.
Danach können Sie den Zweig mit einem falschen Autor löschen.
quelle
Schritte zum Umbenennen des Autorennamens nach dem Festschreiben
git rebase i HEAD ~ 10 (10 ist das gesamte Commit, das beim Rebase angezeigt werden soll)
If you Get anything like below
fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try
git rebase (--continue | --abort | --skip)
If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.
Geben Sie dann je nach Bedarf "git rebase --continue" oder "git rebase --abort" ein
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Jetzt müssen Sie den folgenden Befehl direkt unter dem Commit hinzufügen, den Sie bearbeiten möchten, wie unten
pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <[email protected]>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <[email protected]>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <[email protected]>'
Das war's, jetzt drücke einfach ESC: wq und du bist fertig
Dann git push origin HEAD: BRANCH NAME -f [bitte pass auf -f Force push auf]
wie
git push -f
odergit push origin HEAD: dev -f
quelle
git push
Befehl aktualisieren ?Globales Ändern des Committer-Namens und der E-Mail-Adresse:
Ändern des Committer-Namens und der E-Mail-Adresse pro Repository:
Ändern der Autoreninformationen nur für das nächste Commit:
Hinweis : Für andere Situationen und weitere Informationen lesen Sie die Post-Referenz .
quelle
Wenn Sie das AUTOR OF THE LAST-Commit ändern müssen und kein anderer Ihr Repository verwendet, können Sie Ihr letztes Commit rückgängig machen mit:
Ändern Sie den Autorennamen Ihres Commits mit:
Beenden Sie den sich öffnenden Editor und drücken Sie Ihren Code erneut:
quelle
Bei der Merge-Commit-Nachricht habe ich festgestellt, dass ich sie
rebase
zumindest mit gitlab nicht ändern kann . Es zeigt die Zusammenführung als Commit, aber ich kann nicht auf diese #sha zurückgreifen. Ich fand diesen Beitrag hilfreich.Diese drei Codezeilen haben den Job zum Ändern der Merge-Commit-Nachricht (wie der Autor) ausgeführt.
quelle
Sie können diese Befehle von der offiziellen Seite von Github verwenden
https://help.github.com/de/github/using-git/changing-author-info
Hier sind die Befehle
Hier können Sie die alte E-Mail in Ihren neuen Benutzernamen und Ihre neue E-Mail-Adresse ändern.
quelle