如何从重新建立分支的分支中重新建立分支?

How to rebase a branch off a rebased branch?

所以我的历史是这样的:

o---o---o---o master \ o---o---o A \ o B

所以,解释一下:

我要的是这个:

o---o---o---o master \ o---o---o A \ o B


我所做的是:

1).

git checkout A git rebase master

这导致了很多冲突,在花费大量时间修复之后,出现了以下历史记录:

o---o---o---o master \ o---o---o A

这正是我想要的。

(我不知道B现在在哪里)


2).

在此之后我做了很多压缩并更改了 A 上的提交顺序,以使历史看起来像我想要的那样。


3).

现在,我还想做的是:

git checkout B git rebase A

但这似乎不起作用,我也不知道为什么。如果我这样做 git log 我会看到在我执行第 1 步之前的提交。

此外,我遇到了与步骤 1 中已解决的相同数量的冲突。我花了很多时间做这件事,不想再做一次。

This example 建议使用 --onto,我这样做了:

git checkout B git rebase --onto A

但这会完全删除 B 上的提交,并使 AB 指向同一提交,即 A 上的最后一个提交。


我的问题是:我怎样才能有效地将 B 从 A 变基,使 B 看起来像是从 A 开始的? (一开始确实如此)。

我最好的猜测是我用错了 --onto。或者我应该使用其他东西(比如 cherry-pick)。

如果你已经重新定位了A。那么B应该就是你离开它的地方。 A 的分支(指针)只是移动到它的新位置。

如您所建议的,我建议将 B 有效地变基到 A 上,使用 'cherry-pick'。此命令尝试将提交中所做的更改应用到您 运行 所在的分支。

因此,如果 B 最初指向的提交的提交 ID 是“123456”,那么我建议将您当前的 'B' 移动到与新的 'A' 相同的位置 git branch -f B A 然后 运行 git cherry-pick 123456 将更改应用到 A.

我相信 --onto 标志用于设置应用 commits.It 默认值到 "upstream" 的目标位置(来源:http://git-scm.com/docs/git-rebase)。

我认为 rebase 命令的方式如下:

git rebase --onto <Starting here> <Apply all commits from HERE> <TO HERE>

使用这个,将 B 变基到 master 上,然后将 A 指向 B 之前的提交可能会更简单。

git rebase master B

(因为起点 (--onto) 是隐含的 'master')

然后使用 git branch -f A B^(^ 表示 'the parent of')

如何有效地将 B 从 A 变基,使 B 看起来像是从 A 开始的? 假设您要移动正好一个提交:

git rebase --onto A B~ B

如果你想移动多于一个提交使用:

git rebase --onto A old_A B

剩下的答案。

您的 B 分支仍然存在(您可以查看它),但它的父级仍然是 A 之前的确切提交对象。
要查看我使用的图形表示:

git log --graph --decorate --all

查看所有分支以及它们相对于彼此的位置。

你原来拥有的:

o---o---o---o  master
     \
      o---o---o  A
               \
                o B

你现在拥有的:

o---o---o-----------o  master
     \               \
      o---o---o(B~)   o---o---o A
               \
                o B

在使用--onto方面,需要有起点和终点。 使用:

git rebase --onto [target] [rebasing stops] [rebasing head]
git rebase --onto A B~ B

你得到的是:

o---o---o----------o  master
     \              \
      o---o---o      o---o---o A
            (old_A)           \
                               o B

[branch_name]~表示分支的父提交。

B~ 是您不想更改的分支。 (刚好是老A

或者,如果 B 是唯一一个将 A 作为父级的提交(即,B 是从 master 分支出来的提交链的末尾),您可以这样做

git checkout B
git rebase master
git checkout B~   # this is the commit before B (the A commit)
git branch -d A   # remove the old A branch (it was rebased, and so is now invalid
git branch A      # recreate the A branch on the commit that is based on the original A

我的 git 流程也有同样的问题,我找到了一个最好、最快的方法。

(1) 开头的项目历史:

    master ---A---B---C
                \
                 D---E---F feature1
                          \
                           G---H feature2

(2) 将 feature1 变基到 master 上并强制推送:

    master ---A---B------------------------C
                \                           \
                 D---E---F feature1(old)     D---E---F feature1
                          \
                           G---H feature2

(3) 将 feature2 变基到 featrue1(新的)

    master ---A---B------------------------C
                                            \
                                             D---E---F feature1
                                                      \
                                                       G---H feature2

最困惑的部分是如何做(3) ..但是没有人有明确的答案。

相信很多人都遇到过和我一样的问题,我们在做"rebase --onto"的时候,发现feature1(old)其实是不存在的!

    git rebase --onto feature1 feature1(old) feature2

解决方法是改用下面的方法:

    git rebase --onto feature1 feature1@{1} feature2

The syntax feature1@{1} means "the last known state of feature1 before the rebase", answer is refereed from https://coderwall.com/p/xzsr9g/rebasing-dependent-branches-with-git