2015-02-28 3 views
1

enter image description hereмерзавец перебазироваться с помощью --onto

Выше мое дерево и вот код, который я использовал, чтобы создать его, хотя я бы сказал, что код незначителен на мой вопрос, но только в том случае, если вы хочу попробовать, вот и все.

http://pastebin.com/gdy0cPb8

В настоящее время я проверил на master и выполнить git rebase --onto <any commit> master. Это перемещает указатель мастера на <any commit>. Например, git rebase --onto client master перемещает указатель мастера на C4, но не производит никаких других изменений.

Я предположил, что это будет поведение по умолчанию, потому что master является [upstream] для сравнения с и поскольку это та же ветка, я понимаю, что master только что переехал туда. [Reference git-scm.org]

Однако, то же самое происходит даже тогда, когда я исполняю git rebase --onto m2 master (без первого перемещения мастера C4), указатель только что переехал в C9

Я просто хочу знать, почему это происходит?

+0

, что вы ожидали случиться? –

+0

Я ожидаю, что 'C8' будет применен поверх' C9', я понимаю, что есть другие способы сделать это, но я хочу знать, почему указанная команда не делает этого – Lordbalmon

ответ

3

Это то, что происходит, когда вы запускаете git rebase --onto m2 master:

  1. Git идентифицирует все коммиты, которые находятся в текущей ветви, но не в <upstream>. В этом случае ваш восходящий поток является мастером, таким же, как и текущая ветка, поэтому никаких коммитов не существует.
  2. Git эффективно делает git reset --hard <newbase>. Newbase - это фиксация, указанная с --onto, в данном случае m2. Это перемещает ведущую ветвь до m2.
  3. Git повторяет коммиты, найденные в шаге 1. Поскольку в этом случае их нет, переполнение завершено.

Единственное, что произошло в этом процессе, это то, что ваша главная ветвь была перенесена на C9.

Похоже, что вы хотите переместить ведущую ветвь (включая C8) поверх C9. Для этого вы можете просто проверить мастер, а затем запустить git rebase m2. Позволяет снова выполнить этот процесс.

  1. Git считает, что совершает капитальный ремонт, но не в м2. Существует один фиксатор, C8. Git сохраняет это позже.
  2. Git. git reset --hard <newbase>. Поскольку мы не указали --onto, это значение по умолчанию равно <upstream>, которое составляет m2. Таким образом, мастер переходит в m2.
  3. Git повторно применяет фиксацию с шага 1. C8 будет снова применен сверху C9.

Вы в конечном итоге с

... C7 - C9 - C8' master m2 

Обратите внимание, я написал C8' вместо C8. Это связано с тем, что у C8 теперь будет новый хеш фиксации.

Ради аргумента, позволяет сказать, что вы хотите следующий график:

 C8' master 
    /
C4 - C5 - C6 - C7 - C9 m2 

Вы можете выполнить это, проверяя мастер и работает git rebase --onto C5 C7. Теперь это происходит:

  1. Git считает, что совершает капитан, но не в вашем восходящем направлении C7. Он находит C8.
  2. Git сбрасывает в <newbase>: git reset --hard C5
  3. Повторно совершает с шага 1. (C8)
+0

Привет .. это имеет смысл. Спасибо, не могли бы вы изменить m9 на C9. – Lordbalmon

+0

И в вашем последнем примере, если я изменил команду rebase на 'git rebase -onto C5 C5' или' git rebase -onto C5 C6', я бы получил тот же результат, если я исправлю – Lordbalmon

+1

Нет, все коммиты после ваш восходящий поток будет воспроизводиться поверх C5. Таким образом, 'git rebase --onto C5 C6' приведет к' C4 - C5 - C6 - C7 '- C8'' в master. Ветвь m2 все равно будет 'C4 - C5 - C6 - C7 - C9'. Обратите внимание, что C7 теперь дублируется. Если вы указали C5 как ваш восходящий поток, вы также продублируете фиксацию C6. –

1

git rebase --onto X Y сольется совершающий послеY до текущей ветви РУКОВОДИТЕЛЯ на X и переместить текущую ветвь ГОЛОВУ. не

Если текущая ветвь фактически Y, то есть не совершать послеY двигаться.
Y HEAD будет просто перемещен в X.

Это то, что происходит с git rebase --onto m2 master

Что бы применять C8-C9 будет:

git checkout master 
git rebase --onto m2 C7 

Или, проще:

git checkout master 
git rebase m2 

Нет необходимости --onto здесь: Вы не перебазирования master ветвь сверху m2. Это применимо к C8 сверху C9.

Смежные вопросы