Как вы сквош фиксируется в один патч с помощью git format-patch?
У меня есть восемь коммитов на ветке, которые я бы хотел отправить другим людям, которые еще не просвещены git. До сих пор все, что я делаю, либо дает мне 8 файлов патчей, либо начинает давать мне файлы исправлений для каждой фиксации в истории веток с начала времени. Я использовал git rebase --interactive, чтобы раздавить коммиты, но теперь все, что я пробую, дает мне zillions патчей с начала времени. Что я делаю неправильно?
git format-patch master HEAD # yields zillions of patches, even though there
# only one commit since master
Ответы
Ответ 1
Я бы порекомендовал сделать это на откидной ветке следующим образом. Если ваши коммиты находятся в ветке "новых строк", и вы уже вернулись к своей "основной" ветке, это должно сделать трюк:
[[email protected] example (master)]$ git checkout -b tmpsquash
Switched to a new branch "tmpsquash"
[[email protected] example (tmpsquash)]$ git merge --squash newlines
Updating 4d2de39..b6768b2
Fast forward
Squash commit -- not updating HEAD
test.txt | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
[[email protected] example (tmpsquash)]$ git commit -a -m "My squashed commits"
[tmpsquash]: created 75b0a89: "My squashed commits"
1 files changed, 2 insertions(+), 0 deletions(-)
[[email protected] example (tmpsquash)]$ git format-patch master
0001-My-squashed-commits.patch
Надеюсь, это поможет!
Ответ 2
Просто добавьте еще одно решение в банк:
Если вы используете это вместо:
git format-patch master --stdout > my_new_patch.diff
Тогда все равно будет 8 патчей... но все они будут в одном файле патча и будут применяться как один с:
git am < my_new_patch.diff
Ответ 3
Я всегда использую git diff, поэтому в вашем примере что-то вроде
git diff master > patch.txt
Ответ 4
Как вы уже знаете, git format-patch -8 HEAD
предоставит вам восемь патчей.
Если вы хотите, чтобы ваши 8 коммитов выглядели как единое целое, и не забывайте переписывать историю своей ветки (o-o-X-A-B-C-D-E-F-G-H
), вы можете:
git rebase -i
// squash A, B, C, D, E ,F, G into H
или, и это было бы лучшим решением, воспроизвести все ваши 8 коммитов из X
(фиксация до 8 коммитов) на новой ветке
git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD
Таким образом, у вас есть только одна фиксация на ветке "доставки", и она представляет все ваши последние 8 коммитов
Ответ 5
Это адаптация ответа Адама Александра, если ваши изменения находятся в главной ветке. Это сделает следующее:
- Создает новую ветвь "tmpsquash" из точки, которую мы хотим (ищите ключ SHA, запускаемый "git --log" или с gitg. Выберите фиксацию, которую вы хотите стать tmpsquash, коммиты, которые после что в хозяине будут раздавлены коммиты).
- Слияние изменений с master на tmpsquash.
- Выполняет сжатые изменения в tmpsquash.
- Создает патч с раздавленными коммитами.
- Возврат к ведущей ветке
[email protected]:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38
[email protected]:~/example (master)$ git checkout tmpsquash
Switched to branch 'tmpsquash'
[email protected]:~/example (tmpsquash)$ git merge --squash master
Updating ba3c498..40386b8
Fast-forward
Squash commit -- not updating HEAD
[snip, changed files]
11 files changed, 212 insertions(+), 59 deletions(-)
[email protected]:~/example (tmpsquash)$ git commit -a -m "My squashed commits"
[test2 6127e5c] My squashed commits
11 files changed, 212 insertions(+), 59 deletions(-)
[email protected]:~/example (tmpsquash)$ git format-patch master
0001-My-squashed-commits.patch
[email protected]:~/example (tmpsquash)$ git checkout master
Switched to branch 'master'
[email protected]:~/example (master)$
Ответ 6
Формат-патч между двумя тегами:
git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>
Ответ 7
Самый простой способ - использовать git diff
и добавить git log
, если вы хотите, чтобы комбинированное сообщение коммита выдало метод squash. Например, чтобы создать патч между commit abcd
и 1234
:
git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt
Затем при применении патча:
git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt
Не забывайте аргумент --binary
для git diff
при работе с нетекстовыми файлами, например. изображений или видеороликов.
Ответ 8
Основываясь на Адаме Александре, ответьте:
git checkout newlines
## must be rebased to master
git checkout -b temporary
# squash the commits
git rebase -i master
git format-patch master