Могу ли я отменить определенный коммит таким образом, чтобы он оставил то, что он удалял, как неизмененный в файле? - PullRequest
6 голосов
/ 05 марта 2011

Вот сценарий:

-Я сделал много маленьких и больших модификаций в моих файлах и не фиксировал их

-Я решил использовать git commit --interactive и использовать команду patch для создания частей коммитов

-Я пытался оставить все коммиты актуальными, когда я это сделал

- Я обнаружил, что после нескольких коммитов я случайно внес изменение, которое я должен был пропустить в первую очередь 6 коммитов назад, поэтому я отменил этот коммит.

-Отменить удаленный текст, соответствующий в файле, что является ожидаемым поведением.

Последний шаг - это тот, который я хочу изменить. Я хочу отменить коммит, но оставить текст в файле, чтобы я мог заново выполнить коммит. То, как я поступил, это преобразование HEAD в коммит до возврата, а затем я скопировал и вставил текст и изменил его, чтобы он не был в формате diff, поэтому я мог использовать его в файле, а затем зафиксировал должным образом.

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

То, как я это исправил, было утомительно. Есть ли способ просто оставить текст в файле, который будет удален в обратном порядке, как если бы это было неустановленное изменение (вроде как сброс делает)? Какие-нибудь предложения кроме этого?

Ответы [ 4 ]

7 голосов
/ 05 марта 2011

Вы можете запустить возврат дважды, и в последний раз применить --no-commit, что оставит изменения в индексе готовыми к фиксации:

git revert <the commit you want back in the working tree>
git revert HEAD --no-commit

Изменения теперь подготовлены и готовы к новой фиксации,Чтобы отключить запуск:

git reset HEAD
2 голосов
/ 05 марта 2011

После того, как вы запустите git revert BADCOMMIT, вы можете восстановить определенный файл до его состояния перед тем, как зафиксировать:

git checkout HEAD^ -- filename

... который должен обновить вашу рабочую копию filename до ее состояния перед фиксацией возврата. (Старая версия также будет инсценирована, поэтому, если вы хотите удалить ее, выполните git reset HEAD -- filename впоследствии.) Я не думаю, что есть более простой способ сделать это.

0 голосов
/ 05 марта 2011

После того, как вы отменили фиксацию, вы можете применить обратную отмену, чтобы «отменить» ее только в рабочем дереве:

git revert C &&                   # you already did this part
git show HEAD | git apply -R

По умолчанию git apply только исправляет рабочее дерево.У этого также есть опции, чтобы исправить только индекс или и индекс и рабочее дерево.Таким образом, вместо использования git revert, вы могли бы использовать git apply, чтобы применить изменения в обратном порядке только к индексу, а затем зафиксировать (все, даже не касаясь рабочего дерева):

# assumption: we start with no staged changes, and have not reverted anything yet

# revert C directly in the index (does not touch the working tree), then commit
git show C | git apply --cached -R &&
git commit --edit -m'Reverted C'
0 голосов
/ 05 марта 2011
 git reset -p <COMMITHASH>

Это предложит повторно применить патч к вашему индексу.

Помните, что это выберет изменения из коммита, который вы упомянули в индексе, что означает, что он попытается применить (обратно) все предыдущие 6 коммитов к вашему индексу. Вы должны выбрать только те изменения, которые хотите удалить.

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