从我收集的,这是在你的仓库情况:
develop
↓
A -- A -- B -- C -- C
\
F -- F -- F
↑
feature1
因此,提交A
上提交开发以前存在。 B
是开发的基础提交在创建特征分支时处于打开状态。F
是在功能分支上提交的提交,并且C
是在功能分支已经创建并正在处理之后在上开发的提交。
现在,你想要做的是继续在功能分支上工作,同时取决于提交C
引入的更改。是对的吗?
在这种情况下,假设你是不一样的开发者为用户1,引进这些变化为特征的分支最安全的方式是简单地将它们合并。因此,尽管有特征1查出来,只是合并发展使用`git merge develop *。然后,历史记录如下所示:
develop
↓
A -- A -- B ---- C ----- C
\ \
F -- F -- F -- M
↑
feature1
因此,您只需简单地合并更改,然后就可以继续使用它。事实上,你可以继续做这一行多次既是特征1和发展成长:
develop
↓
A -- A -- B ---- C ----- C -- C -- C -- C
\ \ \ \
F -- F -- F -- M -- F -- M -- M -- F
↑
feature1
而且一旦你与功能分支了,你可以将其合并到发展:
develop
↓
A -- A -- B ---- C ----- C -- C -- C -- C ------ M
\ \ \ \ /
F -- F -- F -- M -- F -- M -- M -- F
当然,这使历史看起来有点凌乱,但它代表了正确的特性分支是如何随着时间而演变,而相关的变化仍然发生在发展。
如果你想避免这样的历史,有几种选择。如果您只需要很少的更改,例如有些是在单个提交中引入的,而其他提交与您无关,您也可以在功能分支上挑选那个提交。樱桃采摘允许你拷贝一个提交,基本上重用它,同时仍然作为一个单独的提交。
比方说,您只需要从上面显示的第一个图表中第一次提交C
。然后,你可以做git cherry-pick C1
超过它复制到新特性分支:
develop
↓
A -- A -- B -- C1 -- C2
\
F -- F -- F -- C1'
↑
feature1
这将创建一个副本C1'
其中包括同样的变化其原有C1
(但仍是一个不同的提交对象)。然后,您可以继续使用包含这些更改的功能分支进行工作。
最后,剩下的选择是rebasing。重订重写的历史,所以再次从第一个图开始,你可能最终与运行git rebase develop
如下:
develop
↓
A -- A -- B -- C -- C
\
F' -- F' -- F'
↑
feature1
要记住的重要一点是,历史上真正改写,所以特性1上的所有提交都被修改,而被重新创建为。这导致它们是具有不同提交标识符的完全不同的对象,使它们与分支的先前状态不兼容。
这会导致其他开发人员(尤其是那些正在致力于功能部件的“用户1”)在分支上尝试合并您的更改时遇到冲突。修复这将需要他们手动修复它,除非你告诉他们,他们可能甚至没有注意到(使历史非常混乱,并因此而被破坏)。
所以,除非你知道你在做什么,否则你应该绝不会重新提交在之前发布的提交。即使这意味着你的历史看起来不太好。
正如旁注:*无*是“远程”分支。 (事实上,“远程分支”实际上并不是一个Git术语,有一种叫做远程跟踪分支的东西,这就是你所看到的名称,如“origin/develop”和“origin/master”。你的Git从其他Git获得的最后一次Git与其他Git的最后一次交谈这意味着你永远不会改变它当你的Git再次与其他Git交谈时,让你的Git更新它们,但是,只有其他Git应该以任何方式更改它们。) – torek