Как выполнить git rebase, используя хэш вместо имени ветки?

Я использую git rebase --onto target source foo для перемещения ветки foo из ветки source в ветку target. Знаете ли вы, можно ли использовать хеш-значения вместо имен веток (если они не указаны), например: git rebase --onto ab91c f4242 foo?
В качестве обходного пути я временно добавил имена веток в соответствующие объекты фиксации. Но это может быть питой, если у вас есть много веток для перебазирования.

Пример ситуации:

° bb42a
° ab91c
° 979c2
          /° fb648 foo
° f4242 --
° 333c9

После git rebase --onto ...

° bb42a
          /° fb648 foo
° ab91c --
° 979c2
° f4242
° 333c9

Предыстория:
Объясняемая проблема очень распространена, если вы используете svn-сервер в качестве удаленного репозитория. Все объекты, которые вы фиксируете, перезаписываются, так как svn-id будет добавляться каждый раз, когда вы git svn dcommit в svn-репозиторий. Это отсоединит все остальные ветки от их прежнего мастера.


person JJD    schedule 29.06.2011    source источник
comment
Какое сообщение об ошибке вы получили, когда пытались использовать хеш-значения? На справочной странице git rebase упоминается, что это может быть любая допустимая фиксация, а не только существующее имя ветки.   -  person VonC    schedule 29.06.2011
comment
Я пробовал это только в сценарии svn. Я только что попробовал это с локальным репозиторием git. Оно работает. Завтра попробую с svn. Было сообщение об ошибке, например, индексный объект не найден, но я должен воспроизвести его, чтобы точно указать сообщение.   -  person JJD    schedule 29.06.2011
comment
хорошо, тогда я проверю завтра ;) Обратите внимание, что git svn rebase сильно отличается от git rebase.   -  person VonC    schedule 29.06.2011


Ответы (1)


Что точно:

  • git rebase (не git-svn rebase) может принимать любую допустимую фиксацию в качестве аргумента, поэтому хэш-значения будут работать.
  • Раздел предостережения в git-svn предупреждает вас о:

избегайте всех операций git clone/pull/merge/push между репозиториями и ветками git.
Рекомендуемый метод обмена кодом между ветками git и пользователями — git format-patch и git am, или просто "dcommit" в репозиторий SVN.

Таким образом, вы должны быть уверены, что не вводите коммиты в SVN-синхронизированную ветку, которая не знает об этом коммите и сообщает об этом.
(у вас есть противоположный случай в вопросе SQ "git svn - <file> не найден в фиксации <hash>")

person VonC    schedule 29.06.2011
comment
Наверное, вчера я сделал что-то не так. Git rebase с хэш-значениями работает. Все равно спасибо. - person JJD; 30.06.2011
comment
@JJD: отлично. Всегда полезно, как только появится какое-либо сообщение об ошибке, скопировать как команду, так и сообщение об ошибке в какой-нибудь текст временного файла. Это может пригодиться в таком вопросе ;) - person VonC; 30.06.2011