如何从重新建立分支的分支中重新建立分支?
How to rebase a branch off a rebased branch?
所以我的历史是这样的:
o---o---o---o master
\
o---o---o A
\
o B
所以,解释一下:
- 我有一个分支
A
,它是从 master
开始的
- 我有从
A
开始的分支 B
(只有 1 次提交)
我要的是这个:
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
上的提交,并使 A
和 B
指向同一提交,即 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
所以我的历史是这样的:
o---o---o---o master
\
o---o---o A
\
o B
所以,解释一下:
- 我有一个分支
A
,它是从master
开始的
- 我有从
A
开始的分支
B
(只有 1 次提交)
我要的是这个:
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
上的提交,并使 A
和 B
指向同一提交,即 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