Я изменил два файла a
, b
в последнем коммите. Но файл b
не должен передаваться, каков рабочий процесс, чтобы исправить это?
5 ответов
Обновление (пару лет спустя)
Удалить его из индекса просто.
Верно: вы можете легко восстановить файл до его индексного содержания, как предлагает более поздний ответ (написанный Мэттом Коннолли):
git reset HEAD^ path/to/file/to/revert
HEAD^
позволяет файлу получить доступ к его содержимому в предыдущем коммите перед последним.
Затем вы можете git commit --amend
, как я изначально писал ниже.
Оригинальный ответ (январь 2011 г.)
Если это ваш последний коммит (и вы его нигде не нажимали), вы можете изменить его:
(первый тайник или сохранить b
)
git commit --amend
Затем удалите b, повторите коммит. Восстановите б, и все готово.
--amend
Используется для изменения кончика текущей ветки.
Подготовьте объект дерева, который вы бы хотели заменить последним коммитом, как обычно (это включает в себя обычный -i/-o и явные пути), и редактор журнала коммитов будет заполнен сообщением коммита из кончика текущей ветви.
Созданный вами коммит заменяет текущий совет - если это было слияние, родители текущего совета будут иметь родителей, поэтому текущий верхний коммит отбрасывается.
git diff --name-only HEAD^
- (необязательно) используется для вывода списка файлов, которые были изменены во время последнего коммита.git reset HEAD^ path/to/file/to/revert
- сбросить индекс до последней версии, оставив рабочую копию нетронутой.git commit --amend
- изменить последний коммит, чтобы включить изменения индекса
В качестве альтернативы, если вы используете git gui
, вы просто выбираете опцию "Amend last commit", добавленный файл появляется в списке "Staged", нажимаете на его иконку, чтобы переместить его в список "Unstaged" и делаете коммит.
Если вы хотите удалить 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 reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}
Мне это нравится, потому что (а) он использует команды, которые я регулярно использую, и (б) я могу сделать git add -p
чтобы выяснить, что именно я хочу зафиксировать.