С учетом изменений, которые были зафиксированы с использованием commit, а затем отменены с помощью revert, каков наилучший способ отменить этот возврат?
В идеале это должно быть сделано с новым коммитом, чтобы не переписывать историю.
Обратите внимание, что если вы хотите отменить возврат без немедленного применения исходных изменений к основной ветви, вы можете (1) восстановить исходную ветвь, если она удалена, (2) нажать «вернуться» в ответной ветви, как заметил Адам, затем ( 3) нажмите «изменить» в заголовке полученного PR и измените целевую ветвь на исходную ветвь вместо основной. Теперь ваша первоначальная ветвь может быть повторно объединена для изменения ранее отмененных изменений.
pauljm
1
Обратите внимание, что это удалит все изменения в рабочем дереве и индексе. Используйте git stash, чтобы сохранить любые изменения, которые вы не потеряете.
zpon
3
В чем преимущество метода check && commit? Кажется, что в общем случае git cherry-pickили в качестве альтернативы git revertявляются наиболее прямыми способами отменить возврат.
Роберт Джек, Уилл
5
Я думаю, что было бы полезно показать, как: Otherwise, reverting the revert is perfectly fine.а затем также объяснить, что git checkout HEAD^^ -- .делает.
Тодд
3
Господи, не используйте git add -A... если вы не хотите добавлять каждый файл в систему управления версиями, что, скорее всего, не то, что вам нужно.
Кайтейн
474
git cherry-pick <original commit sha>
Сделает копию оригинального коммита, по существу повторно применяя коммит
Возврат возврата будет делать то же самое с более сложным сообщением фиксации: git revert <commit sha of the revert>
Любой из этих способов позволит вам git pushбез перезаписи истории, потому что он создает новый коммит после возврата.
При вводе коммита sha обычно вам нужны только первые 5 или 6 символов: git cherry-pick 6bfabc
Это, пожалуй, самое элегантное и полное решение вопроса ОП. Гораздо лучше, чем принятый ответ с его предположениями о том, что возвращаемый коммит находится в HEAD дерева коммитов. Оператор также специально попросил решение, которое не переписывает историю, поэтому сложное решение, предлагаемое в принятом ответе, просто неверно.
Тимо
6
@Timo Чтобы уточнить, в принятом ответе содержится решение, которое я использовал («отмена возврата»), и оно было опубликовано в течение нескольких часов после моего вопроса - на 3 года раньше, чем этот ответ. Отсюда и галочка.
JimmidyJoo
6
@JimmidyJoo Я знаю, что я опоздал на 3 года, я просто хотел, чтобы люди приходили сюда из поиска в Google, чтобы увидеть лучший ответ
Стефан,
2
@ Стефан Да, но еще раз, чтобы уточнить - это лучший ответ, но не тот, который я использовал для решения своей проблемы. Я просто комментировал, почему галочка там, где она есть. Вопрос ко всем: предписывает ли конвенция SO, что я должен «поддерживать» мои прошлые вопросы и переназначать галочки, когда приходят новые ответы?
JimmidyJoo
3
@JimmidyJoo, я понятия не имею, что такое конвенция. Но, как поисковик Google, я действительно предпочитаю увидеть лучший ответ проверено. И был бы признателен за все усилия, чтобы сохранить свои прошлые вопросы.
Пайман Роинтан
30
Вернуть коммит, как и любой другой коммит в git. Это означает, что вы можете вернуть его, как в:
Это, очевидно, имеет смысл только после того, как изменения были перенесены, особенно когда вы не можете принудительно нажать на целевую ветвь (что является хорошей идеей для вашей основной ветки). Если изменение не было выдвинуто, просто выполните cherry-pick, отмените или просто удалите фиксацию возврата, как в других публикациях.
В нашей команде, у нас есть правило , чтобы использовать Revert на REVERT фиксаций , которые были совершены в основной отрасли, в первую очередь , чтобы сохранить историю в чистоте, так что вы можете увидеть , какие совершают Возвращается то , что:
Таким образом, вы можете проследить историю и выяснить всю историю, и даже те, кто не знает о наследии, могут решить ее для себя. Принимая во внимание, что, если вы выбираете или перебираете вещи, эта ценная информация теряется (если вы не включите ее в комментарий).
Очевидно, что если коммит возвращался и возвращался более одного раза, это становится довольно грязным.
Это выглядит глупо для меня. Но я был в той же ситуации, и я вернулся к отмененным коммитам. Я сделал возврат чисел, поэтому мне приходилось делать возврат для каждого «возврата».
Теперь моя история коммитов выглядит немного странно.
Это любимый проект, так что все в порядке. Но для реального проекта я бы предпочел перейти к последнему коммиту, прежде чем вернуться, чтобы восстановить весь возвращенный код вместе в одном коммите и более разумном комментарии.
Вы можете избежать автоматической фиксации и выбрать фиксацию сообщения с помощью флага --no-commit при возврате, а затем зафиксировать его соответствующим сообщением
David Barda
Также вы можете указать несколько идентификаторов коммитов при использовании git revert (я думаю, они должны быть в правильном порядке).
Aalex Gabi
Могу ли я сделать это с рабочего стола github?
Гийом Ф.
4
Вот как я это сделал:
если ветвь my_branchnameбыла включена в слияние, которое было отменено. И я хотел unrevert my_branchname:
Я сначала делаю git checkout -b my_new_branchnameиз my_branchname.
Затем я делаю git reset --soft $COMMIT_HASHгде $COMMIT_HASHхеш коммита коммита прямо перед первым коммитом my_branchname(см. git log).
Затем я делаю новый коммит. git commit -m "Add back reverted changes"
Затем я поднимаю новую ветвь. git push origin new_branchname
Затем я сделал запрос на извлечение новой ветки.
Путь, когда есть слишком много "вишни", чтобы сделать. Я не понимаю, почему в этом ответе так мало голосов
Фандхор
2
Или вы могли бы git checkout -b <new-branch>и git cherry-pick <commit>до того и git rebaseбросить revertсовершить. отправить запрос на извлечение, как раньше.
Если вам не нравится идея «отменить возврат» (особенно, когда это означает потерю хронологической информации для многих коммитов), вы всегда можете обратиться к документации по git «Отмена ошибочного слияния» .
Хорошая идея и спасибо за ссылку на документ. Мы обычно перезагружаемся с master до слияния обратно, но затем git, похоже, распознает, что A ', B', C 'такие же, как и прежде, и теперь у меня есть D, E после W ( pastebin ). Предложения о том, как решить эту проблему?
Кристоффер Баккейорд
0
Чтобы вернуть неустановленные и поэтапные изменения, которые были отменены после фиксации:
Ответы:
Если вы еще не отменили это изменение,
git reset --hard HEAD^
В противном случае, возвращение возврата совершенно нормально.
Другой способ -
git checkout HEAD^^ -- .
и тогдаgit add -A && git commit
.источник
git cherry-pick
или в качестве альтернативыgit revert
являются наиболее прямыми способами отменить возврат.Otherwise, reverting the revert is perfectly fine.
а затем также объяснить, чтоgit checkout HEAD^^ -- .
делает.git add -A
... если вы не хотите добавлять каждый файл в систему управления версиями, что, скорее всего, не то, что вам нужно.git cherry-pick <original commit sha>
Сделает копию оригинального коммита, по существу повторно применяя коммит
Возврат возврата будет делать то же самое с более сложным сообщением фиксации:
git revert <commit sha of the revert>
Любой из этих способов позволит вам
git push
без перезаписи истории, потому что он создает новый коммит после возврата.При вводе коммита sha обычно вам нужны только первые 5 или 6 символов:
git cherry-pick 6bfabc
источник
Вернуть коммит, как и любой другой коммит в git. Это означает, что вы можете вернуть его, как в:
Это, очевидно, имеет смысл только после того, как изменения были перенесены, особенно когда вы не можете принудительно нажать на целевую ветвь (что является хорошей идеей для вашей основной ветки). Если изменение не было выдвинуто, просто выполните cherry-pick, отмените или просто удалите фиксацию возврата, как в других публикациях.
В нашей команде, у нас есть правило , чтобы использовать Revert на REVERT фиксаций , которые были совершены в основной отрасли, в первую очередь , чтобы сохранить историю в чистоте, так что вы можете увидеть , какие совершают Возвращается то , что:
Таким образом, вы можете проследить историю и выяснить всю историю, и даже те, кто не знает о наследии, могут решить ее для себя. Принимая во внимание, что, если вы выбираете или перебираете вещи, эта ценная информация теряется (если вы не включите ее в комментарий).
Очевидно, что если коммит возвращался и возвращался более одного раза, это становится довольно грязным.
источник
Возврат откат сделает свое дело
Например,
Если
abcdef
это ваш коммит иghijkl
тот коммит, который у вас был, когда вы отменили коммитabcdef
, то выполните:Это вернет возврат
источник
Это выглядит глупо для меня. Но я был в той же ситуации, и я вернулся к отмененным коммитам. Я сделал возврат чисел, поэтому мне приходилось делать возврат для каждого «возврата».
Теперь моя история коммитов выглядит немного странно.
Это любимый проект, так что все в порядке. Но для реального проекта я бы предпочел перейти к последнему коммиту, прежде чем вернуться, чтобы восстановить весь возвращенный код вместе в одном коммите и более разумном комментарии.
источник
Вот как я это сделал:
если ветвь
my_branchname
была включена в слияние, которое было отменено. И я хотел unrevertmy_branchname
:Я сначала делаю
git checkout -b my_new_branchname
изmy_branchname
.Затем я делаю
git reset --soft $COMMIT_HASH
где$COMMIT_HASH
хеш коммита коммита прямо перед первым коммитомmy_branchname
(см.git log
).Затем я делаю новый коммит.
git commit -m "Add back reverted changes"
Затем я поднимаю новую ветвь.
git push origin new_branchname
Затем я сделал запрос на извлечение новой ветки.
источник
Или вы могли бы
git checkout -b <new-branch>
иgit cherry-pick <commit>
до того иgit rebase
броситьrevert
совершить. отправить запрос на извлечение, как раньше.источник
Если вам не нравится идея «отменить возврат» (особенно, когда это означает потерю хронологической информации для многих коммитов), вы всегда можете обратиться к документации по git «Отмена ошибочного слияния» .
Учитывая следующую стартовую ситуацию
(W - ваш первоначальный возврат к слиянию M; D и E - исправления к вашей изначально поврежденной ветви / коммиту)
Теперь вы можете просто воспроизвести коммиты от A до E, чтобы ни один из них не «принадлежал» к обратному слиянию:
Новая копия вашей ветви теперь может быть объединена с
master
:источник
Чтобы вернуть неустановленные и поэтапные изменения, которые были отменены после фиксации:
Чтобы восстановить все неустановленные удаления:
источник