Как отменить все изменения, внесенные в ветку?


116

Я работаю в ветке (т.е. design), и я внес ряд изменений, но мне нужно отменить их все и сбросить, чтобы они соответствовали версии репозитория. Я думал, git checkout designчто сделаю это, но он просто говорит мне, что я уже в ветке designи у меня есть 3 измененных файла.

Как мне отменить эти изменения и получить ветку в том виде, в котором она сейчас стоит на удаленном сервере?

Ответы:


208

Примечание: вы НЕ МОЖЕТЕ ОТМЕНИТЬ это.

Попробуйте git checkout -fэто отменить любые локальные изменения, которые не зафиксированы во ВСЕХ ветвях и главном сервере.


86

git reset --hard может помочь вам, если вы хотите выбросить все с момента последней фиксации


6
илиgit reset --hard HEAD^
deadfish

28
git reset --hard HEAD^действительно должен быть принятый ответ. OP не спрашивал о других ветках ...
vphilipnyc

2
Я пробовал это и думаю, что он удалил все с момента моего последнего нажатия, а не только мою последнюю фиксацию.
Chase Roberts

3
Я попробовал git reset --hard HEAD ^, но он все еще оставил кучу неотслеживаемых файлов. Теперь погуглим, как удалить их одной простой командой.
Джон Дейган

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

Эти шаги могут быть очень полезны, если ваша цель - установить состояние конкретной ветки, равное основной ветке. Для этого запустите это из конкретной ветки, а затем удалите файл [имя ветки] .diff, когда закончите с использованиемgit rm [branch name].diff
karolus

18

Если вы не хотите никаких изменений designи определенно хотите, чтобы она соответствовала удаленной ветке, вы также можете просто удалить ветку и воссоздать ее:

# 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
также: git checkout design; git reset --hard origin / design
Дэн

Я бы также
сделал

Если у вас есть коммиты в локальной ветке, которых нет на удаленном компьютере, на мой взгляд, это рецепт попадания в действительно запутанные ситуации. Я бы точно не стал использовать это решение.
erewok

1
@erewok: Ну, вопрос конкретно говорит, что спрашивающий хочет отменить все изменения.
mipadi

И я не думаю, что этот ответ достигает этого.
erewok

7

@Will, git immersion - действительно хороший и простой учебник по git. он покажет вам, как отменить изменения для следующих случаев: неустановленный, постановочный и зафиксированный. лаборатории 14-18


2
Я просто хотел бы сказать, что теперь я сделал git immersion ... более года спустя. ОЙ! Я должен был сделать это намного раньше ...
Уилл

1
Это необходимо Rubyустановить .. что не всегда кажется выбором
Вишну

5

Если вы хотите отменить изменения в своей локальной ветке, вы можете спрятать эти изменения с помощью команды git stash.

git stash сохранить "some_name"

Ваши изменения будут сохранены, и вы можете получить их позже, если хотите, или можете удалить их. После этого в вашей ветке не будет незафиксированного кода, и вы сможете извлечь последний код из основной ветки с помощью git pull.



0

ОБРАТНЫЙ метод отмены всех изменений:

Я нашел этот вопрос после того, как сделал слияние и забыл о разработке сразу после этого. Вы догадались: я начал изменять несколько файлов прямо на мастере . D'Oh! Поскольку моя ситуация вряд ли уникальна (мы все это сделали, не так ли; ->), я предлагаю обратимый способ, который я использовал, чтобы отбросить все изменения, чтобы мастер снова выглядел как разработка .

Сделав, git diffчтобы увидеть, какие файлы были изменены, и оценить масштаб моей ошибки, я выполнил:

git stash
git stash clear

После первого сохранения всех изменений они были очищены. Все изменения , внесенные в файлы с ошибками в мастер ушли и паритет восстановлен.

Допустим, теперь я хотел восстановить эти изменения. Я могу это сделать. Первый шаг - найти хэш тайника, который я только что очистил / сбросил:

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

После изучения хеша я успешно восстановил незафиксированные изменения с помощью:

git stash apply hash-of-cleared-stash

Я действительно не хотел восстанавливать эти изменения, просто хотел убедиться, что могу их вернуть, поэтому я очистил их снова.

Другой вариант - применить тайник к другой ветке , а не стирать изменения. Таким образом, с точки зрения очистки изменений, внесенных при работе с неправильной ветвью, stashвы получаете большую гибкость для восстановления после вашей бу-бу.

В любом случае, если вам нужны обратимые средства очистки изменений в ветке, вышесказанное является менее опасным способом в этом случае использования.


-1

git checkout -f

Этого достаточно для вашего вопроса. Единственное, что когда-то сделано, значит, сделано. Нет отмены.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.