Перезапись и нажатие Git Ветвь
При слиянии моих изменений с ведущим ведущим я часто обнаружил, что делаю следующее:
git checkout somefeature
git checkout -b integration
git rebase master # resolving conflicts along the way
git checkout somefeature
git merge integration # or rebase, doesn't matter in this example
Я часто обнаруживаю, что объединение ветки интеграции обратно в мою ветку свойств не позволяет выполнить некоторые конфликты. Первый вопрос, который у меня есть, заключается в следующем: "Почему это происходит, если моя ветка интеграции является потомком некоторой функциональности, и я уже разрешил конфликты с ведущим мастером?"
Если вам интересно, почему я использую ветвь интеграции для начала, это предотвратит загрязнение моей текущей ветки с помощью слияния с половиной отказа.
Мое текущее обходное решение заключается в следующем:
git checkout integration
git branch -f somefeature # overwrite the branch
Теперь проблема заключается в том, что я не могу вернуть свои изменения обратно в удаленную ветку:
git push origin somefeature
! [rejected] somefeature -> somefeature (non-fast forward)
Итак, теперь мне нужно удалить удаленную ветку и повторно нажать мои изменения. Это не может быть оптимальным способом сделать это, поэтому мне интересно: "Какой лучший способ переписать ветку и нажать изменения в удаленной ветке?"
Ответы
Ответ 1
Проблема возникает из-за того, что git rebase
генерирует новую серию коммитов, которые не происходят из ветки somefeature
, а затем, когда вы пытаетесь объединить их обратно в somefeature
, разрешение конфликта, выполняемое во время rebase doesn ' t применяются. Если бы вы просто слились вместо rebase, тогда это сработало бы, так как слияние слияния спустилось бы из ветки somefeature
.
С точки зрения нажатия на удаленную ветку вы можете просто использовать --force
, чтобы сделать нажатие успешным, что вызовет проблемы для всех, у кого есть его копия, хотя.
Ответ 2
Вы можете использовать git merge -s recursive -Xtheirs
, который будет автоматически разрешать конфликты в пользу ветки интеграции. Тем не менее, это все еще делает слияние и может плохо работать с файлами, перемещающимися и такими.
Однако, поскольку ваша ветка нажата, у вас есть причина захотеть сохранить свою историю. Чтобы получить идеальное поведение, которое вы хотите, вы можете использовать стратегию "наш" в ветке интеграции.
git checkout somefeature
git checkout -b integration
git rebase master # resolving conflicts along the way
git merge -s ours somefeature # mark integration as superseding the somefeature branch
git checkout somefeature
git merge integration # this is now a fast-forward, no conflicts
Ответ 3
Вы можете убедиться, что ваше окончательное слияние перезаписывает ветку назначения с помощью слияния:
См. "Могу ли я сказать git для перезаписи вместо слияния?".
Идея состоит в том, чтобы иметь настраиваемый драйвер слияния с keepTheir
" script.
Ответ 4
Ваш первый бит операций очень странный. Вы делаете копию некоторой детали. Вы переустанавливаете это против хозяина. Затем вы вернетесь к этой функции и объедините ее с восстановленной эквиваленностью. Это не способ сделать что-то.
Не переусердствуйте. Если вы хотите, чтобы ветвь функции запускалась где-то в другом месте (например, последний мастер), просто переустановите ее.
Затем нажмите его с помощью --force (или -f). Скажите кому-либо еще, что использует эту ветку функций, чтобы они могли приносить изменения и корректировать все, что у них было локально, но они еще не нажимали.
Слияние лучше в случае, когда другие работают над ним.
Надеюсь, что это поможет.