Восстановление удаленных веток в Git

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

remote:
  master

local:
  master
  feature

Я могу успешно оттолкнуть свою ветку функций обратно на пульт и в итоге получить то, что ожидаю:

remote:
  master
  feature

local:
  master
  feature

Затем я повторно настрою ветку для отслеживания пульта:

remote:
  master
  feature

local:
  master
  feature -> origin/feature

И все хорошо. То, что я хотел бы сделать здесь, - это переустановить ветвь функции на главную ветку на удаленном компьютере, но я хотел бы сделать это с моей локальной машины. Я хотел бы иметь возможность:

git checkout master
git pull
git checkout feature
git rebase master
git push origin feature

Чтобы сохранить удаленную ветвь удаленной службы с удаленным мастером. Однако этот метод вызывает Git жалобы:

To <remote>
 ! [rejected]        feature -> feature (non-fast-forward)
error: failed to push some refs to '<remote>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

git pull делает трюк, но вызывает слияние, которое я бы хотел избежать. Я обеспокоен тем, что сообщение содержит feature -> feature, а не feature -> origin/feature, но это может быть просто презентационная вещь.

Я что-то упускаю, или об этом совершенно не так? Это не критично, чтобы не выполнять переадресацию на удаленном сервере, но он значительно затрудняет фиксацию любых конфликтов слияния с rebase.

Ответ 1

Все зависит от того, используется ли эта функция одним человеком или другие работают от нее.

Вы можете принудительно нажать на кнопку после rebase, если она только вы:

git push origin feature -f

Однако, если другие работают над этим, вы должны объединиться, а не переустанавливать мастер.

git merge master
git push origin feature

Это гарантирует, что у вас есть общая история с людьми, с которыми вы сотрудничаете.

На другом уровне вы не должны делать back-merges. То, что вы делаете, - это загрязнение вашей истории веток функций другими коммитами, которые не относятся к этой функции, что затрудняет последующую работу с этой ветвью - перезагрузка или нет.

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

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

Ответ 2

Приятно, что вы подняли этот вопрос.

Это важная вещь/концепция в git, которую пользователи из git могли бы получить от знания. git rebase - очень мощный инструмент и позволяет вам сквозировать, комментировать, удалять коммиты и т.д. Но как и с любым мощным инструментом, вам в основном нужно знать, что вы делаете, или какое-то дерьмо будет поражать вентилятор:)

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

Вот почему важно помнить, что после того, как вы нажали на фиксации, вы не должны переустанавливать их позже. Причина, по которой это важно, заключается в том, что другие люди могут использовать ваши обязательства и основывать свою работу на ваших вкладах в базу кода, и если позже вы решите перенести этот контент из одного места в другое (переустановите его) и нажмите на эти изменения, то у других людей появятся проблемы и придется переустановить их код. Теперь представьте, что у вас 1000 разработчиков:) Это просто вызывает много ненужных переделок.

Ответ 3

Поскольку вы пересоздали feature поверх нового master, ваш локальный feature не является быстрой перемоткой вперед origin/feature. Поэтому, я думаю, в этом случае отлично, чтобы переопределить проверку быстрой пересылки, выполнив git push origin +feature. Вы также можете указать это в своей конфигурации

git config remote.origin.push +refs/heads/feature:refs/heads/feature

Если другие люди работают поверх origin/feature, они будут нарушены этим принудительным обновлением. Вы можете избежать этого, объединив в новый master в feature вместо перезагрузки. Результат действительно будет быстрой перемоткой вперед.

Ответ 4

Вы можете отключить проверку (если вы действительно уверены, что знаете, что делаете), используя параметр --force для git push.