Как удалить файл из последнего коммита, но сохранить локальные изменения? - PullRequest
2 голосов
/ 21 февраля 2020

Я отредактировал два файла. Я хотел зафиксировать оба файла по отдельности. Я случайно сделал:

git add file_one
git commit -am 'Change something in file_one'

Флаг -a также зафиксировал мои изменения в file_two, чего я не хотел.

Как мне отменить это?

То, к чему я стремился с самого начала, было:

git add file_one
git commit -m 'Change something in file_one'
git add file_two
git commit -m 'Change file_two'

Я пытался

git reset --soft HEAD^ -- file_two

, но программный сброс, очевидно, не работает с путями, и я также попробовал (rip)

git checkout HEAD~ -- file_two
git commit --amend

но теперь я просто полностью удалил все изменения в file_two .... досадно. Я задаю вопрос, чтобы больше не повторять такую ​​ошибку.

Ответы [ 3 ]

4 голосов
/ 22 февраля 2020

РЕДАКТИРОВАТЬ: я изначально неправильно понял вопрос, поэтому этот ответ изначально предложил удалить file_2 из дерева подготовки. Как отметил в комментариях Энрико, это не то, что вам нужно, если file_2 не является новым.

Вы можете восстановить поэтапную версию file_2 до состояния предварительной фиксации с помощью :

git reset HEAD^ -- file_two

Вам нужен смешанный сброс, потому что вы хотите повлиять на промежуточное дерево.

Затем вы можете изменить свой последний коммит с помощью:

git commit --amend

Ваша работа дерево не будет затронуто.

2 голосов
/ 22 февраля 2020

Редактировать

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

Оригинальный ответ

Операция прошла очень хорошо, репо

mkdir testdir
cd testdir/
git init
echo 'historical content of file_one' > file_one
echo 'historical content of file_two' > file_two
git add file_one file_two
git commit -m 'this is the most recent commit the OP is happy with'

Затем ОП приступил к редактированию обоих файлов с намерением зафиксировать их в двух отдельных коммитах,

echo 'one more line to file_one' >> file_one
echo 'one more line to file_two' >> file_two

, однако ОП допустил ошибку, зафиксировав оба файла:

git commit -am 'this commit was meant to be only for file_one'

На этом этапе я будет делать следующее:

git reset HEAD~

, который, по сути, возвращается к git add file_one file_two, а затем я ставлю file_one и фиксирую его, используя старое сообщение, а затем file_two и фиксирую тоже:

git add file_one
git commit --reuse-message=HEAD@{1}
git add file_two
git commit -m 'Committing only changes to file_two
0 голосов
/ 22 февраля 2020

Вы можете просто отменить последний коммит, а затем вы можете зафиксировать оба файла отдельно в 2 разных коммитах. Вам нужно было просто выполнить программный / жесткий сброс, чтобы удалить весь последний коммит из git
аппаратный сброс - git reset --hard HEAD^ - не сохранить отмененные изменения
программный сброс - git reset --soft HEAD^ - сохранить сохраненные изменения локально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...