Как отменить фиксацию последнего не нажатого git, не теряя при этом изменений

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

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

Ответ 1

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

если вы еще не опубликовали коммит публично:

git reset HEAD~1 --soft   

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


В случае, если вы сделали публичный пуш (в ветке с именем 'master'):

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 :) )

вернуть коммит нормально и нажать

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this intorduces a new coomit (say, it 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

Ответ 2

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

git show HEAD > patch
git revert HEAD
git apply patch

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

Ответ 3

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

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. отменить коммит
  2. (создать и) оформить заказ в другой ветке
  3. вернуть назад

Ответ 4

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

git checkout branch_name

Оформить заказ в вашей ветке

мерзавец слияния --abort

Прервать слияние

мерзавец статус

Проверьте статус кода после прерывания слияния

git reset --hard origin/branch_name

эти команды сбросят ваши изменения и приведут ваш код в соответствие с кодом branch_name (branch).

Ответ 5

Для случая: "Это не было выдвинуто, только совершено ". - если вы используете IntelliJ (или другую среду IDE JetBrains), и вы еще не отправили изменения, вы можете сделать следующее.

Перейдите в окно контроля версий (Alt + 9) - вкладка "Журнал". - Щелкните правой кнопкой мыши на коммите до вашего последнего. - Сбросить текущую ветку сюда - выберите Soft (!!!) - нажмите кнопку Reset в нижней части диалогового окна.

Готово.

Это "отменит" ваши изменения и вернет ваш git-статус на уровень, предшествующий вашей последней локальной фиксации. Вы не потеряете сделанные вами изменения.