Как добавить измененный файл в более старое (не последнее) commit в Git
Я изменил несколько вещей за последний час и совершил их шаг за шагом, но я просто понял, что забыл добавить измененный файл, который компилируется ранее.
Журнал выглядит следующим образом:
GIT TidyUpRequests u:1 d:0> git log
commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce
Author: David Klein <>
Date: Tue Apr 27 09:43:55 2010 +0200
The Main program now tests both Webservices at once
commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463
Author: David Klein <>
Date: Tue Apr 27 09:43:27 2010 +0200
ISBNDBQueryHandler now uses the XPath functions from XPath.fs too
commit 06a504e277fd98d97eed4dad22dfa5933d81451f
Author: David Klein <>
Date: Tue Apr 27 09:30:34 2010 +0200
AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs
commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here
Author: David Klein <>
Date: Tue Apr 27 09:29:53 2010 +0200
Factored out some common XPath Operations
Любые идеи?
Ответы
Ответ 1
Используйте git rebase
. В частности:
- Используйте
git stash
для хранения изменений, которые вы хотите добавить. - Используйте
git rebase -i HEAD~10
(или сколько git rebase -i HEAD~10
вы хотите увидеть). - Отметьте соответствующий коммит (
a0865...
) для редактирования, изменив pick
слов в начале строки на edit
. Не удаляйте другие строки, так как это приведет к удалению коммитов. [^ Vimnote] - Сохраните файл rebase, и git вернется в оболочку и будет ждать, пока вы исправите этот коммит.
- Вставьте тайник с помощью
git stash pop
- Добавьте ваш файл с помощью
git add <file>
. - Исправьте коммит с помощью
git commit --amend --no-edit
. - Сделайте
git rebase --continue
который перезапишет остальные ваши коммиты против нового. - Повторите, начиная с шага 2, если вы отметили более одного коммита для редактирования.
[^ vimnote]: Если вы используете vim
вам придется нажать клавишу Insert для редактирования, затем Esc и ввести :wq
для сохранения и применения. Кроме того, вы можете настроить удобный редактор git commit с помощью git config --global core.editor "nano"
.
Ответ 2
Чтобы "исправить" старый коммит с небольшим изменением, не изменяя сообщение коммита старого коммита, где OLDCOMMIT
что-то вроде 091b73a
:
git add <my fixed files>
git commit --fixup=OLDCOMMIT
git rebase --interactive --autosquash OLDCOMMIT^
Вы также можете использовать git commit --squash=OLDCOMMIT
чтобы отредактировать старое сообщение о фиксации во время перебазирования.
-
git rebase --interactive
вызовет текстовый редактор (который можно настроить), чтобы подтвердить (или отредактировать) последовательность команд rebase. В файле есть информация об изменениях инструкции rebase; просто сохраните и выйдите из редактора ( :wq
in vim
), чтобы продолжить ребазинг. -
--autosquash
автоматически помещает любые --fixup=OLDCOMMIT
в нужном порядке. Обратите внимание, что --autosquash
действителен только при --interactive
опции --interactive
. -
^
В OLDCOMMIT^
означает, что это ссылка на коммит перед OLDCOMMIT
.
Вышеуказанные шаги полезны для проверки и/или изменения последовательности команд rebase, но также можно пропустить/автоматизировать интерактивный текстовый редактор rebase с помощью:
Смотрите git commit и git rebase. Как всегда, при переписывании истории git вы должны фиксировать или фиксировать коммиты, которые вы еще никому не публиковали (включая случайных пользователей интернета и серверы сборки).
Ответ 3
с git 1.7, существует очень простой способ с помощью git rebase
:
выполните следующие действия:
git add $files
создать новое сообщение фиксации и повторного использования фиксации вашего "сломанного" фиксации
git commit -c master~4
prepend fixup!
в строке темы (или squash!
, если вы хотите отредактировать фиксацию (сообщение)):
fixup! Factored out some common XPath Operations
используйте git rebase -i --autosquash
для фиксации вашей фиксации
Ответ 4
Вы можете попробовать сеанс rebase --interactive
, чтобы внести изменения в свой старый фиксатор (при условии вы уже не нажимали те, что совершают на другое репо).
Иногда вещь, зафиксированная в b.2. не может быть изменен до не совсем совершенного фиксации, который он исправляет, , поскольку этот фиксатор глубоко запечатлен в серии исправлений.
Это именно то, для чего нужна интерактивная переадресация: используйте ее после множества "а" и "б", перестраивая и редактируя коммиты, и раздавливая несколько коммитов в один.
Запустите его с последней фиксацией, которую вы хотите сохранить как есть:
git rebase -i <after-this-commit>
Редактор будет запущен со всеми коммитами в вашей текущей ветке (без учета коммитов), которые приходят после данного коммита.
Вы можете переупорядочить коммиты в этом списке в своем сердечном содержимом, и вы можете удалить их. Список выглядит примерно так:
pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...
Описание oneline - это исключительно для вашего удовольствия; git rebase не будет смотреть на них, но на имена фиксации ( "deadbee" и "fa1afe1" в этом примере), поэтому не удаляйте и не редактируйте имена.
Заменив команду "pick" командой "edit", вы можете сообщить git rebase, чтобы остановить после применения этой фиксации, чтобы вы могли редактировать файлы и/или сообщение фиксации, изменить совершить и продолжить перезагрузку.