J'ai oublié «git rebase --continue» et j'ai fait «git commit». Comment réparer?

112

Je rebasais du code dans git, j'ai eu des conflits de fusion. J'ai résolu les conflits et j'ai fait:

git add

À ce stade, j'ai oublié de faire:

git rebase --continue

J'ai continué à coder et j'ai fait:

git commit

pour les changements. Maintenant je suis sur "no branch"et je ne peux pas faire:

git rebase --continue 

Comment puis-je réparer ça?

Abhilash
la source
# Pas actuellement sur aucune branche. rien à commettre (nettoyage du répertoire de travail)
Abhilash

Réponses:

4

EDIT : Regardez également la réponse ci-dessous pour voir si c'est une solution plus simple pour vous. https://stackoverflow.com/a/12163247/493106


Je devrais l'essayer, mais je pense que c'est ce que je ferais:

  1. Marquez votre dernier commit (ou écrivez simplement son SHA1 quelque part pour ne pas le perdre): git tag temp
  2. git rebase --abort
  3. Refaites le rebase. Vous devrez à nouveau résoudre la fusion. :(
  4. git rebase --continue
  5. git cherry-pick temp

Le problème avec ceci est que votre tempvalidation contient probablement à la fois la résolution de la fusion et le nouveau code. Cela pourrait donc être délicat, mais je l'essayerais et verrais si cela fonctionne.

MatrixFrog
la source
Soit vous pouvez marquer comme @MatrixFrog dit, soit vous pouvez également l'enregistrer sous forme de patch. Ensuite, annulez le rebase. Vérifiez l'état pour vous assurer que le dépôt est dans un état dont vous savez qu'il n'y a eu aucun problème, puis démarrez la récupération et le rebase.
yasouser
18
Ne fais pas ça. Voir la réponse de kirikaza ci-dessous pour une manière beaucoup plus simple / plus propre. Ne jouez pas avec la sélection et la résolution des conflits une deuxième fois.
tandrewnichols
4
@Abhilash Veuillez accepter la réponse de kirikaza. J'ai (comme tandrewnichols) fait cela et il y avait un moyen beaucoup plus simple (et Internet semble d'accord car cette réponse a 4x les votes positifs).
David Doria
C'est maintenant 10x les votes positifs ... aussi, utilisez git rerere pour vous souvenir de vos résolutions de conflit (utile, sauf si vous faites parfois de mauvaises résolutions dont vous ne voulez pas qu'il se souvienne).
Ajax
217

Fais juste git reset --soft HEAD^. Il déplace le pointeur HEAD vers son parent mais conserve l'arborescence de travail et ajoute la modification de fusion à l'index. Vous pouvez donc continuer à rebaser avec git rebase --continuecomme avant.

Kirikaza
la source
1
Cela a totalement fonctionné, et c'était aussi la première fois que je trouvais une utilisation pour --soft. Ravi de savoir comment cela fonctionne, merci!
mmocny
1
J'espère que les gens verront tous les votes sur cette réponse et suivront ce qui est suggéré ici!
Raghu
1
C'est exactement ce que je pensais (mais peut-être passé par accident). Je ne savais pas si HEAD était en cours de mise à jour lors d'un rebase. Merci pour votre confirmation! Tellement content d'avoir fait défiler un peu plus avant de jouer avec le mal de tête ci-dessus.
DeezCashews
J'ai modifié la réponse acceptée pour mettre un lien ici - Je n'ai vu cette réponse qu'après avoir suivi les instructions ci-dessus.
xaxxon
0

J'ai eu le même problème, et pour aggraver les choses, je rebasais trois commits, et après avoir résolu des conflits sur le deuxième commit, j'ai "commis" au lieu de "rebase --continue".

En conséquence, j'ai eu ce git reflog

Quand j'ai appliqué la solution de kirikaza, je viens de revenir sur le troisième commit, et non sur le deuxième, ce qui était problématique.

Comme vous pouvez le voir, le rebase commence par une vérification de la branche télécommandes / origine / maître, puis applique mes trois commits qui apparaissent comme les trois opérations précédentes (avant la vérification) dans le reflog.

Ensuite, si vous souhaitez redémarrer à partir d'une base propre, avant le rebase, vous pouvez simplement réinitialiser en dur le hachage juste avant l'extraction de l'opération de rebase. Dans mon cas (voir la photo):

git reset --hard 859ed3c

Ensuite, vous pouvez commencer un nouveau git rebase.

Louis Durand
la source
0

J'avais rebasé git, corrigé des conflits, git ajouté un fichier avec des conflits et (par erreur) commis.

J'ai essayé les solutions git reset --soft HEAD^et les git reset --hardsolutions proposées, mais aucune n'a fonctionné pour moi.

Cependant, juste git rebase --aborttravaillé: cela m'a ramené avant le début du rebase avec un arbre de travail propre.

reste
la source