Est-il possible de modifier un message de commit sur GitHub?

130

Existe-t-il un moyen de modifier un message de validation après avoir validé et transmis à GitHub? Je vois qu'il y a un 'ajouter une note' ainsi que des commentaires en ligne, mais pas l'édition réelle d'un message de commit. Il y a aussi 'amend commit' dans les extensions git mais cela ne modifie pas le message existant.

Matthew Peters
la source
Vous pouvez essayer de revenir sur la validation (voir quelques options dans cette question SO: stackoverflow.com/questions/4114095/… ) - assurez-vous d'abord de sauvegarder les modifications de code afin de ne pas les perdre à des fins de commentaire!
Traveller Tech Guy

Réponses:

184
  1. git rebase -i <commit hash you want to change>^

    Ceci ouvrira votre éditeur par défaut (généralement ) avec une liste de validations et d’actions pour chacun. Par défaut, l'action est pick.

  2. Pour tout engagement que vous souhaitez modifier, changez pickpour reword.

  3. Sauvegarder et quitter (dans vi:) :wq.

  4. Pour chaque validation, vous aurez un éditeur pour éditer le message de validation. Changez-le comme bon vous semble, sauvegardez et quittez.

    Une fois que vous avez terminé de modifier tous les messages de validation, vous retournez à l'invite de commande et créez une nouvelle arborescence avec les messages mis à jour.

  5. Vous pouvez maintenant les télécharger sur github en utilisant git push origin --force.

Si vous avez juste besoin de réparer votre dernier commit, vous pouvez remplacer les étapes 1 à 4 par git commit --amend.

Mureinik
la source
3
@MatthewPeters Je suppose qu'il devrait y avoir un moyen, mais je ne sais pas - j'utilise directement la ligne de commande.
Mureinik
4
Il ne semble pas que vous puissiez spécifier <le hachage de validation que vous souhaitez modifier>, vous devez plutôt spécifier le hachage de la validation précédant celui que vous souhaitez modifier ou utiliser HEAD ~ x où x est le nombre de validations de HEAD où l'élément que vous souhaitez changer réside.
ssc327
3
@ ssc327 Notez que j’ai ^là - j’ai en effet suggéré de se baser sur le parent du commit que vous voulez modifier.
Mureinik
2
@Murenik vous avez raison, j'ai quelque peu manqué de voir le ^
ssc327
1
@deadfish A l'aide de la ligne de commande Windows, vous devez taper ^^pour terminer la commande par un littéral, ^ par exemple: git rebase -i 2c747b32^^
Wyck
35

Dans Intellij Idea, vous pouvez le faire si facilement.

  1. Contrôle de version ouvert (historique)
  2. Sélectionnez l'onglet journal
  3. Sélectionnez commettre pour changer le commentaire
  4. appuyez sur F2 (Mac fn + F2) et mettez à jour votre message de validation
fedrbodr
la source
1
Ne fonctionne pas si vous avez déjà poussé à distance.
paynd
8
Vous devez exécuter git push origin --forceensuite comme suggéré dans la réponse de @ Mureinik.
Dan Macák
1
L'option "reword" est désactivée si la validation a déjà été poussée.
Huyz
1
Pour le faire avec Intellij IDEA pour un commit qui a été poussé, vous devez commencer par une rebase interactive (comme vous le feriez depuis la ligne de commande de Git). Pour faire la rebase, faites un clic droit sur votre projet -> élément de menu "Git" -> "Référentiel" -> "rebase ..." (dernier élément de menu). Insérez le SHA du commit avant celui que vous souhaitez modifier dans le champ "Sur" et cliquez sur "Rebase". Vous obtiendrez alors l'invite de rebase interactive. Sélectionnez "reformuler" dans la liste déroulante des actions à côté du ou des commit (s) que vous souhaitez modifier, puis cliquez sur le bouton "Démarrer le rebasement" (suite dans le commentaire suivant)
jplandrain
1
(suite) Une invite de texte vous sera ensuite présentée pour chaque commit que vous souhaitez modifier. Une fois les messages de journal modifiés, vous pouvez appliquer d'autres modifications (notez que l'option "reformulation" n'est plus grisée). Lorsque vous avez terminé, vous pouvez alors forcer la modification de vos modifications afin de conclure la réabonnement interactif. L'ensemble du processus est en fait exactement le même que dans la réponse de @Mureinik qui le fait à partir de la ligne de commande.
Jplandrain
3

Prémisse:

si votre git-graph ressemble à ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192et b7ec061sont les hashes commit de target-commit et parent-commit, séparément)

Solution:

vous pouvez simplement taper les instructions suivantes ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Explication:

  1. git reset --soft b7ec061 conservera vos modifications de fichiers et se réinitialisera sur parent-commit (c.-à-d. b7ec061)
  2. git commit -m "..." créera localement un nouveau commit
  3. git push -f va pousser votre nouveau commit sur le serveur et remplacer l'ancien (par exemple df9c192)
Alumi Lu
la source
2

Une autre option consiste à créer une "validation d'errata" supplémentaire (et push) faisant référence à l'objet de validation contenant l'erreur. La nouvelle validation d'errata fournit également la correction. Une validation errata est une validation sans modification de code de fond, mais un message de validation important. Par exemple, ajoutez un espace dans votre fichier Lisez-moi et validez cette modification avec le message de validation important, ou utilisez l'option git --allow-empty. C’est certainement plus facile et plus sûr que de changer de base, cela ne modifie pas l’histoire réelle et il garde l’arbre des branches propre (en utilisantamendest également un bon choix si vous corrigez le dernier commit, mais un commit errata peut être un bon choix pour les plus anciens commits). Ce genre de chose arrive si rarement que le simple fait de documenter l'erreur est suffisant. À l'avenir, si vous devez rechercher un mot-clé dans le journal git, il se peut que le commit original (erroné) n'apparaisse pas car le mot-clé incorrect a été utilisé dans ce commit original (la faute de frappe d'origine). Toutefois, le mot-clé apparaîtra. dans le commit d'errata qui vous indiquera ensuite le commit d'origine contenant la faute de frappe. Voici un exemple:

$ git log
commettre 0c28141c68adae276840f17ccd4766542c33cf1d
Auteur: Premier Dernier 
Date: mer 8 août 15:55:52 2018 -0600

    Errata commit:
    Ce commit n'a pas de changement de code de fond.
    Cette validation est fournie uniquement pour documenter une correction apportée à un message de validation précédent.
    Cela concerne la validation de l'objet e083a7abd8deb5776cb304fa13731a4182a24be1.
    Message de validation incorrect d'origine:
        Changement de couleur d'arrière-plan en rouge
    Correction (* changement mis en évidence *):
        Couleur d'arrière-plan modifiée en * bleu *

commettre 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Auteur: Premier Dernier 
Date: mer 8 août 15:43:16 2018 -0600

    Un message de validation provisoire

commettre e083a7abd8deb5776cb304fa13731a4182a24be1
Auteur: Premier Dernier 
Date: mer 8 août 13:31:32 2018 -0600

    Changement de couleur d'arrière-plan en rouge
rob_7cc
la source
C'est sûr, mais il y a beaucoup de texte à lire. Je préférerais réécrire l'histoire :)
pkalinow
0

La réponse de @Mureinik est bonne mais incompréhensible pour les débutants.

Première méthode:

  1. Si vous souhaitez uniquement modifier le dernier message de validation, vous devez uniquement git commit --amend:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Comme vous pouvez le constater, commettez un message en haut sans préfixe de commande tel que pick, ceci est déjà la page d'édition et vous pouvez directement éditer le message en haut et sauvegarder et quitter , par exemple:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Alors fais git push -u origin master --forceou <how you push normally> --force. La clé ici est --force.

Deuxième méthode:

  1. Vous pouvez voir le commit par git logextrait ou extraire de l'URL du référentiel, par exemple dans mon cas:881129d771219cfa29e6f6c2205851a2994a8835

  2. Ensuite, vous pouvez faire git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835ou git rebase -i HEAD^(si le dernier)

  3. Tu verrais:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. Mais si vous voyez noopalors vous tapez probablement mal, par exemple si vous faites git rebase -i 881129d771219cfa29e6f6c2205851a2994a88ce qui manque ^à la fin, vous feriez mieux de quitter l'éditeur sans sauvegarder et de trouver la raison:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. S'il n'y a pas de noopproblème, remplacez simplement le mot pickpar reword, il ne reste plus qu'un mot (vous ne modifiez pas le message de validation à ce stade), par exemple:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Sauvegarder et quitter verra la page d'édition similaire à la méthode n ° 1:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Editez le message en haut, de la même manière que la méthode n ° 1 et enregistrez et quittez, par exemple:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Encore une fois, comme pour la méthode n ° 1, faites git push -u origin master --forceou <how you push normally> --force. La clé ici est --force.

Pour plus d'informations, veuillez lire le doc .


la source