Я недавно использовал git svn branch
для создания ветки (как в Subversion, так и в git).
Я заметил, что (по какой-то причине я не уверен в этом; возможно, ошибка или, возможно, я неправильно создал ветвь?) У git commit для создания ветки есть два родителя: один наверху дерева в то время Я создал ветку (неправильную, так как я разветвился от предыдущей ревизии) и одну в (ожидаемой) предыдущей ревизии.
Этот «второй родитель» вызывает у меня всевозможные страдания, поскольку я сейчас пытаюсь слиться из другой ветви в новую, и представление git об общем предке неверно.
Я нашел этот вопрос , который объясняет, как заставить ветвь git иметь правильного родителя с помощью rebase. Проблема в том, что ребазинг коснулся только моего локального филиала HEAD, а не удаленного, привязанного к репозиторию git-svn Обычно это было бы очень плохо, но поскольку я единственный, кто использует этот репозиторий git-svn, мне все равно: я просто хочу переместить удаленную ветку в скорректированный коммит сейчас.
Итак, мой вопрос: теперь, когда у меня есть родительский элемент для локальной ветки, указывающий на правильный коммит, от которого он разветвлен, есть ли способ для меня переместить удаленную ветку в ту же HEAD, чтобы я мог например) запустить git svn rebase
, не запутавшись? (Боюсь, что если я изменю его вручную, файл .git/refs/remotes/<mybranch>/.rev_map...
больше не будет совпадать с SVN ...?)
Редактировать : Для ответа на вопрос, поставленный в комментарии, да, ветка отмечена. Я собираюсь изменить названия своих веток, чтобы защитить невинных, но давайте представим, что это выглядит так:
$ git branch
* git_mysvnbranch
git_releasebranch
master
$ git branch -r
trunk
mysvnbranch
releasebranch
Теперь, когда я создал ветвь, у mysvnbranch
был родитель обоих стволов и произвольная точка от ствола, от которой я разветвился. Теперь я хочу взять releasebranch
и объединить его с mysvnbranch
, когда я вижу проблему. Если я запускаю gitk
, это выглядит так:
o [git_mysvnbranch] [remotes/mysvnbranch]
|\ <--- bad pointer here
| o [remotes/trunk]
| |
| o
| | o [git_releasebranch] [remotes/releasebranch]
| | |
| o o
| |/
| o
| |
| o
| |
| o
|/
o [arbitrary branch point]
Таким образом, вы можете увидеть проблему, если я хочу слить в [remotes/releasebranch]
. Если я сделаю ребаз, я могу сделать так:
o [git_mysvnbranch]
|
| o [remotes/mysvnbranch]
| |\ <--- bad pointer here
| | o [master] [remotes/trunk]
| | |
| | o
| | | o [git_releasebranch] [remotes/releasebranch]
| | | |
| | o o
| | |/
| | o
| | |
| | o
| | |
| | o
| |/
|/
o [arbitrary branch point]
А теперь я хочу избавиться от версии [remotes/mysvnbranch]
с плохим родителем и указать, куда вместо нее указывает [git_mysvnbranch]
1035 *.
Но вот любопытная вещь, которую я только что узнал: метаданные svn действительно могут быть нетронутыми. Я просто сделал это:
$ git svn rebase -n
Remote Branch: refs/remotes/mysvnbranch
SVN URL: svn://subversionrepo/branches/mysvnbranch
Так что, возможно, я ни о чем не беспокоюсь. Я попробую это еще немного, чтобы попытаться выяснить.
Редактировать 2 : Я ни о чем не беспокоюсь. Как только я попытался git svn rebase
из перебазированной ветки, он попытался повторно объединить изменения, которые уже были объединены с веткой git.