Je voudrais annuler mon pull git en raison de commits indésirables sur l'origine distante, mais je ne sais pas à quelle révision je dois réinitialiser.
Comment puis-je simplement revenir à l'état avant de faire le git tirer sur l'origine distante?
Note de côté: vous pouvez trouver utile de git fetch upstreamcommencer, puis jetez un coup d'œil git diff upstream/branchpour voir dans quoi vous allez fusionner. Si tout va bien, alors continuezgit merge upstream/branch
Shahbaz
1
Vous perdrez tout votre crédit de rue et serez ancré dans le salaire d'une semaine si un brogrammeur hipster vous voit exécuter des commandes git à partir d'une interface graphique, mais GitHub Desktop et Atom ont des boutons sûrs et simples pour les undovalidations et des cases à cocher pour facilement et clairement mettre en scène et supprimer les fichiers. Les GUI sont aussi des gens!
Dem Pilafian
Réponses:
391
Ou pour le rendre plus explicite que l'autre réponse:
git pull
whoops?
git reset --keep HEAD@{1}
Les versions de git antérieures à 1.7.1 n'en ont pas --keep. Si vous utilisez une telle version, vous pouvez l'utiliser --hard- mais c'est une opération dangereuse car elle perd toute modification locale.
ORIG_HEAD est un état antérieur de HEAD, défini par des commandes qui ont un comportement éventuellement dangereux, pour être facile à les rétablir. Il est moins utile maintenant que Git a reflog: HEAD @ {1} est à peu près équivalent à ORIG_HEAD (HEAD @ {1} est toujours la dernière valeur de HEAD, ORIG_HEAD est la dernière valeur de HEAD avant une opération dangereuse)
quelle est la différence entre HEAD @ {1} et HEAD ^?
hugemeow
7
@hugemeow Ce serait une belle question SO. Pendant man git-rev-parsece temps, décrit cela. HEAD@{1}est la valeur précédente de symbolique HEADdans le reflogalors que HEAD^est la (première) révision parent du courant HEAD. Ces deux éléments doivent être équivalents (par exemple, après un rebase, une réinitialisation matérielle, un commutateur de branche, etc.). Lisez l'article lié pour reflog. Vive
sehe
10
Utilisateurs de PowerShell, échappez aux crochets avec un backtick:git reset HEAD@`{1`}
Robert Claypool
3
ss64.com/ps/syntax-esc.html~~V~~singular~~1st Je pense que vous avez voulu taper HEAD@`{1`}, ou pour qui comptent vraiment ce qui fonctionne sur des coquilles trop POSIX:'HEAD@{1}'
sehe
2
Je pense que cela réinitialise non seulement la traction, mais aussi mes commits = (
falsarella
67
git reflog showdevrait vous montrer l'histoire de HEAD. Vous pouvez l'utiliser pour déterminer où vous vous trouviez avant le pull. Ensuite, vous pouvez resetvous HEADy engager.
git reflog show a donné cette sortie: c9e5e4d HEAD @ {0}: pull: avance rapide 1c86a22 HEAD @ {1}: pull origine master: avance rapide 05c141a HEAD @ {2}: pull: avance rapide Puis-je réinitialiser le HEAD to HEAD en toute sécurité @ {1}
Kartins
L'autre réponse de sehe contient des détails sur la façon d'y arriver.
Noufal Ibrahim
Cela a été super utile après un commit désastreux d'une manière ou d'une autre entrecoupée de fusions dans mon histoire. Sortez-les en cherchant un dernier bien connu dans le reflog puis forcez de pousser.
Domenic
Et si pullc'est la première action? Si pullest à HEAD@{1}, et rien d'autre avant cela, comment revenez-vous à un état avant cela?
Hendra Uzia
Recréer le référentiel?
Noufal Ibrahim
29
Cela a fonctionné pour moi.
git reset --hard ORIG_HEAD
Annuler une fusion ou une extraction:
$ git pull (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard (2)
$ git pull . topic/branch (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD (4)
Trouvez le <SHA#>pour le commit que vous voulez faire. Vous pouvez le trouver dans github ou en tapant git logou git reflog showsur la ligne de commande, puis faites
git reset --hard <SHA#>
Même si vous pouvez avoir des modifications locales dans votre arborescence de travail, vous pouvez dire en toute sécurité git pulllorsque vous savez que le changement dans l'autre branche ne les chevauche pas.
Après avoir inspecté le résultat de la fusion, vous pouvez constater que le changement dans l'autre branche n'est pas satisfaisant. L'exécution git reset --hard ORIG_HEAD
vous permettra de revenir là où vous étiez, mais elle rejettera vos modifications locales, dont vous ne voulez pas. git reset --mergeconserve vos modifications locales.
git fetch upstream
commencer, puis jetez un coup d'œilgit diff upstream/branch
pour voir dans quoi vous allez fusionner. Si tout va bien, alors continuezgit merge upstream/branch
undo
validations et des cases à cocher pour facilement et clairement mettre en scène et supprimer les fichiers. Les GUI sont aussi des gens!Réponses:
Ou pour le rendre plus explicite que l'autre réponse:
whoops?
Les versions de git antérieures à 1.7.1 n'en ont pas
--keep
. Si vous utilisez une telle version, vous pouvez l'utiliser--hard
- mais c'est une opération dangereuse car elle perd toute modification locale.Au commentateur
la source
man git-rev-parse
ce temps, décrit cela.HEAD@{1}
est la valeur précédente de symboliqueHEAD
dans lereflog
alors queHEAD^
est la (première) révision parent du courantHEAD
. Ces deux éléments doivent être équivalents (par exemple, après un rebase, une réinitialisation matérielle, un commutateur de branche, etc.). Lisez l'article lié pour reflog. Vivegit reset HEAD@`{1`}
HEAD@`{1`}
, ou pour qui comptent vraiment ce qui fonctionne sur des coquilles trop POSIX:'HEAD@{1}'
git reflog show
devrait vous montrer l'histoire de HEAD. Vous pouvez l'utiliser pour déterminer où vous vous trouviez avant lepull
. Ensuite, vous pouvezreset
vousHEAD
y engager.la source
pull
c'est la première action? Sipull
est àHEAD@{1}
, et rien d'autre avant cela, comment revenez-vous à un état avant cela?Cela a fonctionné pour moi.
Annuler une fusion ou une extraction:
Découvrez ceci: HEAD et ORIG_HEAD dans Git pour en savoir plus.
la source
Trouvez le
<SHA#>
pour le commit que vous voulez faire. Vous pouvez le trouver dans github ou en tapantgit log
ougit reflog show
sur la ligne de commande, puis faitesgit reset --hard <SHA#>
la source
<SHA#>
Depuis https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree
Voir aussi https://stackoverflow.com/a/30345382/621690
la source