Git заявляет, что ветвь не сливается после перезагрузки - почему?
Я использую git -svn для управления ветвями bugfix, но он говорит мне, что у меня есть несвязанные изменения, хотя, если я просмотрю SVN-репо напрямую, я вижу, что они тоже были совершены. Это похоже на перезагрузку исправления ошибок, не устанавливая ветвь как объединенную.
Что я делаю неправильно, здесь?
git checkout -b fix_bug_1234
git add .
git commit -m "first change"
git add .
git commit -m "second change"
git rebase -i HEAD~2 // squash the two changes together
git svn rebase // fetch any changes from svn
git checkout master
git rebase fix_bug_1234
git svn dcommit
git branch -d fix_bug_1234
error: The branch 'fix_bug_1234' is not fully merged.
Ответы
Ответ 1
Причиной этого является то, что git rebase
изменяет объекты фиксации. Таким образом, хотя фактический контент (или diff) совпадает с теми переустановленными коммитами, они относятся к другому родителю и, как таковые, различны.
Таким образом, git branch -d
не может проверить, что изменения этих коммитов включены в некоторые другие коммиты. Для принудительного удаления необходимо использовать git branch -d
(верхний регистр D
).
На стороне примечание: git svn dcommit
имеет тот же эффект, что и перезагрузка. Поскольку dcommit
толкает коммиты на сервер SVN, он впоследствии получает коммиты с сервера SVN снова. Таким образом, вы оказываетесь в разных объектах, чем те, которые вы нажали. Хотя они могут быть идентичными по содержанию (если у вас не были конфликты), они по-прежнему различаются (основная причина в том, что git svn
добавляет строку в сообщение фиксации, в котором указывается версия SVN, к которой принадлежит фиксация).
Ответ 2
Вот как я делаю такие вещи, и это работает. Ответ от пользователя poke объясняет, почему git rebase не делает то, что вы хотите.
git rebase -i HEAD~2 // squash the two changes together
git svn rebase // fetch any changes from svn
git svn dcommit // you can commit to SVN from any branch
git checkout master
git svn rebase
git branch -d fix_bug_1234