J'ai ce qui suit dans le texte de la tâche 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, lorsque j'essaie d'écraser le premier ( 56bcce7
) et de choisir le second en ajoutant "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 le faire?
Je veux écraser le premier commit ( 56bcce7
) et "sélectionner et reformuler" le deuxième e43ceba
commit ( )
Réponses:
Le rebase interactif présente les commits dans l'ordre inverse de celui auquel vous êtes habitué lors de l'utilisation
git log
.git rebase -i
relit les commits sélectionnés dans l'ordre exact (de haut en bas) dans lequel ils sont répertoriés dans le fichier d'instructions de rebase enregistré. Lors de l'écrasement, le commit sélectionné pour l'écrasement est combiné avec le commit qui le précède dans la liste (éditée), c'est-à-dire le commit de la ligne précédente. Dans votre cas - il n'y a pas de commit précédent pour56bcce7
. Vous devez effectuer l'une des opérations suivantesgit rebase -i HEAD~3
(si vous voulez le squash56bcce7
dans684f917
)Si vous avez l'intention de les combiner
56bcce7
avece43ceba
ete43ceba
que vous n'en dépendez pas56bcce7
, réorganisez-les simplement:MISE À JOUR : La réponse de Gus ci-dessous suggère une meilleure façon de faire de même, sans réorganiser les deux commits:
Cela écrasera / fusionnera les deux commits en un seul. Lorsque le rebase interactif demande un message de validation reformulé pour
56bcce7
, fournissez le message de validation qui décrit l'union de56bcce7
ete43ceba
.la source
56bcce7
danse43ceba
. Alors, comment faire l'étape 1 ici?J'ai eu un problème similaire que j'ai résolu comme suit:
C'est le groupe de commit que je voulais écraser:
Comme vous pouvez le voir, je ne voulais pas. 4, mais 1, 2 et 3 n'avaient pas de commit préalable à écraser . D'où le Cannot «squash» sans une erreur de validation précédente .
Ma solution était d'utiliser l'
r
option pour# r, reword = use commit, but edit the commit message
Donc ma liste de commits ressemblait à ceci:
Après l'enregistrement, le shell interactif m'a demandé de reformuler le commit choisi.
Après cela, mon journal de commit a abouti à un seul commit qui a abouti à un historique de commit plus propre.
la source
git rebase --edit-todo
et corriger en référant cette réponse, puis fairegit rebase --continue
J'ai eu ce problème et la raison pour laquelle cela s'est produit dans mon cas était que vous ne pouvez pas écraser des commits plus anciens sur un nouveau commit. Voici un exemple disant que vous avez 3 commits:
Maintenant si tu dis
git rebase -i HEAD~3
et tu fais quelque chose commeCela entraînera l'erreur:
Solution :
Lorsque vous écrasez les commits, vous devez écraser les commits récents par les anciens et non l'inverse, donc dans l'exemple, ce sera quelque chose comme ceci:
Cela fonctionnera bien, au cas où vous voudriez tous vos messages de validation, je suggérerais une correction au lieu de squash .
la source
Squash avec la logique inverse . Vous pourrez sélectionner le message de validation souhaité à l'étape ultérieure.
pick
le premier commit pour lequel vous ne voulez pas le message de commit.squash
oufixup
le (s) commit (s) que vous souhaitez fusionner, jusqu'à celui qui contient le message de validation que vous vouliez réellement.:x
)Lint.py: Replace deprecated link
.:x
)J'espère que c'est plus clair pour quelqu'un ✌🏽
la source
Il sera préférable de simplement dire dans l'éditeur interactif contenant les commits, git écrase toujours de bas en haut et il faut laisser une entrée "pick" en haut pour recevoir les squashes d'en bas.
la source
J'ai juste essayé cette approche.
Cela afficherait les 3 derniers commits, ce qui me donnerait une idée de ce qu'est le dernier commit et de celui qui a été effectué précédemment. Maintenant déclaré rebasage,
Choisissez le dernier commit en plus duquel nous devons écraser les deux autres. L'ID de commit qui est choisi comme commit de base serait comme,
Pour les deux autres ID de validation, changez-les en,
ou simplement,
la source
J'ai aussi déjà rencontré ce problème tout à l'heure, c'est juste insouciant.vous pouvez résoudre le problème comme suit: lorsque vous essayez d'écraser le premier (56bcce7) et de choisir le second, vous devez ajouter "s" avant la deuxième ligne mais pas le premier. vous pouvez également consulter le site Web suivant: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html
la source