#git
#git
Вопрос:
У меня есть это дерево
* commit origin/master
| * commit origin/my-feature-branch
| * commit
| * commit
| * commit
|/
| * commit origin/other-feature-branch
|/
Я хочу сохранить origin/master
, но я хочу раздавить origin/my-feature-branch
и сделать его чистым. Моя «стратегия» такова:
git checkout my-feature-branch
git rebase -i HEAD~4
# ... leave first pick line and change all others in squash
# ... change commit messages into one
git push origin :my-feature-branch
git push origin my-feature-branch
Мое новое дерево теперь чистое.
* commit origin/master
| * commit origin/my-feature-branch
|/
| * commit origin/other-feature-branch
|/
Это правильный способ?
Комментарии:
1. Это изменяет общие коммиты, что почти всегда является плохой идеей для Git. В Интернете есть много статей и много ответов на SO, объясняющих, почему это не рекомендуется.
2. @Chris верно, но есть некоторые случаи, когда пользователи действительно хотят это сделать, иногда даже когда ветка является общей (небольшие команды разработчиков могут организовываться более эффективно для синхронизации с переписанной работой).
3. @Cupcake согласен. Но важно понять, почему это не рекомендуется делать, чтобы сделать это правильно.
Ответ №1:
В принципе, у вас правильная идея, хотя вместо удаления удаленной ветки перед переходом к ней вы можете просто принудительно перейти непосредственно к ней с помощью
git push origin my-feature-branch -f
Единственная причина, по которой вы хотели бы сначала удалить удаленную ветку, — это если принудительное нажатие отключено на удаленном компьютере, поэтому его первое удаление — это способ «обмануть» и обойти это ограничение…хотя, если это ограничение существует, кто-то не должен хотеть, чтобы вы принудительно нажимали, поэтому убедитесь, что переписывание ветки — это то, что действительно устраивает вашу команду.
Обязательное предупреждение о передаче перезаписанных коммитов в общедоступные ветки: если ваша ветка используется совместно с другими разработчиками, принудительная отправка перезаписанных коммитов заставит этих других разработчиков повторно синхронизировать свою работу с новыми коммит, поскольку у всех у них будут копии старых. Это может быть сложным процессом, в зависимости от навыков Git вашей команды, поэтому убедитесь, что ваша команда действительно согласна с тем, что вы это делаете.