2009-08-13 4 views
435

Вот что я сделал на моем должна-быть стабильной отрасли ...Отвернув «GIT толчок»

% git rebase master 
First, rewinding head to replay your work on top of it... 
Fast-forwarded alpha-0.3.0 to master. 
% git status 
# On branch alpha-0.3.0 
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits. 
# 
nothing to commit (working directory clean) 
% git push 
Fetching remote heads... 
    refs/ 
    refs/heads/ 
    refs/tags/ 
    refs/remotes/ 
'refs/heads/master': up-to-date 
updating 'refs/heads/alpha-0.3.0' 
    from cc4b63bebb6e6dd04407f8788938244b78c50285 
    to 83c9191dea88d146400853af5eb7555f252001b0 
    done 
'refs/heads/unstable': up-to-date 
Updating remote server info 

Это было все ошибки, как я потом понял. Я хотел бы отменить весь этот процесс и вернуть ветку alpha-0.3.0 обратно в то, что было.

Что мне делать?

+0

это postoverflow post возможно? http://stackoverflow.com/questions/134882/undoing-a-git-rebase – Steen

+4

На самом деле это не та же ситуация, отмена rebase - это локальный сценарий репозитория, отмена git push включает в себя удаленный репозиторий и может быть больше в зависимости от вашего доступа. –

+0

Стин - ты прав. Вероятно, я должен был предположить. Я понял, что блаженный репозиторий, который все тянет, больше связан с задачей администратора и поэтому принадлежит здесь, где общий клиентский git - это вопрос stackoverflow. – Cyrus

ответ

697

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

Затем вам нужно «заставить» нажать старую ссылку.

git push -f origin last_known_good_commit:branch_name 

или в случае

git push -f origin cc4b63bebb6:alpha-0.3.0 

Вы можете иметь receive.denyNonFastForwards набор на удаленном хранилище. Если это так, то вы получите сообщение об ошибке, которое включает фразу [remote rejected].

В этом случае вам необходимо удалить и воссоздать ветку.

git push origin :alpha-0.3.0 
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0 

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

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8 
+12

Идеальный и хорошо объясненный ответ - большое спасибо. Для всех, кто спотыкается об этом, по академическим причинам я пробовал оба из первых двух подходов, и оба работали - очевидно, если первый работает, это самый чистый подход. Если бы я хотел ВАС 10 раз Чарльз, я бы. :) – Cyrus

+133

Для быстрой ссылки первая строка здесь: 'git push -f origin last_known_good_commit: branch_name' – philfreo

+5

git push -f origin cc4b63bebb6: alpha-0.3.0 => этот помог мне, примечание alpha-0.3.0 is имя ветки и cc4b63bebb6 - это идентификатор фиксации, к которому мы хотим вернуться назад. поэтому после выполнения этой команды мы будем находиться в cc4b63bebb6 commit id. – kumar

120

Я считаю, что вы также можете сделать это:

git checkout alpha-0.3.0 
git reset --hard cc4b63bebb6 
git push origin +alpha-0.3.0 

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

+8

Это работало и для меня, но стоит отметить, что это будет «перезаписать» историю на пульте дистанционного управления. Это может быть то, что вы хотите, но это может быть не так! – Tom

+1

+1 за этот ответ, который действительно помог мне. Я также хотел добавить (и прояснить), что идентификатор commit (который появляется после параметра «--hard») должен быть идентификатором любого фиксатора, для которого вы хотите восстановить свою ветку. –

+0

Как получилось, когда я делаю «git pull», я получаю что-то вроде: «fe88549..50a8083 master -> origin/master Уже обновлено. – Michelle

31

Принятое решение (от @charles bailey) очень опасно, если вы работаете в общем репо.

В качестве наилучшей практики все коммиты, перенесенные в удаленное репо, которое является общим, следует считать «неизменным». Используйте 'мерзавец Возвратить' вместо: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things

+0

Какие именно инструкции вы предписываете? У вас только есть старые ссылки. – jww

14

Другой способ сделать это:

  1. создать еще один филиал
  2. проверку предыдущий коммит на этой ветке, используя "GIT проверку"
  3. нажмите на новую ветку.
  4. удалить старую ветвь & нажмите Delete (использование git push origin --delete <branch_name>)
  5. переименовать новую ветвь в старой ветви
  6. нажимной снова.
+2

Это похоже на реальное решение, когда вы уже ошибаетесь в репо –

24

способ сделать это без потери изменений, которые вы хотели:

git reset cc4b63b 
git stash 
git push -f origin alpha-0.3.0 
git stash pop 

Затем вы можете выбрать файлы, вы имели в виду, чтобы нажать

68

git revert менее опасен, чем некоторые из предложенных подходов здесь :

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650 
[master 71738a9] Revert "Issue #482 - Fixed bug." 
4 files changed, 30 insertions(+), 42 deletions(-) 
prompt> git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 
prompt> 

Заменить 35f6af6f77f116ef922e3d75bc80a4a466f92650 с вашей собственной фиксации.

+2

Как мне найти 35f6af6f77f116ef922e3d75bc80a4a466f92650 ID? Этот ответ был бы лучше, если бы вы могли это объяснить. – Volomike

+1

@ Volomike (и Googling разработчики будущего), этот вопрос описывает многие способы его получения: [контроль версий и хэш-вопрос на SO] (http://stackoverflow.com/questions/949314/how-to-retrieve-the -hash-for-the-current-commit-in-git) – Jaime

+0

Это правильный ответ, потому что с «сбросом git» вы не сможете нажать (Обновления были отклонены, поскольку конец вашей текущей ветви находится за ее удаленным аналог), или вам нужно заставить тянуть, что на самом деле не чисто. –

5
git push origin +7f6d03:master 

Это отменит свой репозиторий, чтобы упомянутый номер зафиксированной

+0

Это самый прямой ответ. Вы живая заставка. –

6

Undo множественным совершает мерзавец сброс --hard 0ad5a7a6 (Просто предоставьте совершить хэш SHA1)

Отмена последнего совершить сброс

GIT --hard HEAD ~ 1 (изменения последнего фиксации будут удалены) git reset --soft HEAD ~ 1 (изменения для последнего фиксации будут доступны как локальные локальные модификации)

-1

Это приведет к удалению последнего толкнул фиксации в удаленном филиале (хозяин или филиал):

git push origin +HEAD^:master  
+0

да! это работало как шарм при работе с github. Благодарю. – cukabeka

+0

Нет! Это сделало что-то сверхъестественное, что не отменило изменений вообще. –

+1

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

1

Сценарий 1: Если вы хотите, чтобы отменить последний коммит сказать 8123b7e04b3, ниже команда (это работает для меня):

git push origin +8123b7e04b3^:master 

Выход выглядит, как показано ниже:

Total 0 (delta 0), reused 0 (delta 0) 
To https://testlocation/code.git 
+ 8123b7e...92bc500 8123b7e04b3^ -> master (forced update) 

Дополнительная информация: Сценарий 2: В некоторых ситуациях, вы можете вернуться назад, что вы только undo'ed (в основном отменить отмену) через предыдущую команду, а затем использовать следующую команду:

git reset --hard 8123b7e04b3 

Выход:

HEAD is now at cc6206c Comment_that_was_entered_for_commit 

Больше информации здесь: https://github.com/blog/2019-how-to-undo-almost-anything-with-git

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