2013-11-08 3 views
211

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

Это не было нажато, только выполнено.

+1

Возможный дубликат [Можете ли вы объяснить, что означает «сброс git» на простом английском?] (Http://stackoverflow.com/questions/2530060/can-you-explain-what-git-reset-does-in- plain-english) – CodeFanatic

+2

'git reset --soft' и' git reset --mixed' оба делают это (немного по-другому), см. [git-reset] (https://www.kernel.org/pub/software/ scm/git/docs/git-reset.html) – torek

ответ

381

Есть много способов сделать это, например:

в случае, если у вас есть не протолкнул совершить еще публично:

git reset HEAD~1 --soft 

Вот именно, ваши совершающие изменения будут быть в вашем рабочем каталоге, тогда как LAST commit будет удален из вашей текущей ветви. См git reset man


В случае, если вы сделал толчок публично (на ветке называется 'мастер'):

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :)) 

Revert фиксации обычно и нажмите

git checkout master 
git revert a8172f36 #hash of the commit you want to destroy 
# this intorduces a new coomit (say, it's hash is 86b48ba) which removes changes, introduced in the coomit in question (but those changes are still visible in the history) 
git push origin master 

теперь, если вы хотите чтобы эти изменения были изменены локально в вашей рабочей копии («так, чтобы ваша локальная копия сохраняла изменения, внесенные в эту фиксацию») - просто верните обратно команду т с -no-commit вариант:

git revert --no-commit 86b48ba (hash of the revert commit). 

Я выстроил небольшой пример: https://github.com/Isantipov/git-revert/commits/master

+0

Большое вам спасибо, в моем случае у меня было две коммиты, которые я хотел отменить, и два раза подряд запускал 'git reset HEAD ~ 1 --soft' Мне нужно было быть. –

+0

, чтобы добавить немного ясности, если вы не используете CLI, первая упомянутая команда «reset» говорит «мягко» сбросить до 1 оборота до головы, что сохраняет все локальные изменения. это мне сразу не показалось для использования в SourceTree. просто убедитесь, что вы мягко переустанавливаете предыдущий оборот, а не rev, который вы пытаетесь сбросить. –

+0

У меня было два локальных коммита, которые я хотел удалить, не теряя при этом изменений. Я сделал «git reset HEAD ~ 2» без --soft, и он работал корректно, как ожидалось. –

5

Если вы подтолкнули изменения, вы можете undo его и переместить файлы обратно на сцену без использования другой ветви.

git show HEAD > patch 
git revert HEAD 
git apply patch 

Он создаст файл исправления, содержащий последние изменения ветви. Затем он отменяет изменения. И, наконец, примените файлы исправлений к рабочему дереву.

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