Как добавить файл в предыдущий коммит?

86

За последний час или около того я изменил файлы

A
ATest
B
BTest

Чтобы убедиться, что мои сообщения о фиксации совпадают с фактическим изменением, зафиксированным Aс описанием. К сожалению, я не включился ATestв этот коммит.

Между тем, до сих пор не совершены Bи BTest.

Как лучше всего действовать на этом этапе? Я бы тоже хотел:

  1. Отменить предыдущую фиксацию, не затрагивая мои текущие незафиксированные файлы?
  2. Добавить еще один файл с тем же описанием в предыдущий коммит?
Джеймс Райцев
источник
Я думаю, что 2 должно быть нормальным способом. В чем проблема?
Адриан Шум

Ответы:

145

Чтобы добавить новый файл к предыдущей фиксации:

$ git add new-file
$ git commit --amend

Вы можете использовать, git commit --amend --no-editесли не хотите изменять сообщение фиксации.

Уильям Перселл
источник
3
Спасибо. Из любопытства, если бы sha1 коммита был известен и коммит не был «последним», как можно было бы изменить этот коммит?
Джеймс Райцев
6
@Jam Я бы сказал, очень постарайтесь не делать этого ;-) Но если вы должны, один из способов (не уверен, что он лучший) - это зафиксировать новый файл как его собственный коммит, а затем использовать git rebase -iдля изменения порядка коммитов и слияния коммит нового файла с другим коммитом. Это может быть материалом для отдельного вопроса.
David Z
3
Когда вы делаете, git rebase -iкак предлагает @DavidZ, все, что вам нужно сделать, это переместить новый коммит чуть ниже того, с которым вы хотите его объединить, и изменить слово нового коммита на squashвместоpick
MM
Что, если я поставил много файлов, но хочу добавить только один в измененный коммит?
dfrankow
Деактивируйте все подготовленные файлы (например, git reset), затем подготовьте тот, который вы хотите добавить, измените фиксацию, затем снова выполните этапирование всех файлов.
Уильям Перселл,
54

Вот забавная блок-схема 1, которая также на удивление удобна: она дает правильные рекомендации как для исходного вопроса, так и для измененного «Что, если бы это была не последняя фиксация?» вопрос.

Git-симпатичная блок-схема

1 Взято с http://justinhileman.info/article/git-pretty/

сплав
источник
13

Добавить файл в предыдущую фиксацию

Если вы уже запустили ветку, над которой работаете, сначала просмотрите справочные страницы . В частности, обратите внимание:

Перебазирование (или любая другая форма переписывания) ветки, над которой работают другие, - плохая идея: любой, кто находится ниже по течению, вынужден вручную исправлять свою историю.

Однако, если вы не толкнули ветку, приготовьтесь войти в опасную зону .

Найдите хеш фиксации

Во-первых, вам нужно знать хэш коммита, который вы хотите добавить. Об этом свидетельствует git log. На самом деле вы хотите указать фиксацию до той, которую вы хотите добавить. (Вы можете рассматривать его как начальный индекс части коммитов, которые вы хотите изменить.) Вы можете убедиться, что у вас есть правильный коммит, запустив git log -1 HEAD~n. Где n - целое число, которое вы увеличиваете, пока не получите правильную фиксацию. Или вы могли посчитать, нет, правда.

Но, если вы считаете, по крайней мере, подтвердите, что у вас есть правильная фиксация git log -1 HEAD~5или что бы там ни было. Вы НЕ должны видеть коммит, который хотите добавить.

ОПАСНО , хе

Теперь вы готовы к бегу git rebase -i HEAD~5. Или какой у вас хеш фиксации. Откроется ваш любимый текстовый редактор и файл для редактирования. Этот файл представляет собой список дел для команды rebase. Комментарии в файле расскажут, какие у вас есть варианты. Просто найдите строку с коммитом, к которому вы хотите добавить, и в этой строке измените «выбрать» на «редактировать». Теперь сохраните и закройте файл.

Перебазирование остановится, как только достигнет фиксации, которую вы сказали ему отредактировать. Запустите, git statusчтобы увидеть дополнительную информацию, которую он предоставляет. Подготовьте ваши файлы для добавления в коммит git add .или с другими именами файлов.

Тогда сделай git commit --amend. Это изменит коммит, который вы выбрали для редактирования.

Наконец, беги git rebase --continue.

В случае сомнений, в Linux вы можете узнать больше, прочитав документацию, выводимую man git-rebaseили git --help rebase.

BaseZen
источник
3
По поводу "найти хеш фиксации". Не нужно начинать считать. Просто используйте, git logчтобы найти свой коммит и скопировать его хэш, а затем используйте git rebase -i hash^для перебазирования на коммит, предшествующий вашему .
Виктор