Git: как перебазировать к определенному фиксации?
Я хотел бы перебазировать к конкретному коммиту, а не к главе другой ветви:
A --- B --- C master
-- D topic
до
A --- B --- C master
-- D topic
вместо
A --- B --- C master
-- D topic
как я могу добиться этого?
6 ответов:
вы можете избежать использования параметра --on, сделав временную ветвь на фиксации, которую вы любите, а затем использовать rebase в его простой форме:
git branch temp master^ git checkout topic git rebase temp git branch -d temp
комментарий jsz выше спас меня от тонны боли, поэтому я использую приведенный ниже алгоритм для перебазирования / перемещения любого коммита поверх любого другого коммита с тех пор, как я его нашел:
- найдите предыдущую точку ветвления ветви, которую нужно перебазировать (переместить) - назовите ее старым родителем. В приведенном выше примере это A
- найти фиксацию, поверх которой вы хотите переместить ветку, чтобы - назвать ее новым родителем. В пример это B
- вам нужно чтобы быть на вашей ветке (тот, который вы двигаться):
- применить перебазироваться:
git rebase --onto <new parent> <old parent>
В приведенном выше примере это так:
git checkout topic git rebase --onto B A
я использовал смесь растворов, описанных выше:
$ git branch temp <specific sha1> $ git rebase --onto temp master topic $ git branch -d temp
мне было гораздо легче читать и понимать. Принятое решение привело меня к конфликту слияния (слишком ленив, чтобы исправить вручную):
$ git rebase temp First, rewinding head to replay your work on top of it... Applying: <git comment> Using index info to reconstruct a base tree... M pom.xml .git/rebase-apply/patch:10: trailing whitespace. <some code> .git/rebase-apply/patch:17: trailing whitespace. <some other code> warning: 2 lines add whitespace errors. Falling back to patching base and 3-way merge... Auto-merging pom.xml CONFLICT (content): Merge conflict in pom.xml error: Failed to merge in the changes. Patch failed at 0001 <git comment> The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
есть другой способ сделать это, или если вы хотите вернуться к более чем одной фиксации.
вот пример, чтобы вернуться к
n
количество коммитов:git branch topic master~n
ради этого вопроса, это также можно сделать:
git branch topic master~1
команда отлично работает на
git version 2.7.4
. Не тестировал его на любой другой версии.