Git: "ne peut pas 'écraser' sans une erreur de commit précédente " pendant le rebase
j'ai ce qui suit dans le texte à faire de git rebase -i HEAD~2
:
pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link
# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...
Maintenant, quand j'essaie de supprimer le premier(56bcce7
) et de choisir le second par l'ajout d'un "s" avant le premier, j'obtiens l'erreur suivante:
Cannot 'squash' without a previous commit
quelqu'un Peut-il m'expliquer ce que cela signifie, et comment dois-je faire?
je veux squash le premier commit(56bcce7
) et "sélectionner et de modifier le libellé de la" la deuxième(e43ceba
) commit
4 réponses
rebase Interactif présente s'engage dans l'ordre inverse de ce que vous utilisez lors de l'utilisation de git log
. git rebase -i
replace les propagations sélectionnées dans l'ordre exact (top-down) elles sont listées dans le fichier d'instructions de rebase sauvegardé. En écrasant, la propagation sélectionnée pour écraser est combinée avec la propagation qui la précède dans la liste (éditée), c'est-à-dire la propagation de la ligne précédente. Dans votre cas - il n'y a pas de commit précédent pour 56bcce7
. Vous devez effectuer l'une de l' suivant
git rebase -i HEAD~3
(si vous voulez squash56bcce7
en684f917
)si vous voulez combiner
56bcce7
e43ceba
ete43ceba
ne dépend pas de56bcce7
, puis il suffit de changer l'ordre:r e43ceba Lint.py: Replace deprecated link s 56bcce7 Closes #2774
UPDATE: réponse de Gus ci-dessous suggère une meilleure façon de faire la même chose, sans réordonner les deux commits:
r 56bcce7 Closes #2774 s e43ceba Lint.py: Replace deprecated link
ceci va écraser / fusionner les deux propagations en une seule. Lorsque l' rebase interactif demande un message de commit reformulé pour
56bcce7
, fournir le message de commit qui décrit l'union de56bcce7
ete43ceba
.
j'ai eu un problème similaire que j'ai résolu comme suit:
C'est le groupe de commit que je voulais écraser:
1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users
comme vous pouvez le voir, Je ne voulais pas. 4, mais 1, 2 et 3 n'avaient aucun engagement préalable à squash dans. D'où le Ne peut pas 'squash' sans précédent commit erreur.
ma solution était d'utiliser le r
option pour # r, reword = use commit, but edit the commit message
alors ma liste de commit ressemble à ceci:
1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users
Après l'enregistrement, le shell interactif m'a demandé de reformuler le commit choisi.
après cela, mon log de propagation a abouti à une propagation unique qui a donné un historique de propagation plus propre.
j'ai eu ce problème et la raison pour laquelle c'est arrivé dans mon cas était que, vous ne pouvez pas écraser les anciennes commits sur une nouvelle commit. Voici un exemple pour dire que vous avez 3 commits:
1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back
Maintenant, si vous dites git rebase -i HEAD~3
et vous faites quelque chose comme
1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back
Cela va entraîner dans l'erreur :
erreur: ne peut pas 'écraser' sans une propagation précédente Vous pouvez corriger cela avec 'git rebase --edit-todo' et ensuite lancer 'git rebase --continue'. Ou vous pouvez abandonner le rebase avec git rebase --abort'.
Solution:
lors de l'écrasement des commits, vous devez écraser les commits récents vers les vieux pas vice versa donc dans l'exemple ce sera quelque chose comme ceci :
1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back
cela marchera très bien, incase vous voulez tous vos messages de propagation, je suggérerais correction au lieu de squash.
j'ai aussi déjà rencontrer ce problème tout à l'heure,c'est juste négligent.vous pouvez résoudre le problème suivant:lorsque vous essayez de supprimer le premier(56bcce7) et de choisir le second, vous devez ajouter "s" avant la deuxième ligne, mais pas la première. vous pouvez aussi faire référence au site web suivant:http://backlogtool.com/git-guide/en/stepup/stepup7_5.html