Як я можу знову знеструмити свої файли після того, як зробити місцеве зобов’язання?


268

Я виконав таку команду

git add <foo.java>
git commit -m "add the foo.java file"

Як я можу зараз видалити локальну комісію та нестабільну foo.java?

Якщо я набрав git reset --hard, я виявив, що він повертає змінену foo.javaдо початкової.

Відповіді:


451

git reset --soft HEAD~1слід робити те, що ти хочеш. Після цього у вас з’являться перші зміни в індексі (видно з git diff --cached), а ваші новіші зміни не здійснюються поетапно. git statusбуде виглядати приблизно так:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   foo.java
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo.java
#

Потім ви можете зробити git add foo.javaта здійснити обидві зміни одночасно.


Я відредагував відповідь: "Зміни, які слід здійснити" мають перші зміни, а "зміни, які не здійснюються для здійснення", мають другі зміни.
Антті

4
Те, що описано у цій відповіді, насправді те, що git commit --amendробить; але зі значно складнішим робочим процесом. Це не дає відповіді на запитання ОП, незважаючи на те, що він дав хороший напрямок ( git reset).
7heo.tk

2
Довелося замінити '^' на '~', щоб він працював, так виглядає так:git reset --soft HEAD~
Шахар

3
do git reset --soft HEAD ~ 1, тоді git reset HEAD
Joko Wandiro

ідеальна відповідь на те, що я хочу!
DeepInJava

78

Використання:

git reset HEAD^

Це робить "змішане" скидання за замовчуванням, яке виконає те, що ви просили; помістіть foo.java у нестандартному режимі, видаливши останню комісію.


2
Ви б не хотіли пояснити мені, що таке "змішане" скидання, "м'яке" скидання та "жорстке" скидання?
Кіт Хо

1
@Kit Ho - git reset guide має чудові описи цих даних.
manojlds

4
@Kit, @manojlds: Так само stackoverflow.com/questions/2530060 / ... (безсоромний штепсель)
Cascabel

5
Це насправді єдина правильна відповідь. Дві інші відповіді будуть ставити файли знову після виконання фіксації.
7heo.tk

git reset --softне працювало, але все- git reset HEAD^таки
словазвідти

43

Для мене наступним є більш читабельний (таким чином кращий) спосіб зробити це:

git reset HEAD~1

Замість 1цього може існувати будь-яка кількість комітетів, які ви хочете знецінити.


39

git reset --softякраз для цього: це як git reset --hard, але не торкається файлів.


4
Це було найлегше зрозуміле пояснення, яке я чув ще (лише 11 слів)! Дякую!
фрікхед

3
Ця відповідь неправильна. git reset"схоже, git reset --hardале не торкається файлів." Ні git reset --soft. git reset --softбуде проводити зміни, тож вам не доведеться додавати їх до постановки на випадок, якщо ви хочете їх здійснити, але вам доведеться git resetїх (так, вдруге і без цього --soft), якщо ви цього не зробите. Тож ця відповідь коротка, але неправильна.
7heo.tk

12

Для видалення всіх файлів у вашій останній комісії -

git reset HEAD~


8

"Скидання" - це спосіб скасувати зміни локально. Здійснюючи зміни, ви спершу вибираєте зміни, які слід включити до " git add " - це називається "постановка". І як тільки зміни відбуватимуться, то ви їх " git вчиняєте ".

Щоб відмовитися від інсценізації чи зйомки, ви "скидаєте" ГЛАВУ. На гілці HEAD - це змінна git, яка вказує на останню версію. Отже, якщо ви ставились, але не зробили цього, ви " git reset HEAD ". Це резервне копіювання до поточної ГОЛА, знімаючи зміни зі сцени. Це скорочення " git reset - змішана HEAD ~ 0. "

Якщо ви вже здійснили, HEAD вже просунувся, тому вам потрібно створити резервну копію до попереднього виконання. Тут ви « скиньте HEAD ~ 1 » або « скиньте HEAD ^ 1 » або « reset HEAD ~ » або « reset HEAD ^ » - всі посилання HEAD мінус одна.

Який кращий символ, ~ чи ^? Подумайте про ~ tilde як про один потік - коли в кожному фільмі є один з батьків і це лише ряд змін послідовності, тоді ви можете посилатись на резервну копію потоку, використовуючи тильду, як HEAD ~ 1, HEAD ~ 2, HEAD ~ 3, для батьків, бабусь і дідусів, прапрадідів тощо (технічно це пошук першого батька в попередніх поколіннях).

Коли відбувається злиття, то коміти мають більше одного батька. Ось тоді ^ карета вступає в гру - ви можете згадати, бо вона показує гілки, що збираються. Використовуючи карету, HEAD ^ 1 буде першим батьком, а HEAD ^ 2 буде другим батьком одного вчинку - наприклад, матір та батько.

Отже, якщо ви просто повертаєтеся одним стрибком на одному з батьківських зобов'язань, то HEAD ~ і HEAD ^ є рівнозначними - ви можете використовувати будь-який.

Також скиданням може бути --soft , - змішаний або --hard . М'яке скидання просто відновлює фіксацію - вона скидає HEAD, але не перевіряє файли з попередньої фіксації, тому всі зміни в робочому каталозі зберігаються. І - скидання програмного забезпечення навіть не очищає стадію (також відомий як індекс ), тому всі встановлені файли все ще будуть на сцені.

- змішане скидання (за замовчуванням) також не перевіряє файли з попередньої фіксації, тому всі зміни зберігаються, але етап очищається. Ось чому простий " git reset HEAD " очиститься зі сцени.

--Hard скидання скидає ГОЛОВА, і він очищає грунт, але він також перевіряє всі файли з раніше фіксації і тому він переписує будь-які зміни.

Якщо ви натиснули комісію на віддалений сховище, скидання не працює так добре. Можна скинути локально, але коли ви спробуєте натиснути на віддалений, git побачить, що ваша локальна HEAD стоїть за HEAD у віддаленій гілці і відмовиться натискати. Можливо, ти зможеш змусити натиснути, але git дійсно не любить цього робити.

Крім того , ви можете збирати свої зміни , якщо ви хочете зберегти їх, перевірити раніше фіксації, зніміть збирати зміни, стадії їх, створити новий Комміт, а потім натисніть що.


+1 для детального пояснення операції. ІМО це має бути прийнятою відповіддю!
ISAE

2

Скажімо, ви хочете змінити нестабільні зміни до n комітетів,

Якщо здійснюють хеші, такі:

  • h1
  • h2 ...
  • hn
  • hn + 1

Потім запустіть таку команду:
git reset hn

Тепер ГОЛА буде в hn + 1. Зміни від h1 до hn будуть не встановлені.

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