Git从另一个远程分支更新我的远程分支

时间:2016-11-12 13:26:45

标签: git github git-branch git-merge master

我们有一个名为' develop'的主分支,所以每当我们开发一个功能时,我们都会建立一个本地功能分支来开发'然后合并回来发展。

现在是一个案例,
1.用户1必须从“开发”(比如feature1)创建一个功能分支,并且必须将其发布到Git。这样就完成了 现在,'开发'和' feature1' Git中有两个不同的分支,并且' feature1'没有合并到' develop' as' feature1'仍处于发展阶段 后来我开始实现的功能依赖于' feature1'。所以我克隆了&#3​​9; feature1'从git分支并决定更新我对它的更改,认为' feature1'本来应该已经从'开发'更新了分支。
但后来我发现了' feature1'分支未更新来自' develop'分支。
现在我需要改变“发展”。要在' feature1'中更新的分支更新我的更改之前的分支。

使用GIT命令可以做任何可能的方法吗?

2 个答案:

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

  1. 在本地仓库中重新feature1develop。它将回滚feature1中的所有更改,将develop合并到feature1,然后重做您的更改。
  2. git checkout feature1

    git rebase develop

    1. 强行将您的本地仓库推送到您的主仓库。
    2. git push -f

      1. 将您的分支(例如feature2)重新定位到feature1
      2. git checkout feature2

        git rebase feature1

        参考:https://git-scm.com/book/en/v2/Git-Branching-Rebasing

        希望这有帮助!

        编辑:阅读poke's answer,因为这会让其他开发者的本地回购有点破碎。