Comment annuler toutes les modifications apportées à une branche?


116

Je travaille dans une branche (c'est-à-dire design) et j'ai fait un certain nombre de modifications, mais je dois les supprimer toutes et les réinitialiser pour qu'elles correspondent à la version du référentiel. Je pensais que je git checkout designle ferais, mais cela me dit juste que je suis déjà en branche designet que j'ai 3 fichiers modifiés.

Comment annuler ces modifications et récupérer la branche telle qu'elle se présente sur le serveur distant?

Réponses:


207

Remarque: vous NE POUVEZ PAS ANNULER ceci.

Essayez git checkout -fceci supprimera toutes les modifications locales qui ne sont pas validées dans TOUTES les branches et master.


86

git reset --hard peut vous aider si vous voulez tout jeter depuis votre dernier commit


6
orgit reset --hard HEAD^
deadfish

28
git reset --hard HEAD^devrait vraiment être la réponse acceptée. OP ne posait pas de questions sur les autres branches ...
vphilipnyc

2
J'ai essayé cela, et je pense que cela a tout supprimé depuis mon dernier push, pas seulement mon dernier commit.
Chase Roberts

3
J'ai essayé git reset --hard HEAD ^ et il restait encore un tas de fichiers non suivis. Maintenant, Google comment les supprimer en une seule commande.
John Deighan

20
git diff master > branch.diff
git apply --reverse branch.diff

Ces étapes peuvent être très utiles, si votre objectif est de définir l'état d'une branche spécifique pour être égal à la branche principale. Pour ce faire, exécutez ceci à partir de la branche spécifique, puis supprimez le fichier [nom de la branche] .diff lorsque vous git rm [branch name].diff
avez

18

Si vous ne voulez pas de modifications designet que vous voulez vraiment qu'il corresponde simplement à la branche d'une télécommande, vous pouvez également simplement supprimer la branche et la recréer:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

7
aussi: git checkout design; git reset --hard origin / design
Dan

Je m'engagerais également avant de supprimer la branche
Asarluhi

Si vous avez des commits dans la branche locale qui ne sont pas sur la télécommande, c'est une recette pour entrer dans des situations vraiment déroutantes à mon avis. Je n'utiliserais certainement pas cette solution.
erewok le

1
@erewok: Eh bien, la question dit spécifiquement que le demandeur veut annuler toutes les modifications.
mipadi

Et je ne pense pas que cette réponse y parvienne.
erewok

7

@Will, git immersion est un tutoriel git vraiment sympa et simple. il vous montrera comment annuler les modifications dans les cas suivants: non mis en scène, mis en scène et validé. laboratoires 14-18


2
Je voudrais juste dire que j'ai maintenant fait l'immersion git ... plus d'un an plus tard. OI! J'aurais dû faire ça beaucoup plus tôt ...
Will

1
Cela doit Rubyêtre installé ... ce qui ne semble pas toujours un choix
Vishnu

5

Lorsque vous souhaitez annuler les modifications de votre branche locale, vous pouvez les cacher à l'aide de la commande git stash.

git stash save "un_nom"

Vos modifications seront enregistrées et vous pourrez les récupérer plus tard, si vous le souhaitez ou vous pouvez les supprimer. Après cela, votre branche n'aura aucun code non validé et vous pouvez extraire le dernier code de votre branche principale en utilisant git pull.


4

Dans la racine source: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes


0

Méthode RÉVERSIBLE pour annuler toutes les modifications:

Je trouve cette question après après avoir fait une fusion et l' oubli à la caisse développer immédiatement après. Vous l'avez deviné: j'ai commencé à modifier quelques fichiers directement sur master . D'Oh! Comme ma situation n'est guère unique (nous l'avons tous fait, n'est-ce pas; ->), je vais vous proposer un moyen réversible que j'avais l'habitude d'annuler tous les changements pour que le maître ressemble à nouveau à développer .

Après avoir fait un git diffpour voir quels fichiers ont été modifiés et évaluer la portée de mon erreur, j'ai exécuté:

git stash
git stash clear

Après avoir enregistré toutes les modifications, elles ont ensuite été effacées. Toutes les modifications apportées aux fichiers par erreur dans le master ont disparu et la parité est restaurée.

Disons que je voulais maintenant restaurer ces changements. Je peux le faire. La première étape consiste à trouver le hachage de la réserve que je viens de supprimer / déposer:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

Après avoir appris le hachage, j'ai restauré avec succès les modifications non validées avec:

git stash apply hash-of-cleared-stash

Je ne voulais pas vraiment restaurer ces modifications, je voulais juste valider que je pouvais les récupérer, alors je les ai effacées à nouveau.

Une autre option consiste à appliquer la réserve à une branche différente , plutôt que d'effacer les modifications. Donc, en termes d'effacement des modifications apportées après avoir travaillé sur la mauvaise branche, stashvous donne beaucoup de flexibilité pour récupérer de votre boo-boo.

Quoi qu'il en soit, si vous voulez un moyen réversible d'effacer les modifications d'une branche, ce qui précède est un moyen moins dangereux dans ce cas d'utilisation.


-1

git checkout -f

Cela suffit pour votre question. La seule chose est, une fois que c'est fait, c'est fait. Il n'y a pas d'annulation.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.