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

116

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

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

Будет
источник

Ответы:

208

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

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

исмаил
источник
86

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

Gor
источник
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.

user4948761
источник
4

В корне исходного кода: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes

Клиффорд Хармс
источник
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вы получаете большую гибкость для восстановления после вашей бу-бу.

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

F1Linux
источник
-1

git checkout -f

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

звезда
источник