Як скасувати останнє un-push git počinне, не втрачаючи змін


539

Чи є спосіб повернути фіксацію, щоб моя локальна копія зберігала зміни, внесені до цього комітету, але вони ставали незавершеними змінами в моїй робочій копії? Якщо повернути комісію, ви перейдете до попереднього зобов’язання - я хочу зберегти внесені зміни, але я вчинив їх у неправильній галузі.

На це не підштовхувались, а лише вчинялися.



6
git reset --softі git reset --mixedобидва роблять це (трохи інакше), див. git-reset
torek

Відповіді:


930

Існує маса способів, наприклад:

якщо ви ще не підштовхнули публічне зобов'язання:

git reset HEAD~1 --soft   

Ось так, зміни вашої фіксації будуть у вашому робочому каталозі, тоді як ОСТАННІ коміти будуть видалені з вашої поточної гілки. Дивіться людину скидання git


У разі , якщо ви зробили поштовх публічно (на гілці під назвою «майстер»):

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 introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit 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


5
велике спасибі, у моєму випадку у мене було два коміти, які я хотів скасувати, і запуск "git reset HEAD ~ 1 --soft" двічі поспіль привів мене туди, де мені потрібно було бути.
Джефф Гюнтер

2
щоб додати трохи ясності, якщо ви не використовуєте CLI, перша resetзгадана команда говорить "м'яко" скинути до 1 об. перед головою, що зберігає всі локальні зміни. мені це було не відразу зрозуміло для використання в SourceTree. просто переконайтесь, що ви перезавантажуєтесь на попередній оберт, а не на обороту, яку ви намагаєтеся скинути
Джон B

1
Я спробував "вже натиснутий" підхід, і він не працює для мене, з git 2.14.1: він говорить "Already up to date"під час злиття.
Фабіо А.

1
@FabioA. , Я оновив відповідь робочою версією. Дякуємо, що помітили це!
Ісантіпов

1
Це не працює. Я пропустив скидання та фіксацію, і тільки git повернувся та виштовхнувся ... тепер, можливо, зміни втрачені ще не впевнені ... на щастя, я створив резервну копію простим способом, сподіваюся, що все одно буде працювати;) інакше можна скопіювати зміни з цього .
Skybuck Flying

13

Якщо ви натиснули зміни, ви можете undoце зробити і перемістити файли назад на сцену, не використовуючи іншої гілки.

git show HEAD > patch
git revert HEAD
git apply patch

Він створить файл виправлення, який містить останні зміни гілки. Потім це відновить зміни. І нарешті, застосуйте файли патчів до робочого дерева.


ви можете rm patchтакож
захотіти

6

На випадок: "Це не було натиснуто, а лише скоєне ". - якщо ви використовуєте IntelliJ (або інший ID JetBrains IDE), і ви ще не натиснули зміни, ви можете зробити наступне.

  1. Перейдіть у вікно керування версією ( Alt + 9 / Command + 9 ) - вкладка "Журнал".
  2. Клацніть правою кнопкою миші на фіксації перед останньою.
  3. Скинути поточну гілку тут
  4. вибирайте Soft (!!!)
  5. натисніть кнопку Скидання в нижній частині діалогового вікна.

Зроблено.

Це "відключить" ваші зміни та поверне ваш статус git до того моменту, коли ви перейдете до останнього місцевого комітету. Ви не втратите жодних внесених вами змін.


2
Я люблю вивчати спосіб JetBrains, дякую! Це еквівалентно git reset --soft "HEAD^"Windows, btw. :)
payne

3

Зі мною в основному це буває, коли я підштовхую зміни до неправильної гілки і усвідомлюю пізніше. І наступні роботи у більшості випадків.

git revert commit-hash
git push

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

1
Я це перевірив. Ваш підхід також працює, якщо ви не натиснули на віддалений. $ git revert <commit-hash> ... потім оформити іншу гілку, а потім наберіть $ git revert <revert-commit-hash> (без натискань). Дякуємо, що поділилися цим простим підходом !!
Наталі Коттрілл

1

Будь ласка, не забудьте зробити резервну копію змін, перш ніж запустити ці команди в окрему папку

git checkout name_name

Оформити замовлення у своєму відділенні

git merge --аборт

Відмовитися від злиття

git статус

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

git reset - тверде походження / ім'я гілки

ця команда скине зміни та вирівняє ваш код з іменем гілки (гілки).


1

2020 простий спосіб:

git reset <commit_hash>

Введіть хеш останнього зобов'язання, яке ви хочете зберегти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.