2016-06-29 4 views
3

Я сделал несколько поручений в своем местном отделении estimation и оттолкнул их на удаленный филиал estimation.Git revert несколько коммитов

Теперь я хочу полностью удалить последние 3 коммита.

Я попытался сделать git reset HEAD^ и git reset HEAD --hard 3 раза, но когда я попытался нажать на изменения, он пожаловался, что наконечник HEAD не выровнен.

Как это сделать?

EDIT:

История выглядит следующим образом:

commit e572aab4e18

commit e21e7310bc4

commit 4f372a513da

commit 31a4ac607ae

commit a1a6e3f02dd

Я хотел бы, чтобы удалить верхний 4 и вернуться к commit a1a6e3f02dd и сделать локальный и удаленный филиал на одном HEAD.

+0

вы можете найти этот ответ: http://stackoverflow.com/a/1470452/1475228 –

ответ

3

Первое: Вы должны сделать это только для отрасли, что вы не обмена; если ветвь проверяется другими, этот процесс не синхронизируется с удаленным локальным копированием, и они не смогут просто нажать на фиксации в филиале. Это можно отсортировать, но это потенциально беспорядок.

Учитывая, что, если я вас правильно понимаю, вы в этой ситуации:

xxxxxxx Bad commit #3 
yyyyyyy Bad commit #2 
zzzzzzz Bad commit #3 
wwwwwww This and everything before it are fine 

Вы хотите отказаться от совершающих после wwwwwwww и зафиксировать удаленный филиал, чтобы соответствовать.

Сначала создайте резервную копию ветви, на которой вы делаете операцию, чтобы восстановить ее, если вы испортились, а затем вернитесь к ветке, которую хотите удалить.

git checkout -b broken-estimation 
git checkout estimation 

git log Run, чтобы найти SHA1 из первой фиксации вы хотите сохранить. Как только вы что SHA1, сбросить ветку, что:

git reset --hard kkkkkkk 

где kkkkkk является SHA1 из первого совершить вы хотите сохранить на ветке.

Запустите git log еще раз, чтобы убедиться, что у вас есть желаемый SHA1 в качестве кончика этой ветки; это должно быть первое коммитирование, которое вы видите на выходе git log. Если вы не убрали достаточно коммитов, повторите команду git reset --hard с правильным SHA1, чтобы удалить больше коммитов.

Если вы удалили слишком много фиксаций, восстановить estimation ветвь из резервной копии вы взяли:

git checkout -B estimation broken-estimation 

и повторить git log найти SHA1 фиксации, который вы хотите на кончике, а затем git reset --hard kkkkkkkkkkkkkk, являющимся SHA1, который вы действительно хотели), чтобы удалить нежелательные коммиты после этого фиксации.

После того, как вы получили ветвь в желаемое состояние, вы можете нажать на неподвижную ветвь на пульте дистанционного управления, заменив старую версию:

git push -f the_proper_remote estimation 

После того, как вы уверены, что ваш ремонт правильно, вы можно удалить резервную копию ветви:

git branch -d broken-estimation 
+0

Это сработало отлично. –

5

Если вы уже толкали фиксации (и не хотите, чтобы сделать усилие-толчок и перезаписи данных в удаленном хранилище, есть несколько вещей, которые вы можете сделать):

Вы можете использовать git revert вместо git reset:

$ git revert ~4..HEAD 

Или вы можете использовать git checkout, а затем зафиксировать изменения:

$ git checkout ~3 -- . 
$ git commit 

git revert сделают 3 отдельных обязательства по возврату. Метод git checkout позволит вам отменить изменения только за одну фиксацию.

В вашем случае, вы можете сделать это:

$ git reset --hard $REMOTE/$BRANCH 
$ git checkout a1a6e3f02dd -- . 
$ git commit 
+0

Спасибо Mipadi. Я немного смущен, поэтому я предоставил больше информации. Не могли бы вы взглянуть на него? –

+0

@chintans: Обновлен мой ответ. – mipadi

+0

Спасибо, но теперь моя ветка 'a1a6e3f02dd', но я хочу просто удалить все 4 коммита полностью, поэтому мой локальный удаленный брелок обе точки' a1a6e3f02dd'. –

0

Вы можете сделать это в три команды:

во-первых, переписать историю удаленного филиала:

git push origin +a1a6e3f02dd:estimation 

Обратите внимание: «+» вызывает «силовое нажатие». Эта команда говорит, что «force a1a6e3f02dd является вершиной ветви начала/оценки».

Как только это сделано, вам просто нужно, чтобы получить местное отделение «оценка» синхронизирован с удалённой:

git checkout estimation 
get reset --hard origin/estimation 

А ты молодец! Но будьте предупреждены: «git reset --hard» уничтожит любую незафиксированную работу, которую вы имеете в этом проекте.

Если другие также работают с ветвью «оценки», и они уже потянули ваши 4 «плохие» в свои ветви, тогда будет некоторая координационная проблема. Но по моему опыту все предупреждения и предостережения о «никогда не переписывают историю общих ветвей» раздуты. Его следует переформулировать: никогда не переписывать историю долгоживущие общие ветви.

Смежные вопросы