Annuler une fusion qui n'a pas encore été poussée
dans ma branche principale, j'ai fait un git merge some-other-branch
localement, mais je n'ai jamais poussé les changements au maître d'origine. Je ne voulais pas fusionner, alors j'aimerais le défaire. En faisant un git status
après ma Fusion, j'ai eu ce message:
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
basé sur quelques instructions j'ai trouvé , j'ai essayé de courir
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.
I Je ne veux pas que ma branche soit en avance sur un nombre quelconque de commits. Comment puis-je revenir à ce point?
26 réponses
avec git reflog
vérifiez qui commit est un avant la fusion(git reflog sera meilleure option que git log ). Ensuite, vous pouvez le réinitialiser en utilisant:
git reset --hard commit_sha
il y a aussi une autre façon
git reset --hard HEAD~1
vous ramènera 1 commit.
soyez conscient que tous les fichiers modifiés et non engagés/non effacés seront réinitialisés dans leur état non modifié . Pour les garder, soit les changements de cachette loin, soit voir --merge
option ci-dessous.
comme @Velmont l'a suggéré ci-dessous dans sa réponse, dans ce cas direct en utilisant:
git reset --hard ORIG_HEAD
pourrait donner de meilleurs résultats, car il devrait préserver vos changements. ORIG_HEAD
pointera vers un commit directement avant la fusion, donc vous n'avez pas à le chercher vous-même.
une autre astuce consiste à utiliser le commutateur --merge
au lieu de --hard
puisqu'il ne réinitialise pas les fichiers inutilement:
--merge
réinitialise l'index et met à jour les fichiers de l'arbre de travail qui sont différents entre
et HEAD, mais conserve ceux qui sont différents entre l'index et l'arbre de travail (c'est-à-dire qui ont des modifications qui n'ont pas été ajoutées).
en supposant que votre capitaine local n'était pas en avance sur l'origine / le capitaine, vous devriez être en mesure de faire
git reset --hard origin/master
alors votre succursale locale master
devrait ressembler à origin/master
.
Voir chapitre 4 dans le Git livre et le message original par Linus Torvalds .
pour annuler une fusion qui avait déjà été poussée :
git revert -m 1 commit_hash
assurez-vous de revenir en arrière si vous commettez à nouveau la branche, comme Linus l'a dit.
il est étrange que la commande la plus simple ait été manquante. La plupart des réponses fonctionnent, mais annuler la fusion que vous venez de faire, c'est la manière facile et sûre :
git reset --merge ORIG_HEAD
ref ORIG_HEAD
sera point à l'original commettre d'avant la fusion.
(l'option --merge
n'a rien à voir avec la fusion. C'est comme git reset --hard ORIG_HEAD
, mais plus sûr car il ne touche pas les changements non engagés.)
avec les nouvelles versions de Git, si vous n'avez pas encore commis la fusion et que vous avez un conflit de fusion , vous pouvez simplement faire:
git merge --abort
de man git merge
:
[Ce] ne peuvent être exécutés qu'après la fusion a entraîné dans des conflits.
git merge --abort
va annuler le processus de fusion et essayer de reconstruire l'état de pré-fusion.
Vous devez réinitialiser la précédente livraison. Cela devrait fonctionner:
git reset --hard HEAD^
Ou même HEAD^^
pour revenir que de revenir commettre. Vous pouvez toujours donner une référence SHA complète si vous n'êtes pas sûr de combien de pas en arrière vous devriez prendre.
dans le cas où vous avez des problèmes et votre branche principale n'a pas eu de changements locaux, vous pouvez réinitialiser à origin/master
.
dernièrement, j'ai utilisé git reflog
pour aider avec ça. Ça ne marche que si la fusion a eu lieu, et que c'était sur votre machine.
git reflog
pourrait retourner quelque chose comme:
fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting
La première ligne indique qu'une fusion s'est produite. La deuxiè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.
avec Git moderne, vous pouvez:
git merge --abort
ancienne syntaxe:
git reset --merge
de la Vieille école:
git reset --hard
mais en fait, il est intéressant de noter que git merge --abort
est seulement équivalent à git reset --merge
étant donné que MERGE_HEAD
est présent. Cela peut être lu dans l'aide Git pour la commande merge.
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
après une fusion ratée, quand il n'y a pas de MERGE_HEAD
, la fusion ratée peut être annulée avec git reset --merge
, mais pas nécessairement avec git merge --abort
, de sorte qu'ils ne sont pas seulement ancienne et nouvelle syntaxe pour la même chose .
personnellement, je trouve git reset --merge
beaucoup plus puissant et utile dans le travail quotidien, donc c'est celui que j'utilise toujours.
D'accord, les réponses que les autres m'ont données étaient proches, mais ça n'a pas marché. Voici ce que j'ai fait.
cela...
git reset --hard HEAD^
git status
...m'a donné le statut suivant.
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
j'ai ensuite dû taper plusieurs fois la même commande git reset
. Chaque fois que j'ai fait cela, le message a changé par un comme vous pouvez voir ci-dessous.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
à ce point, j'ai vu le message d'état changé, donc j'ai essayé de faire un git pull
, et cela a semblé fonctionner:
> git pull
Updating 2df6af4..12bbd2f
Fast forward
app/views/truncated | 9 ++++++---
app/views/truncated | 13 +++++++++++++
app/views/truncated | 2 +-
3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master
pour faire court, mes ordres se résument à ceci:
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
vous pouvez utiliser git reflog
pour trouver la caisse précédente. Parfois, c'est un bon état que vous souhaitez retourner.
concrètement,
$ git reflog
$ git reset --hard HEAD@{0}
si vous ne l'avez pas encore engagé, vous ne pouvez utiliser que
$ git checkout -f
il défera la fusion (et tout ce que vous avez fait).
juste pour une option supplémentaire à regarder, j'ai été la plupart du temps en suivant le modèle de branchement décrit ici: http://nvie.com/posts/a-successful-git-branching-model / et comme tels ont fusionné avec --no-ff
(pas de fast forward) habituellement.
je viens de lire cette page car j'avais accidentellement fusionné une branche testing au lieu de ma branche release avec master for deploying (site web, master is what is live). La direction des essais a deux autres les branches ont fusionné avec elle et totalisent environ six commits.
donc pour revenir à la version complète j'ai juste eu besoin d'un git reset --hard HEAD^
et cela a inversé toute la fusion. Comme les fusions n'ont pas été transmises rapidement, la fusion était un bloc et un pas en arrière est "branche non fusionnée".
vous ne pouvez utiliser que deux commandes pour revenir à une fusion ou redémarrer par une propagation spécifique:
-
git reset --hard commitHash
(vous devez utiliser le commit que vous voulez redémarrer, par exemple. 44a587491e32eafa1638aca7738) -
git push origin HEAD --force
(envoi de la nouvelle branche maître locale à origin/master)
Bonne chance et allez de l'avant!
est arrivé à cette question également en cherchant à revenir à l'origine de match (c'est-à-dire, pas de commits avant l'origine). En cherchant plus loin, j'ai trouvé qu'il y a une commande reset
pour exactement cela:
git reset --hard @{u}
Note: @{u}
est une abréviation de origin/master
. (Et, bien sûr, vous avez besoin de dépôt distant pour que cela fonctionne.)
la réponse la plus simple est celle donnée par odinho-Velmont
d'Abord faire git reset --merge ORIG_HEAD
pour ceux qui cherchent à réinitialiser après avoir poussé les changements, faites ceci (Parce que c'est le premier message vu pour toutes les questions git reset merge)
git push origin HEAD --force
cela va se réinitialiser de telle sorte que vous n'obtiendrez pas les modifications fusionnées à nouveau après pull.
si votre Fusion et les propagations correspondantes n'ont pas encore été poussées, vous pouvez toujours passer à une autre branche, supprimer la première et la recréer.
par exemple, j'ai accidentellement fusionné une branche en développement en master et j'ai voulu annuler cela. En utilisant les étapes suivantes:
git checkout develop
git branch -D master
git branch -t master origin/master
voilà! Le maître est au même stade que l'origine, et votre état mal fusionné est effacé.
si vous voulez une solution en ligne de commande, je vous suggère de suivre la réponse de MBO.
si vous êtes un débutant, vous pourriez aimer l'approche graphique:
- coup D'envoi
gitk
(à partir de la ligne de commande, ou clic droit dans le navigateur de fichier si vous avez cela) - vous pouvez facilement repérer le commit de fusion - le premier noeud à partir du haut avec deux parents
- suivre le lien vers le parent premier/gauche (celui sur votre branche actuelle avant la fusion, habituellement rouge pour moi)
- sur la propagation sélectionnée, droit-cliquez sur "Réinitialiser la branche ici", choisissez la réinitialisation dure là
stratégie: créer une nouvelle branche d'où tout était bon.
Rationale: revenir sur une fusion est difficile. Il y a trop de solutions, en fonction de nombreux facteurs tels que si vous avez engagé ou poussé votre fusion ou s'il y a eu de nouvelles propagations depuis votre Fusion. Vous devez également avoir une compréhension relativement profonde de git pour adapter ces solutions à votre cas. Si vous suivez aveuglément certains instructions, vous pouvez vous retrouver avec une" fusion vide "où rien ne sera fusionné, et d'autres tentatives de fusion feront Git vous dire"déjà à jour".
Solution:
disons que vous voulez fusionner dev
en feature-1
.
-
trouvez la révision que vous souhaitez recevoir la fusion:
git log --oneline feature-1 a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
-
Check it (revenir en arrière dans le temps):
git checkout e5f6g7h8
-
créer une nouvelle branche à partir de là et vérifier:
git checkout -b feature-1
Maintenant vous pouvez redémarrer votre Fusion:
-
Fusionner:
git merge dev
-
réparez vos conflits de fusion.
-
s'Engager:
git commit
-
lorsque vous êtes satisfait des résultats, supprimez l'ancienne branche:
git branch --delete feature-1
j'ai pu résoudre ce problème avec une seule commande qui n'implique pas la recherche d'un identifiant de propagation.
git reset --hard remotes/origin/HEAD
la réponse acceptée n'a pas fonctionné pour moi mais cette commande a atteint les résultats que je cherchais.
je pense que vous pouvez faire git rebase -i [hash] [branch_name]
où [hash]
est l'identifiant de hachage, cependant, beaucoup de retour que vous souhaitez pour un retour de plus d'un (ou cependant beaucoup s'engage en arrière, vous voulez aller), puis de supprimer les lignes pour les commits dans l'éditeur que vous ne voulez pas de plus. Enregistrez le fichier. Sortie. Prier. Et il devrait être rembobiné. Vous pourriez avoir à faire un git reset --hard
, mais il devrait être bon à ce point. Vous pouvez également l'utiliser pour tirer spécifiques s'engage d'une pile, si vous ne voulez pas les garder dans votre histoire, mais qui ne peut laisser votre dépôt dans un état que vous ne voulez probablement pas.
-
D'abord, assurez-vous que vous avez tout commis.
-
puis réinitialisez votre dépôt à l'état de fonctionnement précédent:
$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
ou en utilisant
--hard
( ) ceci supprimera tous les changements locaux, non engagés! ):$ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
utilisez le hachage qui était là avant que votre commit fusionné à tort.
-
contrôle qui engage vous souhaitez re-commettre sur le haut de la version précédente correcte par:
$ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f ... commit 16b373a96b0a353f7454b141f7aa6f548c979d0a ...
-
Appliquer votre droit s'engage sur le haut de la bonne version de votre référentiel par:
-
à l'aide de cherry-pick (les changements introduits par certains commits)
git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
-
:
-
première vérification des changements à droite avant leur fusion:
git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
-
première vérification des changements de droite avant leur fusion:
git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
où c'est la plage des propagations correctes que vous avez commises (à l'exclusion de la fusion faussement engagée).
-
-
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 lancer cette commande:
git reset --hard HEAD@{1}
.
Essentiellement, votre fusion sha
pointe HEAD@{0}
si rien d'autre n'a été commis après la fusion et donc HEAD@{1}
sera le point précédent avant la fusion.
le plus simple des hasards, bien plus simple que tout ce qui est dit ici:
retirez votre branche locale (locale, pas distante) et tirez-la à nouveau. De cette façon, vous annulerez les changements sur votre branche principale et n'importe qui sera affecté par le changement que vous ne voulez pas pousser. Commencer plus de.
si vous avez commis la fusion:
git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
Dans ce cas, vous pouvez réinitialiser votre branche avec git reset --hard <branch_name>
. Si vous voulez enregistrer vos modifications avant de les mettre à zéro eux assurez-vous de créer une nouvelle branche et git checkout <branch_name>
.
vous pouvez réinitialiser l'État à un commit spécifique avec git reset --hard <commit_id>
aussi.
si les changements ont été poussés, vous pouvez utiliser git revert <branch_name>
à la place. Assurez-vous de vérifier comment l'utiliser git revert et git checkout dans d'autres scénarios.