我试图从分支机构移动提交"功能"到一个新的分支,它是从早期的提交而不是"特征"。
假设我的树看起来像这样:
master A - B - C
\
feature D - E
我想将我的功能提交D和E移动到从提交A派生的新分支,以便我的树看起来像这样:
desired D - E
/
master A - B - C
\
feature D - E
我创建了分支"期望"来自A并尝试重新提交" feature"在"期望"的提示上,但这样做了提交B和C.为什么没有这个rebase工作,我怎么能移动这些提交?
答案 0 :(得分:2)
让我们以更好地表示git数据结构的方式重绘提交图。
A - B - C <--(master)
\
D - E <--(feature)
然后你回到A
并创建desired
分支,它会给你
A <--(desired)
\
B - C <--(master)
\
D - E <--(feature)
现在我假设你说
git rebsae desired feature
认为feature
分支意味着&#34;提交D
和E
&#34;。但是一个分支不是一组提交;它是指向一个提交的指针(因此我重新排列了图表)。在git提交中,#ref;可以从refs&#34 ;;在分支上没有真正的提交概念&#34;&#34;或者&#34;不在分支上#34;除此之外。
那么是什么让B
和C
与D
和E
不同?他们可以从feature
到达;但是B
和C
也可以从master
到达(这就是为什么你不认为他们是&#34;在{ {1}}分支&#34;)。
这引出了我们的第一个问题:rebase命令没有做你想要的,因为你发布的rebase命令并不知道或不关心feature
ref。上游是master
(可以从desired
到达),源分支是A
(feature
,A
,B
,可以访问C
和D
。因此,rebase会重写E
- 即所有内容都可以从desired..feature
到达,但无法从feature
到达 - 包括desired
和B
。
你想要的是让C
成为你的上游,这样命令就会重写master
(仅master..feature
和D
)。这反过来意味着您希望新基数不是上游,而是要求E
选项
--onto
产生
git rebase --onto desired master feature
(我在图片中保留了 D' - E' <--(feature)
/
A <--(desired)
\
B - C <--(master)
\
D - E
和D
,以强调调用新提交E
和D'
的原因。原始提交不是< / em>已删除;如果他们可以从 E'
以外的参考中访问,则这些参考文件仍会&#34;查看&#34;原始提交。{{1} } branch现在达到两个新提交,其身份与原始feature
和feature
不同。)
答案 1 :(得分:0)
您应该执行类似
的操作create function [dbo].[fn_StringSplitMax]
(
@str nvarchar(max) = ' ' -- String to split.
,@delimiter as nvarchar(max) = ',' -- Delimiting value to split on. Can be multiple characters.
,@num as int = null -- nth value will be returned. NULL returns all.
)
returns table
as
return
with s as
( -- Convert the string to an XML value, replacing the delimiter with XML tags
select convert(xml,'<x>' + replace((select @str for xml path('')),@delimiter,'</x><x>') + '</x>').query('.') as s
)
select rn
,item -- Select the values from the generated XML value by CROSS APPLYing to the XML nodes
from(select row_number() over (order by (select null)) as rn
,n.x.value('.','nvarchar(max)') as item
from s
cross apply s.nodes('x') as n(x)
) a
where rn = @num
or @num is null;