2010-10-07 4 views
159

Я работал над чем-то, и решил, что он был полностью ввернут ... после того, как он совершил некоторые из них. Так что я попробовал следующую последовательность:Как отменить локальные коммиты в Git?

git reset --hard 
git rebase origin 
git fetch 
git pull 
git checkout 

В этот момент я получил сообщение

Your branch is ahead of 'origin/master' by 2 commits. 

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

+6

Там нет необходимости делать как 'GIT fetch' и' GIT pull' - тянуть сочетание выборки и слияния. – Ether

+11

Примечание для пользователей: основная проблема этого вопроса ** не имеет ничего общего с сообщением «Ваша ветка впереди« происхождение/мастер »от N коммит». **. Пожалуйста, прекратите закрывать другие вопросы как дубликаты этого из-за этого сообщения. – 2014-07-21 15:00:54

ответ

370
git reset --hard origin/master 

удалит все совершает не в origin/master где origin это имя репо и master это название филиала.

+0

Я думал, что синтаксис «origin/master», с косой чертой, относится к локальному репо? –

+7

mipadi: Правильно поставленный, он сбросит текущую ветвь, чтобы указать на то же самое, что и начало/мастер. –

+0

Это относится к ветке. 'origin/master' - это ветвь, которая отслеживает ветвь' master' удаленного репо. – mipadi

21

Как и в сторону, кроме ответа по mipadi (который должен работать, кстати), вы должны знать, что делать:

git branch -D master 
git checkout master 

также делает именно то, что вы хотите без having to redownload everything (ваша цитата перефразировать). Это связано с тем, что ваше местное репо содержит копию удаленного репо (и эта копия не совпадает с вашим локальным каталогом, это не то же самое, что и выбранная ветка).

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

+4

Но как это говорит обо всех коммитах, сделанных локально от коммитов, сделанных по происхождению? Фактически, он говорит мне, что 'Не удается удалить ветвь« ведущий », на которой вы в данный момент находитесь.' –

+0

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

+2

2. Конечно, вы не можете удалить ветвь, которая в настоящее время вычеркнута. Чтобы удалить мастер, сначала проверьте другую ветку. Если нет другой ветки, просто создайте временную: 'git checkout -b temp; git branch -D master; git checkout master; git branch -D temp' – slebetman

0

Я видел случаи, когда пульт не синхронизировался и нуждался в обновлении. Если reset --hard или branch -D не работает, попробуйте

git pull origin 
git reset --hard 
+0

это не отвечает на вопрос, в этой ситуации работает 'reset -hard'. – CharlesB

+1

Привет, Чарльз, вы правы, что здесь нужно работать« reset -hard ». Тем не менее, я просто указываю, что изредка не удается правильно восстановить ветвь, а «git pull origin» будет повторно синхронизировать пульт и позволить «reset -hard» функционировать должным образом. –

5

Вам необходимо запустить

git fetch 

Чтобы получить все изменения, и тогда вы не будете получать сообщения с «ваш филиал находится впереди».

+2

Извлечение не имеет ничего общего с основной проблемой айзера, которая избавляется от локальных коммитов. – 2014-07-21 15:24:02

+0

Что делать, если я уже сделал файлы на локальном компьютере, а затем попытался запустить указанную команду. Он покажет одно и то же сообщение об ошибке. Я попробовал git fetch и git fetch -p тоже. но с той же ошибкой – Ronnie

0

я должен был сделать:

git checkout -b master 

, как мерзавец говорит, что он не существует, потому что это было вытирать с

git -D master 
1

То, что я делаю, я стараюсь трудно сбросить с ГЛАВА. Это позволит уничтожить все местные совершающее:

git reset --hard HEAD^ 
Смежные вопросы