我有一个开发分支和一个功能分支,我们称之为功能/ A. 当有人进行远程开发时,我正在拉它然后我去功能/ A并将其重新定义为开发。现在我想创建一个名为feature / B的新分支,并且"继承"它来自feature / A并进行一些开发(我需要feature / B中的功能/ A代码),但我想知道当我将我的功能/ A重新设置为开发时会发生什么。
dev
|
1----4
\
\---2--------3
| |
f/A f/B
然后我将再次提交功能/ A
dev
|
1----4
\
\---2--------3
\ |
| f/B
5
f/A
当我将功能/ A重新设定为开发时,我将
dev f/A
| |
1----4---2'---5'
\
\---2--------3
/ |
/ f/B
5 (commit without any assiciated branch that git will remove as trash after several days)
现在我必须将功能/ B重命名为功能/ A吧?是否有可能在该rebase之后提交2和3将覆盖提交2'并承诺5'在我的功能/ B中我会再次使用旧代码吗?
不要忘记我需要在我的功能/ B中提交5个更改
答案 0 :(得分:1)
嗯... rebase
是一个非常灵活的命令。它可以做很多事情,所以真正的问题是如何告诉它完全按你的意思去做。
所以关注点似乎是你有
1 -- 4 <--(dev)
\ \
\ 2' -- 5' <--(A)
\
2 -- 3 <--(B)
如何将B
重新定义到A
。 (您提供的有关如何达到这一点的其他信息并不重要;我们可以只关注当前的提交图。悬挂提交5
在这里也无关紧要。)
您询问2
是否可能以某种方式最终覆盖2'
......我没有看到那里的问题。如果您正在重新定位的分支是B
,A
并且其历史记录将不受影响。
一个小问题是2
是B
的历史记录,而不是A
的历史记录。这个不应该是的问题,因为我们希望2
应用与2'
相同的文本更改 - 条件rebase会检测到。但是,如果在重新定位A
时存在冲突解决方案 - 或者我认为其他更隐蔽的可能性 - 补丁比较可能会搞砸。
这意味着,你应能够说出
git rebase A B
提交2
和3
将被识别为源提交,但2
有望被发现为2'
的副本并被丢弃。将创建3'
以在3
之上应用2
(相对于5
)的更改,从而产生
1 -- 4 <--(dev)
\
2' -- 5' <--(A)
\
3' <--(B)
如果失败,那么当git尝试重播2
时,您可能会看到冲突。那时你会中止变基。
(我看不出会发生这种情况,但是如果rebase成功完成但是你发现它错误地重新复制了2
的更改,那么你仍然可以将其退出;使用
git checkout B
git reset --hard B@{1}
撤消rebase。)
如果您必须中止rebase或撤消它,那么“计划B”将是
git rebase --onto A 2 B
其中2
是一个引用commit 2
的表达式(例如它的SHA ID,或给定示例中的B^
等)。这将确保只有3
被视为重写的候选提交(因为2
是上游)但仍将执行重播到5
。