将提交从master转移到master中的先前提交

时间:2017-11-16 14:53:00

标签: git

我试图从分支机构移动提交"功能"到一个新的分支,它是从早期的提交而不是"特征"。

假设我的树看起来像这样:

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工作,我怎么能移动这些提交?

2 个答案:

答案 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;提交DE&#34;。但是一个分支不是一组提交;它是指向一个提交的指针(因此我重新排列了图表)。在git提交中,#ref;可以从refs&#34 ;;在分支上没有真正的提交概念&#34;&#34;或者&#34;不在分支上#34;除此之外。

那么是什么让BCDE不同?他们可以从feature到达;但是BC 可以从master到达(这就是为什么你不认为他们是&#34;在{ {1}}分支&#34;)。

这引出了我们的第一个问题:rebase命令没有做你想要的,因为你发布的rebase命令并不知道或不关心feature ref。上游是master(可以从desired到达),源分支是AfeatureAB,可以访问CD。因此,rebase会重写E - 即所有内容都可以从desired..feature到达,但无法从feature到达 - 包括desiredB

你想要的是让C成为你的上游,这样命令就会重写master(仅master..featureD)。这反过来意味着您希望新基数不是上游,而是要求E选项

--onto

产生

git rebase --onto desired master feature

(我在图片中保留了 D' - E' <--(feature) / A <--(desired) \ B - C <--(master) \ D - E D,以强调调用新提交ED'的原因。原始提交不是< / em>已删除;如果他们可以从 E'以外的参考中访问,则这些参考文件仍会&#34;查看&#34;原始提交。{{1} } branch现在达到两个新提交,其身份与原始featurefeature不同。)

答案 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;