J'ai 2 commits, A puis B, prêt à être poussé. Je réalise que j'ai oublié d'ajouter quelque chose en A.
Comment puis-je ajouter ce changement à A en utilisant Magit? Je ne sais même pas quelle partie de la documentation Git je devrais regarder.
Supposons un instant que vous souhaitiez ajouter quelque chose au HEAD
commit, c'est-à-dire "le second commit B" dans votre exemple.
Le popup de commit sur ccomporte un lien " aAmend". Appuyez sur cette touche pour "modifier" les modifications apportées au HEAD
commit. Comme les commits ne sont pas modifiables dans Git, cela remplacera l'ancien commit par un nouveau commit. Un tampon avec l'ancien message de validation apparaîtra afin que vous puissiez le modifier si le changement ajouté nécessite également que vous ajustiez le message. Comme toujours, appuyez sur C-c C-clorsque vous avez terminé de modifier le message. Cela équivaut à une exécution git commit --amend
sur la ligne de commande.
HEAD
son message de validationComme il arrive souvent que vous ne deviez ajuster que la modification ou le message, Magit propose deux variantes supplémentaires:
HEAD
sans modifier le message de validationHEAD
sans lui ajouter les modifications programméesLorsque vous voulez éditer un commit qui ne l’est pas HEAD
, cela ne fonctionne pas. Ces commandes toujours "modifier" (c'est-à-dire remplacer) le HEAD
commit. Git ne fournit pas une seule commande pour modifier un commit HEAD
, c'est donc un peu plus compliqué.
Magit ne fournissent une telle commande, mais parce qu'il ya des situations où il est préférable de le faire en plusieurs étapes, nous allons discuter de cette première.
Modifier un commit autre que HEAD
peut être divisé en trois étapes:
A
) le HEAD
.HEAD
(comme décrit ci-dessus), entraînant une validation A'
.A
, mais en plus de A'
.Cela peut être fait en utilisant une base interactive. Tapez rpour afficher la popup de rebase. Tapez ensuite mpour appeler la variante de base "edit a commit". Un tampon avec les commits récents apparaît. Déplacez-vous sur le commit que vous souhaitez modifier et tapez C-c C-cpour le sélectionner. Git rembobine ensuite l'historique dans cette validation et affiche des informations sur la base en cours dans le tampon d'état.
Modifier HEAD
comme décrit ci-dessus. Puis dites à Git que vous avez terminé en tapant r r. Si A'
et B
conflit alors rebase s'arrête à B
et vous devez résoudre le conflit. Une fois que vous avez terminé, appuyez sur r rpour continuer.
Si vous savez que vos modifications A
entraîneront des conflits B
, procédez comme indiqué ci-dessus, sinon utilisez l’approche suivante.
Git permet de créer des "correctifs" avec git commit --fixup A
. Cela crée un nouveau commit, qui enregistre les modifications qui "auraient dû être effectuées dans un autre commit". Ce commit devient le nouveau HEAD
. Il existe aussi une --squash
variante. Pour plus d'informations sur les différences, voir la git-commit
page de manuel.
Pour combiner réellement le A
commit et le nouveau commit A'
, puis réappliquer B
par dessus, vous devez utiliser rebase. Magit fournit une commande pratique pour le faire r f.
La principale différence par rapport à l'approche ci-dessus est qu'ici, nous créons d'abord un nouveau commit, puis nous rebasonnons pour combiner cela avec la "cible" et refaire une nouvelle demande B
. Ci-dessus, nous avons commencé par rebasonner au lieu de commettre.
Dans Magit --fixup
, les --squash
variantes et sont disponibles dans la fenêtre de validation, sur fet s. Mais Magit fournit également des variantes "instantanées" des commandes fixup et squash sur Fet S. Ces variantes créent un nouveau commit, comme les variantes "non instantanées", mais elles combinent ensuite instantanément le commit de correction avec le commit cible en utilisant rebase, sans que vous ayez à appeler une autre commande.
"Instant fixup" ( c F) est essentiellement la même chose que "extend HEAD
" ( c e), sauf que cela fonctionne pour n'importe quel commit, pas seulement HEAD
.
Lectures complémentaires:
git-commit(1)
git-rebase(1)
git-commit
La page de manuel redirige versgit-rebase(1)
les lignes suivantes: Le message de validation suggéré pour la validation pliée est la concaténation des messages de validation de la première validation et de ceux avec la commande "squash", mais en omettant les messages de validation des validations avec la "correction". commander. IOW, utilisez fixup si vous souhaitez simplement corriger le code de la précédente validation, utilisez squash si vous souhaitez également corriger le message de validation.git commit --amend –C HEAD
est la commande Git que vous souhaitez rechercher et avec laquelle vous pouvez faire des corrections dans MagitC-c C-a
.la source
C-c C-a
provient d'une version plus ancienne (je pense). De plus, je ne vois aucune trace de "modifier" dans le tampon d’aide (?
).Donc, un flux de travail est:
ensuite
L’autosquash déplacera automatiquement tous les comm! Fixup au bon endroit et les configurera pour être écrasés sur la base.
la source
i
me rapporteCannot rebase: Your index contains uncommitted changes. Please commit or stash them.
. Sauf que je n'ai pas de modifications non validées. : /Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort
. Est-ce qu'il essaie de me dire que ma réparation pourrait faire caca lors de la prochaine fusion?merge in rebase
:, voir BOGUES sousgit help rebase
. Je suggère de faire la réparation avant de tirer en amont.Pour amender le dernier commit, c'est "c a". La correction sert à amender certains anciens commit.
la source