Как добавить измененный файл в более старый (не последний) коммит в Git - PullRequest
357 голосов
/ 27 апреля 2010

Я изменил несколько вещей за последний час и сделал их шаг за шагом, но я только что понял, что забыл добавить измененный файл несколько коммитов назад.

Журнал выглядит так:

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

Есть идеи?

Ответы [ 4 ]

528 голосов
/ 27 апреля 2010

Использование git rebase. В частности:

  1. Используйте git stash для хранения изменений, которые вы хотите добавить.
  2. Используйте git rebase -i HEAD~10 (или сколько коммитов вы хотите увидеть).
  3. Пометьте рассматриваемый коммит (a0865...) для редактирования, изменив слово pick в начале строки на edit. Не удаляйте другие строки, так как это приведет к удалению коммитов. [^ Vimnote]
  4. Сохраните файл rebase, и git вернется в оболочку и будет ждать, пока вы исправите этот коммит.
  5. Суньте сундук с помощью git stash pop
  6. Добавьте ваш файл с git add <file>.
  7. Изменить коммит с помощью git commit --amend --no-edit.
  8. Сделайте git rebase --continue, который перезапишет остальные ваши коммиты против нового.
  9. Повторите, начиная с шага 2, если вы отметили более одного коммита для редактирования.

[^ vimnote]: если вы используете vim, вам придется нажать клавишу Insert для редактирования, затем Esc и ввести :wq, чтобы сохранить файл, выйдите из редактора и примените изменения. Кроме того, вы можете настроить удобный редактор git commit с помощью git config --global core.editor "nano".

248 голосов
/ 31 декабря 2014

Чтобы "исправить" старый коммит с небольшим изменением, не изменяя сообщение о коммите старого коммита, где OLDCOMMIT - это что-то вроде 091b73a:

git add <my fixed files>
git commit --fixup=OLDCOMMIT
git rebase --interactive --autosquash OLDCOMMIT^

Вы также можете использовать git commit --squash=OLDCOMMIT для редактирования старого сообщения о фиксации во время ребазинга.


  • git rebase --interactive вызовет текстовый редактор (который можно настроить ) для подтверждения (или редактирования) последовательности команд rebase . В файле есть информация для инструкции по перебазированию изменений; * сохраните и выйдите из редактора (:wq в vim), чтобы продолжить перебазирование.
  • --autosquash автоматически помещает любые --fixup=OLDCOMMIT коммиты в нужном порядке. Обратите внимание, что --autosquash действует только при использовании опции --interactive.
  • ^ в OLDCOMMIT^ означает, что это ссылка на коммит непосредственно перед OLDCOMMIT.

Вышеприведенные шаги полезны для проверки и / или изменения последовательности команд rebase , но также можно пропустить / автоматизировать интерактивный текстовый редактор rebase с помощью:

См. git commit и git rebase . Как всегда, когда переписывает историю git , вы должны только фиксировать или фиксировать коммиты, которые вы еще никому не публиковали (включая случайных пользователей Интернета и серверы сборки).

57 голосов
/ 27 апреля 2010

с 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, чтобы исправить ваш коммит

8 голосов
/ 27 апреля 2010

Вы можете попробовать сеанс rebase --interactive, чтобы изменить свой старый коммит (при условии , что вы еще не отправили эти коммиты в другое репо).

Иногда вещь исправлена ​​в п.2.не может быть изменено не совсем совершенным коммитом, который он исправляет, , потому что этот коммит глубоко скрыт в серии патчей .
Это именно то, для чего предназначен интерактивный перебаз: используйте его после большого количества "a"s и "b" s, переставляя и редактируя коммиты и объединяя несколько коммитов в один.

Начните его с последнего коммита, который вы хотите сохранить как есть:

git rebase -i <after-this-commit>

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

pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...

Онлайновые описания предназначены исключительно для вашего удовольствия;git rebase будет смотреть не на них, а на имена коммитов («deadbee» и «fa1afe1» в этом примере), поэтому не удаляйте и не редактируйте имена.

Заменив команду «pick»с помощью команды «edit» вы можете указать git rebase прекратить работу после применения этого коммита, чтобы вы могли редактировать файлы и / или сообщение о коммите, изменять коммит и продолжать перебазировать .

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