J'ai effectué une série de commits dans Git et je réalise maintenant que j'ai oublié de définir correctement mon nom d'utilisateur et les propriétés de messagerie de l'utilisateur (nouvelle machine). Je n'ai pas encore transféré ces commits vers mon référentiel. Comment puis-je alors les corriger avant de le faire (seuls les 3 derniers commits sur la branche principale)?
J'ai regardé git reset
et git commit -C <id> --reset-author
, mais je ne pense pas être sur la bonne voie.
Rebaser/modifier semble inefficace, lorsque vous avez le pouvoir de branche-filtre à portée de main:
git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
GIT_AUTHOR_EMAIL=correct@email;
GIT_AUTHOR_NAME="Correct Name";
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
(découpé sur plusieurs lignes pour plus de clarté, mais pas nécessaire)
Assurez-vous d'inspecter le résultat lorsque vous avez terminé, pour vous assurer de ne rien changer de ce que vous ne vouliez pas faire!
L’approche de rebase interactive est très jolie quand elle est utilisée avec exec. Vous pouvez exécuter n’importe quelle commande Shell sur un commit spécifique ou sur tous les commits de la base.
Commencez par définir vos paramètres d'auteur git
git config --global user.name "John Doe"
git config --global user.email [email protected]
Puis réinitialiser l'auteur pour tous les commits après le SHA donné
git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"
Cela fera apparaître votre éditeur pour confirmer les modifications. Tout ce que vous avez à faire ici est de sauvegarder et de quitter. Il passera par chaque commit et exécutera la commande spécifiée dans l’option -x.
Selon le commentaire de @ Dave ci-dessous, vous pouvez également modifier l'auteur tout en conservant les horodatages d'origine avec:
git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <[email protected]>' -CHEAD"
Pour changer l'auteur uniquement pour le dernier commit:
git commit --amend --author 'Author Name <[email protected]>' --no-edit
Supposons que vous souhaitiez uniquement modifier l'auteur pour les N derniers commits:
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"
REMARQUES
--no-edit
s'assure que le git commit --amend
ne demande pas de confirmation supplémentairegit rebase -i
, vous pouvez sélectionner manuellement les commits où changer d’auteur, le fichier que vous éditez ressemblera à ceci:
pick 897fe9e simplify code a little
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick dc18f70 bugfix
Je crois que ce que vous cherchez, c'est git rebase --interactive
Il vous permet de réinitialiser un commit spécifique, puis de jeter l'historique en changeant l'ajout ou le groupement de commits.
Ici vous avez une explication https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git -rebase-interactive
Si vous ne vous sentez pas en sécurité à propos de la dégradation et des modifications, vous pouvez le faire de cette façon. En même temps, vous définissez également la configuration globale, ce que vous vouliez probablement faire de toute façon.
git reset HEAD~
(annule le dernier commit)
git config --global user.name "Your Name"
git config --global user.email [email protected]
git commit -m "message"
Cette méthode a été documentée par github dans ce but précis. Les étapes sont les suivantes:
git clone --bare https://github.com/user/repo.git
cd repo
OLD_EMAIL
, CORRECT_EMAIL
et CORRECT_NAME
)#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"
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
git Push --force --tags Origin 'refs/heads/*'
et vous avez terminé!