Git: как перебазировать к определенному фиксации?


Я хотел бы перебазировать к конкретному коммиту, а не к главе другой ветви:

A --- B --- C          master
 
  -- D                topic

до

A --- B --- C          master
       
        -- D          topic

вместо

A --- B --- C          master
             
              -- D    topic

как я могу добиться этого?

6 92

6 ответов:

вы можете избежать использования параметра --on, сделав временную ветвь на фиксации, которую вы любите, а затем использовать rebase в его простой форме:

git branch temp master^
git checkout topic
git rebase temp
git branch -d temp

вы даже можете взять прямой подход:

git checkout topic
git rebase <commitB>

используйте опцию "на":

git rebase --onto master^ D^ D

комментарий jsz выше спас меня от тонны боли, поэтому я использую приведенный ниже алгоритм для перебазирования / перемещения любого коммита поверх любого другого коммита с тех пор, как я его нашел:

  1. найдите предыдущую точку ветвления ветви, которую нужно перебазировать (переместить) - назовите ее старым родителем. В приведенном выше примере это A
  2. найти фиксацию, поверх которой вы хотите переместить ветку, чтобы - назвать ее новым родителем. В пример это B
  3. вам нужно чтобы быть на вашей ветке (тот, который вы двигаться):
  4. применить перебазироваться: 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. Не тестировал его на любой другой версии.