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

36
demandé sur slm 2016-09-20 16:09:47

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 squash 56bcce7 en 684f917)
  • si vous voulez combiner 56bcce7e43ceba et e43ceba ne dépend pas de 56bcce7, 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 de 56bcce7 et e43ceba.

39
répondu Leon 2017-05-23 10:31:30

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.

21
répondu Gus 2017-03-14 21:35:34

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.

1
répondu DvixExtract 2018-07-25 10:14:09

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

0
répondu user8073722 2017-05-27 08:09:06