Dans ma branche master, j'ai fait un git merge some-other-branch
localement, mais je n'ai jamais poussé les changements vers master d'origine. Je ne voulais pas fusionner, donc j'aimerais l'annuler. En faisant un git status
après ma fusion, je recevais ce message:
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
Sur la base de certaines instructions que j'ai trouvées , j'ai essayé de lancer
git revert HEAD -m 1
mais maintenant je reçois ce message avec git status
:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
Je ne veux pas que ma succursale soit en avance d'un certain nombre de commits. Comment revenir à ce point?
Réponses:
Avec
git reflog
check, quel commit est un avant la fusion (git reflog
sera une meilleure option quegit log
). Ensuite, vous pouvez le réinitialiser en utilisant:Il y a aussi une autre façon:
Il vous ramènera 1 commit.
N'oubliez pas que tous les fichiers modifiés et non validés / non stockés seront réinitialisés à leur état non modifié . Pour les conserver, cachez les modifications ou voyez l'
--merge
option ci-dessous.Comme @Velmont l'a suggéré ci-dessous dans sa réponse, en l'occurrence en utilisant:
pourrait donner de meilleurs résultats, car il devrait conserver vos modifications.
ORIG_HEAD
pointera vers un commit directement avant que la fusion ne se produise, vous n'avez donc pas à le rechercher vous-même.Une autre astuce consiste à utiliser le
--merge
commutateur au lieu de--hard
car il ne réinitialise pas les fichiers inutilement:la source
git log
choisit de s'afficher par défaut - peut-être qu'il existe une sortie différente degit log
ougit reflog
pourrait être utilisé pour cela)git log
sortie, vous souhaitez examiner les deux validations parentales. L'un est le dernier commit de votre branche, l'autre est le dernier commit de la branche dans laquelle vous avez fusionné. Vous voulez quegit reset --hard
le parent valide sur la branche dans laquelle vous avez fusionné.git reset --hard <commit_sha>
En supposant que votre maître local n'était pas en avance sur son origine / maître, vous devriez pouvoir
Ensuite, votre
master
succursale locale devrait ressembler àorigin/master
.la source
Voir le chapitre 4 du livre Git et le post original de Linus Torvalds .
Pour annuler une fusion déjà poussée :
Assurez-vous de rétablir le retour si vous recommencez la branche, comme l'a dit Linus.
la source
git revert -m 1 <commit>
. Le problème est que cela n'efface pas la fusion accidentelle qu'il a faite (et n'a pas encore poussé). Les autres réponses impliquant des réinitialisations dures sont meilleures pour le problème de l'affiche originale.Il est étrange que la commande la plus simple ait été manquante. La plupart des réponses fonctionnent, mais en annulant la fusion que vous venez de faire, voici le moyen simple et sûr :
La référence
ORIG_HEAD
pointera vers le commit d'origine d'avant la fusion.(L'
--merge
option n'a rien à voir avec la fusion. C'est juste commegit reset --hard ORIG_HEAD
, mais plus sûre car elle ne touche pas aux modifications non validées.)la source
git reset --merge ORIG_HEAD
conserve ces changements.git reset --hard HEAD~5
ne réinitialise que HEAD (peut supprimer les validations à la fois dans master et branch1). Seule l'--merge
option supprime lemerge
.--merge
option ne supprime pas réellement la fusion, vous pouvez également l'utiliser--hard
fonctionnera bien. C'est la référence ORIG_HEAD qui est l'indice ici, elle est définie avant de faire une fusion à l'endroit où vous en êtes à ce point. :)git reset --hard ORIG_HEAD
commande a parfaitement fonctionné pour moi - elle a peut-être été aidée par le fait que je n'ai apporté aucune autre modification au référentiel après le localgit merge
que j'essayais d'annuler. La commande réinitialise simplement l'état du référentiel à ce qu'il était avant la fusion. Merci pour le bon conseil!Avec les nouvelles versions de Git, si vous n'avez pas encore validé la fusion et que vous avez un conflit de fusion , vous pouvez simplement faire:
De
man git merge
:la source
Vous devez réinitialiser le commit précédent. Cela devrait fonctionner:
Ou même
HEAD^^
pour annuler ce retour en arrière. Vous pouvez toujours donner une référence SHA complète si vous n'êtes pas sûr du nombre de pas en arrière que vous devez prendre.Si vous rencontrez des problèmes et que votre branche principale n'a pas subi de modifications locales, vous pouvez réinitialiser
origin/master
.la source
ORIG_HEAD
pour vous, pourquoi ne pas l'utiliser?Dernièrement, j'ai utilisé
git reflog
pour aider à cela. Cela ne fonctionne généralement que si la fusion JUST s'est produite, et c'était sur votre machine.git reflog
pourrait renvoyer quelque chose comme:La première ligne indique qu'une fusion s'est produite. La 2ème ligne est le temps avant ma fusion. J'ai simplement
git reset --hard 43b6032
pour forcer cette branche à suivre avant la fusion et à continuer.la source
reflog
pour obtenir le SHA et le passer engit reset
fonction.Avec Git moderne, vous pouvez:
Syntaxe plus ancienne:
Vieille école:
Mais en réalité, il est en aperçoive une valeur qui
git merge --abort
est équivalente à seulementgit reset --merge
étant donné queMERGE_HEAD
est présente. Cela peut être lu dans l'aide de Git pour la commande de fusion.Après l'échec d'une fusion, lorsqu'il n'y a pas
MERGE_HEAD
, la fusion qui a échoué peut être annulée avecgit reset --merge
, mais pas nécessairement avecgit merge --abort
, donc ils ne sont pas seulement une ancienne et une nouvelle syntaxe pour la même chose .Personnellement je trouve
git reset --merge
beaucoup plus puissant et utile dans le travail quotidien, c'est donc celui que j'utilise toujours.la source
D'accord, les réponses que les autres personnes m'ont données étaient proches, mais cela n'a pas fonctionné. Voici ce que j'ai fait.
Ce faisant...
... m'a donné le statut suivant.
J'ai ensuite dû taper
git reset
plusieurs fois la même commande. Chaque fois que je l'ai fait, le message a changé d'un comme vous pouvez le voir ci-dessous.À ce stade, j'ai vu le message d'état modifié, j'ai donc essayé de faire un
git pull
, et cela semblait fonctionner:En résumé, mes commandes se résumaient à ceci:
la source
HEAD^^^^
origin/master
;)Vous pouvez utiliser
git reflog
pour trouver la caisse précédente. Parfois, c'est un bon état dans lequel vous souhaitez revenir.Concrètement,
la source
Si vous êtes en train de fusionner, vous pouvez toujours l'interrompre
git merge --abort
la source
J'ai pu résoudre ce problème avec une seule commande qui n'implique pas de rechercher un ID de validation.
La réponse acceptée n'a pas fonctionné pour moi, mais cette commande a atteint les résultats que je cherchais.
la source
Si vous ne l'avez pas encore validé, vous ne pouvez utiliser que
Cela annulera la fusion (et tout ce que vous avez fait).
la source
Je suis arrivé à cette question qui cherche également à revenir à la correspondance d'origine (c.-à-d., NO s'engage avant l'origine). En recherchant plus loin, nous avons découvert qu'il existe une
reset
commande pour cela:git reset --hard @{u}
Remarque:
@{u}
est un raccourci pourorigin/master
. (Et, bien sûr, vous avez besoin de ce référentiel distant pour que cela fonctionne.)la source
Vous devez changer votre HEAD, pas le vôtre bien sûr mais git HEAD ....
Donc, avant de répondre, ajoutons un peu de contexte, expliquant ce que c'est
HEAD
.First of all what is HEAD?
HEAD
est simplement une référence au commit actuel (le plus récent) sur la branche courante.Il ne peut y en avoir qu'un seul
HEAD
à un moment donné. (à l'exclusiongit worktree
)Le contenu de
HEAD
est stocké à l'intérieur.git/HEAD
et contient les 40 octets SHA-1 de la validation en cours.detached HEAD
Si vous n'êtes pas sur le dernier commit - ce qui signifie qu'il
HEAD
pointe vers un commit antérieur dans l'historique, c'est appelédetached HEAD
.Sur la ligne de commande, il ressemblera à ceci - SHA-1 au lieu du nom de la branche car le
HEAD
ne pointe pas vers la pointe de la branche actuelleQuelques options sur la façon de récupérer à partir d'une tête détachée:
git checkout
Cela va extraire une nouvelle branche pointant vers le commit souhaité.
Cette commande extrait un commit donné.
À ce stade, vous pouvez créer une branche et commencer à travailler à partir de ce point.
git reflog
Vous pouvez également toujours utiliser le
reflog
.git reflog
affichera tout changement qui a mis à jour leHEAD
et vérifier l'entrée de reflog souhaitée mettra leHEAD
dos à ce commit.Chaque fois que le HEAD est modifié, il y aura une nouvelle entrée dans le
reflog
Cela vous ramènera à votre engagement souhaité
git reset --hard <commit_id>
"Déplacer" votre HEAD vers le commit souhaité.
vous pouvez également utiliser le
git rebase --no-autostash
.git revert <sha-1>
"Annuler" la validation ou la plage de validation donnée.
La commande de réinitialisation "annulera" toutes les modifications apportées au commit donné.
Un nouveau commit avec le patch d'annulation sera validé tandis que le commit d'origine restera également dans l'historique.
Ce schéma illustre quelle commande fait quoi.
Comme vous pouvez le voir,
reset && checkout
modifiez leHEAD
.la source
La réponse la plus simple est celle donnée par odinho - Velmont
Tout d'abord
git reset --merge ORIG_HEAD
Pour ceux qui cherchent à réinitialiser après que les modifications ont été poussées, faites cela (car c'est le premier message vu pour toutes les questions de fusion git reset)
git push origin HEAD --force
Cela sera réinitialisé de manière à ce que vous n'obteniez pas à nouveau les modifications fusionnées après le tirage.
la source
Juste pour une option supplémentaire à regarder, j'ai principalement suivi le modèle de branchement décrit ici: http://nvie.com/posts/a-successful-git-branching-model/ et en tant que tel, j'ai fusionné avec
--no-ff
(non avance rapide) généralement.Je viens de lire cette page car j'avais accidentellement fusionné une branche de test au lieu de ma branche de publication avec master pour le déploiement (site web, master est ce qui est en direct). La branche testing a fusionné avec deux autres branches et totalise environ six commits.
Donc, pour annuler l'ensemble du commit, j'en avais juste besoin d'un
git reset --hard HEAD^
et il a annulé l'ensemble de la fusion. Étant donné que les fusions n'ont pas été transmises rapidement, la fusion était un bloc et un pas en arrière est "branche non fusionnée".la source
Vous ne pouvez utiliser que deux commandes pour annuler une fusion ou redémarrer par un commit spécifique:
git reset --hard commitHash
(vous devez utiliser la validation que vous souhaitez redémarrer, par exemple 44a587491e32eafa1638aca7738)git push origin HEAD --force
(Envoi de la nouvelle branche maître locale à origin / master)Bonne chance et allez-y!
la source
Cela peut se faire de plusieurs manières.
1) Annuler la fusion
Si vous êtes entre une mauvaise fusion (effectuée par erreur avec une mauvaise branche) et que vous souhaitez éviter la fusion pour revenir à la dernière branche comme ci-dessous:
2) Réinitialiser HEAD sur la branche distante
Si vous travaillez à partir de la branche de développement à distance, vous pouvez réinitialiser HEAD sur le dernier commit sur la branche à distance comme ci-dessous:
3) Supprimez la branche en cours et procédez à nouveau à la vérification du référentiel distant
Considérant que vous travaillez sur le développement d'une branche dans le référentiel local, qui se synchronise avec la branche distante / développement, vous pouvez faire comme ci-dessous:
la source
Si votre fusion et les validations correspondantes n'ont pas encore été poussées, vous pouvez toujours passer à une autre branche, supprimer la branche d'origine et la recréer.
Par exemple, j'ai accidentellement fusionné une branche de développement en master et j'ai voulu annuler cela. En utilisant les étapes suivantes:
Voila! Master est au même stade que l'origine et votre état de fusion erroné est effacé.
la source
Si vous voulez une solution en ligne de commande, je suggère de simplement aller avec la réponse de MBO.
Si vous êtes un débutant, vous aimerez peut-être l'approche graphique:
gitk
(à partir de la ligne de commande, ou clic droit dans le navigateur de fichiers si vous l'avez)la source
Stratégie: créer une nouvelle succursale d'où tout allait bien.
Raisonnement: annulation d'une fusion est difficile. Il existe trop de solutions, selon de nombreux facteurs, par exemple si vous avez validé ou poussé votre fusion ou s'il y a eu de nouveaux validations depuis votre fusion. Vous devez également avoir une compréhension relativement approfondie de git pour adapter ces solutions à votre cas. Si vous suivez aveuglément certaines instructions, vous pouvez vous retrouver avec une "fusion vide" où rien ne sera fusionné, et de nouvelles tentatives de fusion inciteront Git à vous dire "Déjà à jour".
Solution:
Disons que vous souhaitez fusionner
dev
dansfeature-1
.Recherchez la révision dont vous souhaitez recevoir la fusion:
Vérifiez-le (remontez dans le temps):
Créez une nouvelle branche à partir de là et vérifiez-la:
Vous pouvez maintenant redémarrer votre fusion:
Fusionner:
git merge dev
Corrigez vos conflits de fusion.
Commettre:
git commit
Lorsque vous êtes satisfait des résultats, supprimez l'ancienne branche:
git branch --delete feature-1
la source
Il vous suffit de créer une nouvelle branche, puis de sélectionner à votre guise les engagements souhaités.
Son économiseur et plus simple réinitialise ensuite décrit dans de nombreuses réponses ci-dessus
la source
Je pense que vous pouvez faire
git rebase -i [hash] [branch_name]
où se[hash]
trouve le hachage d'identification, quelle que soit la date à laquelle vous souhaitez rembobiner plus un (ou le nombre de validations que vous souhaitez revenir), puis supprimez les lignes des validations dans l'éditeur que vous ne voulez plus . Enregistrez le fichier. Sortie. Prier. Et il devrait être rembobiné. Vous devrez peut-être faire ungit reset --hard
, mais cela devrait être bon à ce stade. Vous pouvez également l'utiliser pour extraire des validations spécifiques d'une pile, si vous ne souhaitez pas les conserver dans votre historique, mais cela peut laisser votre référentiel dans un état que vous ne voulez probablement pas.la source
Si vous avez validé la fusion:
la source
Tout d'abord, assurez-vous que vous avez tout engagé.
Réinitialisez ensuite votre référentiel à l'état de travail précédent:
ou en utilisant
--hard
( cela supprimera toutes les modifications locales non validées! ):Utilisez le hachage qui était là avant votre commit mal fusionné.
Vérifiez les validations que vous souhaitez réengager en haut de la version correcte précédente en:
Appliquez vos bons commits en haut de la bonne version de votre référentiel en:
En utilisant cherry-pick (les changements introduits par certains commits existants)
Ou en sélectionnant la gamme de commits par:
Vérifiez d'abord les bons changements avant de les fusionner:
Vérifiez d'abord les bons changements avant de les fusionner:
où il s'agit de la plage des validations correctes que vous avez validées (à l'exclusion de la fusion incorrectement validée).
la source
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
Cela a fonctionné pour moi .. !!
la source
Si vous remarquez que vous devez revenir immédiatement après la fusion et que vous n'avez rien fait d'autre après la tentative de fusion, vous pouvez simplement émettre cette commande:
git reset --hard HEAD@{1}
.Essentiellement, votre fusion
sha
indiqueraHEAD@{0}
si rien d'autre n'a été validé après la fusion etHEAD@{1}
sera donc le point précédent avant la fusion.la source
La plus simple des chances les plus simples, beaucoup plus simple que tout ce qui est dit ici:
Supprimez votre branche locale (locale, pas distante) et tirez-la à nouveau. De cette façon, vous annulerez les modifications sur votre branche principale et tout le monde sera affecté par le changement que vous ne voulez pas pousser. Recommencez.
la source
Dans ce cas, vous voudrez réinitialiser votre branche avec
git reset --hard <branch_name>
. Si vous souhaitez enregistrer vos modifications avant de les réinitialiser, assurez-vous de créer une nouvelle branche etgit checkout <branch_name>
.Vous pouvez également réinitialiser l'état à un commit spécifique avec
git reset --hard <commit_id>
.Si les modifications ont été poussées, vous pouvez les utiliser à la
git revert <branch_name>
place. Assurez-vous de vérifier comment utiliser git revert et git checkout dans d'autres scénarios également.la source