Как сгенерировать патч для всех коммитов в ветке?

Как я могу сгенерировать патч для всех коммитов в данной ветке, зная только имя ветки?

Этот шаг является частью сложного рабочего процесса, который полностью автоматизирован. Следовательно, требовать, чтобы кто-то вручную определял первую фиксацию в ветке, не вариант.

Обратите внимание, что все, что зависит от reflog, также не подходит, потому что изменения в ветке не выполняются локально.


person akirekadu    schedule 15.03.2017    source источник
comment
Разве весь смысл git не в том, что не имеет значения, вносятся изменения локально или нет? Пожалуйста, уточните ваше последнее предложение много   -  person Mad Physicist    schedule 15.03.2017
comment
проверьте --fork-point заметки здесь git-scm.com/docs/git-merge- база   -  person akirekadu    schedule 16.03.2017
comment
Обратите внимание, что вы можете указать теги git в командах, поэтому, если ваша автоматизированная система (системы) может автоматически добавлять теги, вы можете создавать различия между этими точками, если хотите.   -  person MikeW    schedule 13.06.2019


Ответы (2)


Если вы знаете, из какой ветки была создана данная ветка, то создать патч легко:

git diff master Branch1 > ../patchfile
git checkout Branch2    
git apply ../patchfile

(и вы можете сгенерировать патч, применимый и без git)

Но найти правильную фиксацию создания ветки может быть сложно: см. Поиск точки ветвления с помощью Git?

Используемый OP akirekadu:

git format-patch $(git merge-base --fork-point master)..branchB 

Вы можете увидеть его использование в git diff между рабочей копией и базой филиала

legends2k добавляет в комментариях:

Можно проверить сгенерированный патч с помощью git apply --stat patchfile
Это неприменимо, но дает подробную информацию о патче.


Предупреждение: AGP примечания в комментариях, что:

Команда $(git merge-base --fork-point master)..branchB может не каждый раз находить правильную корневую ревизию ветки


джозеф указывает в комментариях

Между прочим, Phabricator легко справляется с подобными вещами, автоматически генерируя эти файлы исправлений для каждого нажатия.

person VonC    schedule 15.03.2017
comment
Назовем рассматриваемую ветвь «B». «Исходная» ветвь, из которой был создан B, известна. Однако создание diff по сравнению с ним не даст правильных результатов (т. е. нам нужны все изменения, сделанные только в этой ветке B), потому что в исходной ветке могут быть изменения с момента создания B. - person akirekadu; 16.03.2017
comment
@akirekadu да, именно поэтому я упомянул в ответе stackoverflow.com/q/1527234/6309: поиск < i>текущая точка начала ветки сложна. - person VonC; 16.03.2017
comment
Справедливо. В итоге я выбрал: git format-patch git merge-base --fork-point master..branchB - person akirekadu; 16.03.2017
comment
@akirekadu Хороший вопрос. Я включил ваш комментарий в ответ для большей наглядности и добавил ссылку на опцию точки разветвления. - person VonC; 16.03.2017
comment
Вам понадобится «git format-path» перед добавленной вами командой. т.е. git format-patch `git merge-base --fork-point master`..branchB - person akirekadu; 17.03.2017
comment
Сгенерированный патч можно проверить с помощью git apply --stat patchfile; это не применимо, но дает подробную информацию об исправлении. - person legends2k; 14.05.2020
comment
@legends2k Спасибо. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 14.05.2020
comment
@AGP Не могли бы вы задать отдельный вопрос, иллюстрирующий, как этот ответ не касается вашего использования cse? - person VonC; 15.06.2020
comment
@VonC Не обязательно задавать отдельный вопрос. Можно добавить, что команда $(git merge-base --fork-point master)..branchB может не каждый раз находить правильную корневую ревизию ветки. Этого должно быть достаточно. - person AGP; 22.06.2020
comment
Между прочим, Phabricator легко справляется с подобными вещами, автоматически генерируя эти файлы исправлений для каждого нажатия. - person ijoseph; 30.09.2020
comment
@josef Спасибо. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 30.09.2020

ЕСЛИ вы уже зафиксировали и отправили свои изменения, теперь вы хотите создать файл исправления.

Это создаст патч в 1 файле, даже если у вас есть несколько коммитов в этой ветке.

ШАГ 1. Изучите ветку, исправление которой вы хотите, например, любую ветку функций/ошибок
, например: git checkout <branch>

ШАГ 2: Теперь это создаст патч для всех коммитов, отличающихся от основной ветки с вашей веткой проверки, т. Е. Веткой, указанной выше, у вас есть проверка.

git format-patch master --stdout > mypatch.patch

person shashikant kuswaha    schedule 15.07.2021