Подтвердить что ты не робот

Перезапись и нажатие 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)

Итак, теперь мне нужно удалить удаленную ветку и повторно нажать мои изменения. Это не может быть оптимальным способом сделать это, поэтому мне интересно: "Какой лучший способ переписать ветку и нажать изменения в удаленной ветке?"

4b9b3361

Ответ 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

Ответ 4

Ваш первый бит операций очень странный. Вы делаете копию некоторой детали. Вы переустанавливаете это против хозяина. Затем вы вернетесь к этой функции и объедините ее с восстановленной эквиваленностью. Это не способ сделать что-то.

Не переусердствуйте. Если вы хотите, чтобы ветвь функции запускалась где-то в другом месте (например, последний мастер), просто переустановите ее.

Затем нажмите его с помощью --force (или -f). Скажите кому-либо еще, что использует эту ветку функций, чтобы они могли приносить изменения и корректировать все, что у них было локально, но они еще не нажимали.

Слияние лучше в случае, когда другие работают над ним.

Надеюсь, что это поможет.