J'ai changé plusieurs choses au cours de la dernière heure et je les ai validées étape par étape, mais je viens de réaliser que j'ai oublié d'ajouter un fichier modifié il y a quelques validations.
Le journal ressemble à ceci:
GIT TidyUpRequests u:1 d:0> git log
commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce
Author: David Klein <>
Date: Tue Apr 27 09:43:55 2010 +0200
The Main program now tests both Webservices at once
commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463
Author: David Klein <>
Date: Tue Apr 27 09:43:27 2010 +0200
ISBNDBQueryHandler now uses the XPath functions from XPath.fs too
commit 06a504e277fd98d97eed4dad22dfa5933d81451f
Author: David Klein <>
Date: Tue Apr 27 09:30:34 2010 +0200
AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs
commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here
Author: David Klein <>
Date: Tue Apr 27 09:29:53 2010 +0200
Factored out some common XPath Operations
Des idées?
Réponses:
Utilisez
git rebase
. Plus précisément:git stash
pour stocker les modifications que vous souhaitez ajouter.git rebase -i HEAD~10
(ou le nombre de validations que vous souhaitez voir).a0865...
) pour l'éditer en changeant le motpick
au début de la ligne enedit
. Ne supprimez pas les autres lignes car cela supprimerait les validations. [^ Vimnote]git stash pop
git add <file>
.git commit --amend --no-edit
.git rebase --continue
qui réécrira le reste de vos commits contre le nouveau.[^ vimnote]: Si vous utilisez,
vim
vous devrez appuyer sur la Inserttouche pour modifier, puis Esctaper:wq
pour enregistrer le fichier, quitter l'éditeur et appliquer les modifications. Alternativement, vous pouvez configurer un éditeur de validation git convivial avecgit config --global core.editor "nano"
.la source
git add
.edit
, NE SUPPRIMEZ PAS les autres validations répertoriées dans le fichier. Si vous le faites, les validations seront supprimées et vous devrez suivre ces étapes pour les récupérer.git add .
Pour "corriger" un ancien commit avec une petite modification, sans changer le message de commit de l'ancien commit, où
OLDCOMMIT
est quelque chose comme091b73a
:Vous pouvez également utiliser
git commit --squash=OLDCOMMIT
pour modifier l'ancien message de validation lors du rebase.git rebase --interactive
affichera un éditeur de texte (qui peut être configuré ) pour confirmer (ou modifier) la séquence d'instructions de rebase . Le fichier contient des informations sur les modifications des instructions de rebase ; il suffit d' enregistrer et de quitter l'éditeur (:wq
invim
) pour continuer le rebase.--autosquash
mettra automatiquement tous les--fixup=OLDCOMMIT
commits dans l'ordre souhaité. Notez que cela--autosquash
n'est valide que lorsque l'--interactive
option est utilisée.^
entréeOLDCOMMIT^
signifie qu'il s'agit d'une référence au commit juste avantOLDCOMMIT
.Les étapes ci-dessus sont bonnes pour la vérification et / ou la modification de la séquence d'instructions de rebase , mais il est également possible d'ignorer / automatiser l'éditeur de texte de rebase interactif en:
GIT_SEQUENCE_EDITOR
d'un script .Voir git commit et git rebase . Comme toujours, lors de la réécriture de l'historique git , vous ne devez corriger ou écraser que les commits que vous n'avez pas encore publiés à quelqu'un d'autre (y compris les utilisateurs Internet aléatoires et les serveurs de build).
la source
--autosquash
n'est valide que lorsque l'--interactive
option est utilisée .git config --global core.editor "pico"
. Il existe plusieurs autres façons de configurer git et / ou de modifier l'éditeur par défaut de votre système, etc.avec git 1.7, il existe un moyen très simple d'utiliser
git rebase
:mettre en scène vos fichiers:
créer un nouveau commit et réutiliser le message de commit de votre commit "cassé"
ajouter
fixup!
au début de la ligne d'objet (ousquash!
si vous souhaitez modifier la validation (message)):utiliser
git rebase -i --autosquash
pour corriger votre commitla source
You asked me to rebase without telling me which branch you want to rebase against, and 'branch.master.merge'
et si j'utilise ensuitegit rebase -i --autosquash
j'obtiens simplement unenoop
ligne d'objet, rebasant le commit sur lui-même. Une idée de ce que je fais mal?git rebase -i --autosquash HEAD~10
Vous pouvez essayer une
rebase --interactive
session pour modifier votre ancien commit (à condition que vous n'ayez pas déjà poussé ces commits vers un autre repo).la source