首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GIT:从特性分支分支而不是开发分支分支

GIT:从特性分支分支而不是开发分支分支
EN

Stack Overflow用户
提问于 2014-07-30 21:58:24
回答 2查看 285关注 0票数 1

因此,通常情况下,当我们有feature1,feature2和feature3时,它们就脱离了发展。我只是意外地继续分支,而不是切换回发展,因此feature2分支从feature1和feature3分支离开了特性2。

我怎么才能解决这个问题?

编辑图片:

代码语言:javascript
复制
I would like this:
---------------
  \
    A - B - C - D - E

to become this:
---------------
  \   \     \
   A   B-C   D-E
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-30 22:16:47

因为每个分支只有一到两个提交,所以使用樱桃选择就足够了(不需要对一个或两个提交进行重基)。

首先备份本地存储库(不要信任互联网!)

写下A,B,C,D和E的散列,然后:

只要做:

代码语言:javascript
复制
# Switch to devel
git checkout devel
# Rename branches into temporary branch names
git branch -m feature1 tmp1 && git branch -m feature2 tmp2
                            && git branch -m feature3 tmp3
# Create feature1 branch and cherry-pick the required commit
git checkout -b feature1 && git cherry-pick A
# Switch to devel
git checkout devel
# Create feature2 branch and cherry-pick the required commits
git checkout -b feature2 && git cherry-pick B C
# Switch to devel
git checkout devel
# Create feature3 branch and cherry-pick the required commits
git checkout -b feature3 && git cherry-pick D E
# Switch to devel
git checkout devel
# Delete temporary branches
git branch -D tmp1 tmp2 tmp3
票数 2
EN

Stack Overflow用户

发布于 2014-07-30 22:55:35

为了完整起见,下面是如何使用git rebase (带有可选的--onto)来移动这些提交。首先,让我们更新“当前”绘图以添加一些特定的标签并提交。为了便于重定位,并且具有通用性,我将假设feature1连接在devel的尖端之后,并且您希望将新的分支移动到提示(使用*标记的提交)。

如果没有额外的提交(因此*直接连接到A等),那么这一切仍然有效。

如果有额外的提交,但是希望将feature的内容从提示中保留下来,那么在这个示例中,--onto目的地应该是devel~2

现在:

代码语言:javascript
复制
...-o--o--*         <-- devel
     \
      A             <-- feature1
       \
        B--C        <-- feature2
            \
             D--E   <-- feature3

第1步,将feature3交互地重新定位到devel上。这将使用一堆pick命令创建一个文本文件,每个命令都将执行一个git cherry-pick。您希望选择提交DE。告诉rebase,“上游”(不好的名称)是devel,您希望它通过执行git checkout feature3启动整个操作。

代码语言:javascript
复制
$ git rebase -i devel feature3

在这里,rebase将找到devel..feature3选择的所有提交(这是A通过包含E,但不是已经在devel上的两个额外提交中的任何一个),并且将选择作为它的--onto目标devel。然后在编辑器中结束,在编辑器中,可以删除除最后两个提交(DE)之外的所有提交。然后,重新基地将:

  • 移动到分支devel的顶端,在一个新的未命名的分支上(分离头模式)
  • 樱桃-选择提交D,将其添加到未命名的分支中
  • 樱桃-选择提交E,将其添加到未命名的分支中
  • 最后,使用git reset的管道等价物使feature3指向最新的提交。

现在这棵树是这样的:

代码语言:javascript
复制
            D'-E'   <-- feature3
           /
...-o--o--*         <-- devel
     \
      A             <-- feature1
       \
        B--C        <-- feature2
            \
             D--E   [abandoned, except for reflogs]

(如果将--onto devel~2添加到原始git rebase -i中,它将从提交的devel~2 (最左边的o节点)中增长D'-E'链。您仍然需要指定上游,您可以将其列表为develdevel~2:在这种情况下,这无关紧要。)

现在你可以git rebase -i devel feature2了。这样做的方式是相同的:查看分支feature2,在devel..feature2中查找提交(这次是通过C提交),并打开一个编辑器会话,让您修改git将运行的一组cherry-pick命令。这一次,您只需要删除一行(对于提交A)。然后,Git在commit *上启动一个新的分离头匿名分支,使用BC的樱桃选择来生长它,然后移动feature2分支:

代码语言:javascript
复制
            D'-E'   <-- feature3
           /
...-o--o--*         <-- devel
    |      \
     \      B'-C'   <-- feature2
      |
      A             <-- feature1
       \
        B--C        [abandoned]

最后,您可以重新设置feature1的基础。在这里,您不需要担心交互,因为提交A是您唯一想要复制的,也是唯一一个git rebase会选择的。

结果与git cherry-pick相同。您需要更少的git命令,但是对于交互式的“挑选”序列需要更多的编辑。

哪条路更好?都不是真的。重命名旧分支,然后删除它们,会抛出它们的重触发器,这可能是一个特性,因为它使原始A通过E提交能够更快地得到垃圾收集,或者可能是一个缺点,以防您想再次查看它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25047691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档