我们有一个名为' develop'的主分支,所以每当我们开发一个功能时,我们都会建立一个本地功能分支来开发'然后合并回来发展。
现在是一个案例,
1.用户1必须从“开发”(比如feature1)创建一个功能分支,并且必须将其发布到Git。这样就完成了
现在,'开发'和' feature1' Git中有两个不同的分支,并且' feature1'没有合并到' develop' as' feature1'仍处于发展阶段
后来我开始实现的功能依赖于' feature1'。所以我克隆了' feature1'从git分支并决定更新我对它的更改,认为' feature1'本来应该已经从'开发'更新了分支。
但后来我发现了' feature1'分支未更新来自' develop'分支。
现在我需要改变“发展”。要在' feature1'中更新的分支更新我的更改之前的分支。
使用GIT命令可以做任何可能的方法吗?
答案 0 :(得分:4)
根据我收集的内容,这是您的存储库中的情况:
develop
↓
A -- A -- B -- C -- C
\
F -- F -- F
↑
feature1
因此,提交A
是对之前存在的 develop 的提交。 B
是创建功能分支时 develop 所在的基本提交。 F
是在功能分支上进行的提交,C
是在功能分支已经创建并正在处理之后在 develop 上进行的提交。
现在,您要做的是继续处理功能分支,同时取决于提交C
引入的更改。是吗?
在这种情况下,假设您与用户1不是同一个开发人员,将这些更改引入功能分支的最安全方法是简单地将它们合并。因此,在检查 feature1 时,只需使用`git merge develop *合并 develop 。然后,历史将如下所示:
develop
↓
A -- A -- B ---- C ----- C
\ \
F -- F -- F -- M
↑
feature1
因此,您只需合并更改,然后就可以继续使用它了。事实上,你可以继续多次这样做,因为 feature1 和 develop 增长:
develop
↓
A -- A -- B ---- C ----- C -- C -- C -- C
\ \ \ \
F -- F -- F -- M -- F -- M -- M -- F
↑
feature1
完成功能分支后,您可以将其合并到 develop 中:
develop
↓
A -- A -- B ---- C ----- C -- C -- C -- C ------ M
\ \ \ \ /
F -- F -- F -- M -- F -- M -- M -- F
当然,这会使历史看起来有些混乱,但它正确地表示了功能分支随着时间的推移而演变,而相关的变化仍然发生在 develop 上。
如果你想避免看起来那样的历史,有一些选择。如果你只是依赖很少的变化,例如一些在一次提交中引入而另一次提交与你无关,你也可以选择一个提交到功能分支。 Cherry-picking允许你复制一个提交,基本上是完全重用它,同时仍然将它作为一个单独的提交。
假设您只需要从上面显示的第一个图表中获得第一个提交C
。然后你可以git cherry-pick C1
将其复制到功能分支:
develop
↓
A -- A -- B -- C1 -- C2
\
F -- F -- F -- C1'
↑
feature1
这将创建一个副本C1'
,其中包含与其原始C1
相同的更改(但仍然是另一个提交对象)。然后,您可以继续使用包含这些更改的功能分支。
最后,剩下的选择是变基。重新重写历史记录,因此从第一张图开始,您可以通过运行git rebase develop
来结束以下操作:
develop
↓
A -- A -- B -- C -- C
\
F' -- F' -- F'
↑
feature1
要记住的重要一点是历史记录确实被重写,因此 feature1 上的所有提交都会被修改并重新创建。这导致它们成为具有不同提交标识符的完全不同的对象,使它们与分支的先前状态不兼容。
这会导致其他开发人员(尤其是正在处理 feature1 分支的“用户1”)在尝试合并您的更改时遇到冲突。修复需要他们手动修复它,除非你告诉他们,他们甚至可能都没注意到(使历史非常混乱,结果有点破坏)。
因此,除非你知道自己在做什么,否则你应该永远不会重新提交之前发布的提交。即使这意味着您的历史记录看起来不那么好。
答案 1 :(得分:2)
feature1
到develop
。它将回滚feature1
中的所有更改,将develop
合并到feature1
,然后重做您的更改。 git checkout feature1
git rebase develop
git push -f
feature2
)重新定位到feature1
。 git checkout feature2
git rebase feature1
参考:https://git-scm.com/book/en/v2/Git-Branching-Rebasing
希望这有帮助!
编辑:阅读poke's answer,因为这会让其他开发者的本地回购有点破碎。