Як внести зміни до останнього зобов’язання щодо видалення файлу?


108

Я змінив два файли a, bв останньому фіксації. Але файл bне повинен бути заблокованим, який робочий процес для внесення змін до цього?

Відповіді:


109

Оновлення (через пару років)

Ян Худець

Видалити його лише з індексу нереально.

Правда: ви можете скинути файл до його вмісту в індексі досить легко, як свідчить остання відповідь (написана Меттом Конноллі ):

git reset HEAD^ path/to/file/to/revert

HEAD^дозволяє файлу отримати доступ до його вмісту в попередньому фіксації перед останнім.

Тоді можна git commit --amend, як я спочатку писав нижче.


З Git 2.23 (серпень 2019 року) ви можете використовувати нову git restoreкоманду

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert

коротше:

 git restore -s@^ -S -- path/to/file/to/revert

Знову ж таки, ви можете git commit --amend, як я спочатку писав нижче.


Оригінальна відповідь (січень 2011 р.)

Якщо це ваше останнє зобов’язання (і ви його ніде не натискали), ви можете змінити його:
(спершу сховайте або збережіть b)

 git commit --amend

Потім видаліть b, повторно введіть. Відновіть b і ви закінчите.

--amend

Використовується для зміни кінчика поточної гілки.
Підготуйте об’єкт дерева, який ви хотіли б замінити останньою фіксацією, як зазвичай (це включає звичайні -i / -o та явні шляхи), і редактор журналу комісій закладається повідомленням фіксації з кінця поточної гілки.
Створене вами зобов’язання замінює поточний наконечник - якщо це було злиття, воно матиме батьків поточної підказки як батьків - тому поточна верхня комісія відкидається.


... Then stash/delete b, re-commit.., Тут не повинно слово Thenбути after? - --amendпісля stach / delete b, ...
Xiè Jìléi

@ 谢 继 雷: іншими словами, спочатку збережіть b, потім виконайте --amnd, а потім відновіть? Правда. Я оновив відповідь.
VonC

З потужністю індексу git, сказати комусь сховати / зберегти файл - це просто нерозумно (-1). Видалити його лише з індексу нереально.
Ян Худек

1
@JanHudec Щоправда, відповідь я змінив відповідно. Я не дотримувався такої старої відповіді так само уважно, як це роблю на Stack Overflow. 99% запитань щодо git щодо SU в будь-якому випадку повинні бути перенесені на SO.
VonC

66
  1. git diff --name-only HEAD^ - (необов'язково) використовувати для переліку файлів, які були змінені в останньому комітеті.
  2. git reset HEAD^ path/to/file/to/revert- для скидання індексу до останньої версії, залишаючи робочу копію недоторканою.
  3. git commit --amend- внести зміни до останнього зобов'язання, щоб включити зміни в індексі

9
Імхо, це набагато краща відповідь, ніж прийнята.
mik01aj

1
Зауважте, що вам не слід використовувати git commit -a --amend(тобто не додавати файли) для кроку 3, інакше ви зробите зміни в робочій копії, які є правками, які ви намагаєтеся видалити. Додатковим кроком 2.5 може бути git checkout path/to/file/to/revertтакож очищення робочої копії.
dmnd

1
Крім того, git rm --cached path/to/file/to/revertможна скасувати додавання файлу, не видаляючи його з дерева.
Ян Худек

13

Крім того, якщо ви використовуєте git gui, ви просто вибираєте опцію "Змінити останню фіксацію", доданий файл відображається у списку "Поетапно", клацніть на його значку, щоб перемістити його до списку "Нестандартний" та здійснити фіксацію.


1
@VonC: Редагування та розбиття патчів є досить поширеною операцією для користувачів з великими програмами git, тому gui був розроблений, щоб зробити його простішим та найкращим інструментом IMO для цього.
Ян Худек

Це працює! Я не мав успіху з іншими варіантами для цього конкретного завдання. Дякую за пораду!
Сергузест

10

Якщо ви хочете видалити b з останньої фіксації

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

Якщо ви хочете видалити всі зміни до b в останньому фіксації

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

git rm --cachedі скасуйте резервний та відновлюючий танець (-1).
Ян Худек

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

4

Альтернатива, яка не вимагає індексування хакерів, але, тим не менш, зберігає старе повідомлення про фіксацію:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

Мені це подобається тому, що (а) він використовує команди, які я регулярно використовую, і (б) я можу зробити, git add -pщоб зрозуміти, що саме я хочу зробити.

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