Voglio cambiare l'autore di un commit specifico nella cronologia. Non è l'ultimo commit.
Conosco questa domanda: come posso cambiare l'autore di un commit in git?
Ma sto pensando a qualcosa, in cui identifico il commit per hash o short-hash.
Voglio cambiare l'autore di un commit specifico nella cronologia. Non è l'ultimo commit.
Conosco questa domanda: come posso cambiare l'autore di un commit in git?
Ma sto pensando a qualcosa, in cui identifico il commit per hash o short-hash.
Risposte:
Rinnovo interattivo di un punto precedente alla cronologia rispetto al commit che è necessario modificare ( git rebase -i <earliercommit>
). Nella lista dei commit essere calcolato su base, modificare il testo da pick
al edit
accanto al hash di quello che si desidera modificare. Quindi quando git ti chiede di modificare il commit, usa questo:
git commit --amend --author="Author Name <email@address.com>" --no-edit
Ad esempio, se la tua cronologia di commit è A-B-C-D-E-F
con F
as HEAD
e vuoi cambiare l'autore di C
e D
, allora dovresti ...
git rebase -i B
( ecco un esempio di ciò che vedrai dopo aver eseguito il git rebase -i B
comando )
A
, utilizzaregit rebase -i --root
C
e D
da pick
aedit
:wq
).C
git commit --amend --author="Author Name <email@address.com>"
git rebase --continue
D
git commit --amend --author="Author Name <email@address.com>"
nuovogit rebase --continue
git push -f
per aggiornare l'origine con gli commit aggiornati.git rebase -i <commit>
vim
. Per salvare ed uscire, digita Esc: wq Invio. D'altra parte, se è Nano e vedi cose come "WriteOut: ^ O" nella parte inferiore, allora dovresti usare Ctrl + O, Invio, Ctrl + X invece.
--no-edit
opzione. git commit --amend --reset-author --no-edit
non aprirà un editor. Disponibile da git 1.7.9.
git rebase -i --root
La risposta accettata a questa domanda è un uso meravigliosamente intelligente del rebase interattivo, ma sfortunatamente mostra conflitti se l'impegno che stiamo cercando di cambiare l'autore del passato era su un ramo che è stato successivamente unito. Più in generale, non funziona quando si gestiscono storie disordinate.
Dato che sono preoccupato per l'esecuzione di script che dipendono dall'impostazione e dall'impostazione delle variabili di ambiente per riscrivere la cronologia di Git, sto scrivendo una nuova risposta basata su questo post che è simile a questa risposta ma è più completa.
Quanto segue è testato e funzionante, a differenza della risposta collegata. Supponiamo per chiarezza di esposizione che 03f482d6
è il commit di cui stiamo cercando di sostituire 42627abe
l'autore , ed è il commit con il nuovo autore.
Controlla il commit che stiamo cercando di modificare.
git checkout 03f482d6
Cambia l'autore.
git commit --amend --author "New Author Name <New Author Email>"
Ora abbiamo assunto un nuovo commit con l'hash assunto 42627abe
.
Acquista il ramo originale.
Sostituisci il vecchio commit con quello nuovo localmente.
git replace 03f482d6 42627abe
Riscrivi tutti i commit futuri in base alla sostituzione.
git filter-branch -- --all
Rimuovere il ricambio per la pulizia.
git replace -d 03f482d6
Invia la nuova cronologia (usa solo --force se il seguito non riesce e solo dopo aver verificato la sanità mentale con git log
e / o git diff
).
git push --force-with-lease
Invece di 4-6 puoi semplicemente rifare il nuovo commit:
git rebase -i 42627abe
git rebase -i
. Non ho mai sentito parlare di questa git replace
cosa prima. +1
--force-with-lease
invece di -f
. È più sicuro.
git filter-branch -- --all
sta cambiando i commit in tutti i rami in cui si trovava il commit originale. Se non si dispone di credenziali sufficienti (o semplicemente non si desidera modificare la cronologia dei rami di altri), è bene fare attenzione con questa risposta.
La documentazione di Github contiene uno script che sostituisce le informazioni sul committer per tutti i commit in un ramo .
Eseguire il seguente script dal terminale dopo aver modificato i valori delle variabili
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
Invia la cronologia corretta a GitHub:
git push --force --tags origin 'refs/heads/*'
OPPURE se ti piace spingere i riferimenti selezionati dei rami, usa
git push --force --tags origin 'refs/heads/develop'
clone
/ push
, finirai con uno spazio dei nomi di backup refs/original/
. Non sono riuscito a trovare un modo per rimuovere questo spazio dei nomi in modo intelligente, quindi ho finito per eliminare la directory .git/refs/original
, che ha funzionato.
git push -f
forzare le modifiche push al repository.
Reimposta la tua e-mail sulla configurazione globale:
git config --global user.email example@email.com
Ora reimposta l'autore del commit senza la modifica richiesta:
git commit --amend --reset-author --no-edit
It's not last commit.
Quindi come lo farebbero amend
?
git reset HEAD~
, ho eseguito le tue righe suggerite, quindi ho eseguito nuovamente il commit manualmente. Ha funzionato bene!
git config --local user.name FirstName LastName
e git config --local user.email first.last@example.com
. Quindi applicare agli ultimi sei commit usando git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
. Infine spingerlo nel repository Git remoto usando git push --force-with-lease
.
È possibile modificare l'autore dell'ultimo commit utilizzando il comando seguente.
git commit --amend --author="Author Name <email@address.com>"
Tuttavia, se vuoi cambiare più di un nome autore, è un po 'complicato. È necessario avviare un rebase interattivo, quindi contrassegnare i commit come modifica, quindi modificarli uno per uno e terminare.
Inizia a ripetere git rebase -i
. Ti mostrerà qualcosa del genere.
Cambia la pick
parola chiave in edit
per i commit che vuoi cambiare il nome dell'autore.
Quindi chiudere l'editor. Per i principianti, premi Escape
quindi digita :wq
e premiEnter
.
Quindi vedrai il tuo terminale come se niente fosse. In realtà sei nel mezzo di un rebase interattivo. Ora è il momento di modificare il nome dell'autore del commit usando il comando sopra. Si aprirà di nuovo l'editor. Esci e continua con rebase git rebase --continue
. Ripetere lo stesso per il conteggio di commit che si desidera modificare. Puoi assicurarti che il rebase interattivo sia terminato quando ricevi il No rebase in progress?
messaggio.
pick
azione e aggiungere dopo ogni rigaexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Le risposte alla domanda a cui ti sei collegato sono buone risposte e coprono la tua situazione (l'altra domanda è più generale poiché comporta la riscrittura di più commit).
Come scusa per provarlo git filter-branch
, ho scritto uno script per riscrivere il nome dell'autore e / o l'email dell'autore per un determinato commit:
#!/bin/sh
#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
# If -f is supplied it is passed to "git filter-branch".
#
# If <branch-to-rewrite> is not provided or is empty HEAD will be used.
# Use "--all" or a space separated list (e.g. "master next") to rewrite
# multiple branches.
#
# If <new-name> (or <new-email>) is not provided or is empty, the normal
# user.name (user.email) Git configuration value will be used.
#
force=''
if test "x$1" = "x-f"; then
force='-f'
shift
fi
die() {
printf '%s\n' "$@"
exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"
TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL
filt='
if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
if test -n "$TARG_EMAIL"; then
GIT_AUTHOR_EMAIL="$TARG_EMAIL"
export GIT_AUTHOR_EMAIL
else
unset GIT_AUTHOR_EMAIL
fi
if test -n "$TARG_NAME"; then
GIT_AUTHOR_NAME="$TARG_NAME"
export GIT_AUTHOR_NAME
else
unset GIT_AUTHOR_NAME
fi
fi
'
git filter-branch $force --env-filter "$filt" -- $br
Impegnare prima:
Per correggere l'autore di tutti i commit è possibile applicare il comando dalla risposta di @ Amber:
git commit --amend --author="Author Name <email@address.com>"
O per riutilizzare il tuo nome ed e-mail puoi semplicemente scrivere:
git commit --amend --author=Eugen
Commettere dopo il comando:
Ad esempio per cambiare tutto a partire da 4025621
:
Devi eseguire:
git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621
Nota: per includere un autore contenente spazi come un nome e un indirizzo e-mail, l'autore deve essere racchiuso tra virgolette. Per esempio:
git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621
o aggiungi questo alias in ~/.gitconfig
:
[alias]
reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --
E poi esegui:
git reauthor 4025621 Eugen
git shortlog -e -s
.
C'è un ulteriore passaggio nella risposta di Amber se si utilizza un repository centralizzato:
git push -f
per forzare l'aggiornamento del repository centrale.
Fai attenzione che non ci siano molte persone che lavorano nello stesso ramo perché può rovinare la coerenza.
Quando lo fai git rebase -i
c'è questo bit interessante nel documento:
Se si desidera piegare due o più commit in uno, sostituire il comando
"pick"
per il secondo e i commit successivi con"squash"
o"fixup"
. Se i commit avevano autori diversi, il commit piegato verrà attribuito all'autore del primo commit. Il messaggio di commit suggerito per il commit piegato è la concatenazione dei messaggi di commit del primo commit e di quelli con il"squash"
comando, ma omette i messaggi di commit dei commit con il"fixup"
comando.
A-B-C-D-E-F
,B
e D
(= 2 commit),allora puoi fare:
git config user.name "Correct new name"
git config user.email "correct@new.email"
git commit --allow-empty -m "empty"
git rebase -i B^
B^
seleziona il genitore di B
.pick
a squash
per quelli.Esempio di cosa git rebase -i B^
ti darà:
pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty
cambialo in:
# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message
Ti verrà richiesto di modificare i messaggi:
# This is a combination of 2 commits.
# The first commit's message is:
empty
# This is the 2nd commit message:
...some useful commit message there...
e puoi semplicemente rimuovere le prime poche righe.
Per favorire la risposta di Eugen Konkov , per iniziare dal commit di root, usa --root
flag. Anche la --no-edit
bandiera è utile
git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"
Trova un modo per cambiare rapidamente l'utente e senza effetti collaterali per gli altri commit.
git config user.name "New User"
git config user.email "newuser@gmail.com"
git log
git rebase -i 1f1357
# change the word 'pick' to 'edit', save and exit
git commit --amend --reset-author --no-edit
git rebase --continue
git push --force-with-lease
git log
git config user.name "New User"
git config user.email "newuser@gmail.com"
git rebase -i 1f1357
# change word pick to edit, save and exit
edit 809b8f7 change code order
pick 9baaae5 add prometheus monitor kubernetes
edit 5d726c3 fix liquid escape issue
edit 3a5f98f update tags
pick 816e21c add prometheus monitor kubernetes
Stopped at 809b8f7... change code order
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
refs/heads/master.
# each continue will show you an amend message
# use git commit --amend --reset-author --no-edit to comfirm
# use git rebase --skip to skip
git commit --amend --reset-author --no-edit
git rebase --continue
git commit --amend --reset-author --no-edit
...
git rebase --continue
Successfully rebased and updated refs/heads/master.
git push --force-with-lease
Se il commit che si desidera modificare non è l'ultimo commit, seguire i passaggi seguenti. Se il commit è in un ramo diverso, passa prima a quel ramo.
git checkout branch_name
Trova il commit prima del commit che desideri modificare e trova il suo hash. Quindi emettere il comando rebase.
git rebase -i -p hash di commit
Quindi un editor si aprirà e inserirà 'modifica' per i commit che si desidera modificare. Lascia gli altri con l'opzione 'pick' predefinita. Una volta modificato, inserire il tasto 'esc' e wq! uscire.
Quindi emettere il comando git commit con l'opzione di modifica.
git commit --amend --author = "Username email" --no-edit
Quindi emettere il seguente comando.
git rebase --continua
Una volta che l'autore del commit viene aggiornato nel repository locale, inviare le modifiche al repository remoto.
C'è anche un approccio pigro a questo problema, specialmente se hai più di un commit che vuoi cambiare. Nel mio caso, avevo una nuova filiale con diversi commit con un autore sbagliato, quindi cosa mi ha aiutato:
Vai alla tua filiale originale:
git checkout develop
Crea un nuovo ramo da esso:
git checkout -b myFeature develop
Uniscilo senza informazioni di commit come un commit:
git merge --no-commit --squash branchWrongAuthor
Potresti anche voler mettere in scena i cambiamenti:
git stage .
Cambia il nome dell'autore e apporta le modifiche:
git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"
Ed è tutto, puoi spingere le modifiche.
git push
Successivamente puoi eliminare il ramo con un autore sbagliato.
Passaggi per rinominare il nome dell'autore dopo aver eseguito il commit
git rebase i HEAD ~ 10 (10 è il commit totale da visualizzare su rebase)
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.
Quindi digitare "git rebase --continue" o "git rebase --abort" secondo le tue necessità
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Ora devi aggiungere il comando di seguito appena sotto il commit che desideri modificare, come di seguito
pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <author.name@mail.com>'
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>'
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.com>'
Ecco fatto, ora premi ESC,: wq e sei pronto
Quindi git push origin HEAD: BRANCH NAME -f [si prega di occuparsi di -f Force push]
come git push -f
ogit push origin HEAD: dev -f
git push
comando?
Modifica del nome e dell'email del committer a livello globale:
$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"
Modifica del nome e dell'email del committer per repository:
$ git config user.name "John Doe"
$ git config user.email "john@doe.org"
Modifica delle informazioni sull'autore solo per il prossimo impegno:
$ git commit --author="John Doe <john@doe.org>"
Suggerimento : per altre situazioni e leggi maggiori informazioni leggi il riferimento al post .
Se ciò che è necessario modificare è il commit AUTORE DELL'ULTIMO e nessun altro utilizza il repository, è possibile annullare l'ultimo commit con:
git push -f origin last_commit_hash:branch_name
cambia il nome dell'autore del tuo commit con:
git commit --amend --author "type new author here"
Esci dall'editor che si apre e premi nuovamente il tuo codice:
git push
Per il messaggio di commit di merge, ho scoperto che non posso modificarlo usando rebase
, almeno su gitlab. Mostra l'unione come commit ma non posso rifare su quella #sha. Ho trovato utile questo post.
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Queste tre righe di codice hanno fatto il lavoro per cambiare il messaggio di commit della fusione (come l'autore).
puoi usare questi comandi dalla pagina ufficiale di github
https://help.github.com/en/github/using-git/changing-author-info
ecco i comandi
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
qui puoi cambiare la vecchia e-mail con il tuo nuovo nome utente e indirizzo e-mail.