У нас есть несколько филиалов, и я хочу убедиться, что не наделал глупостей.
В ветке 1 есть: фиксация A + фиксация B
В ветви 2 есть: фиксация A + фиксация C (работа продолжается с фиксации A) + фиксация D
Ветка 3 - это новая ветка
Филиал 4 (главный)
Мне нужно объединить фиксацию A и часть фиксации C в основную ветку, поскольку были задержки с работой, связанной с фиксацией D, поэтому теперь мой клиент хочет, чтобы функция из фиксации C была выпущена по отдельному графику от фиксации D.
Я подумал о создании запроса на перенос для ветки 3 с выделением для фиксации A и фиксации C. Однако я не могу этого сделать, потому что фиксация C включает ремастер, некоторые исправления конфликтов слияния и соответствующий дополнительный код.
Questinos:
Мне нужно использовать ветвь 3 для создания слияния, чтобы освободить запрос на перенос, и мне не разрешено касаться ветки 1. Над этим работает отдельная группа.
I need to merge commit A and part of commit C
Коммиты - это основная единица git. Вы не можете ничего сделать с «частью» коммита, включая слияние. Вам нужно будет отредактировать свою историю, чтобы разбить коммит C на более мелкие части, чтобы вы могли выбирать, что идет в других ветках. Вы разделите сgit rebase -i
а затем в основном отмените фиксацию C и создайте новые коммиты C1, C2 и т. д. с меньшими частями, которые вы хотите.
В будущем я предлагаю вам создать новую ветку для каждой функции. Вы можете создавать небольшие коммиты в этой ветке по мере работы над этой функцией. Я предлагаю делать небольшие сплоченные коммиты во время работы. Затем, когда функция будет завершена, объедините ее сmaster
или какое-то другое «стволовое» ответвление. Не следует просто фиксировать всю большую функцию как одну фиксацию.
If I just copy and paste the relevant code and make a PR into Branch 3 will I have issues later on when Branch 1, Branch 2, and Branch 3 are all eventually merged into master?
Если вы скопируете / вставите код в одно и то же место в файле, то, скорее всего, в будущих слияниях будут конфликты. Их должно быть довольно легко разрешить, если нет других изменений в этих строках ни на одной из веток.
Вот мой совет:
feature_commit_c
вmaster
(похоже, этоbranch 3
)feature_commit_c
чтобы сделать свой первый коммит в этой ветке.master
master
Это должно быть самое чистое. Я всегда начинаю новые ветки с того места, где они будут снова сливаться, и слияние сбоку с других веток, если мне нужны их существующие изменения. Таким образом можно избежать некоторых проблем и гораздо точнее показать ваши намерения, но эта часть остается на ваше усмотрение.
Git просто смотрит на текст, он не знает, откуда он взялся. Если он такой же, то разница не покажет. Итак, как вы управляете внесением частичных изменений из C (прикрепляете ли вы их к A с помощью копирования / вставки или выборочного сброса файлов из фиксации C), зависит от вас.
После того, как вы объедините A и завершите свои частичные изменения C, разница между ветвью acd и вашей новой ветвью должна быть только остальной частью C и всем D.
У вас всегда могут быть конфликты с мастером, это только часть сделки. Но это должно происходить только в двоичных файлах, которые меняются, или комбинациях файлов / строк, которые меняются в обеих ветвях, после игнорирования общих вещей (из базового коммита + всего, что было выбрано полностью).