永远不要推动git中的合并更改

时间:2015-03-15 00:24:11

标签: git merge push

让我说我在git中有两个分支:A和B.假设我在A中进行了更改并将其合并到B.然后我将最新版本的B推到远程但我从不推从A到远程的变化。事实上,让我们说我完全恢复了这个提交,所以它在A中甚至不再存在。

对于任何一个分支,这样做会有什么后果吗?如果A永远不会被推入合并到B的变化,那么B的远程副本是否可以接受?

3 个答案:

答案 0 :(得分:2)

如果分支B以某种方式依赖于分支A,您的问题似乎就会受到关注,因为您将A中的变化合并到了B. 它不是

将A合并到B后,您可能会得到以下图表,其中M是合并提交:

Branch A: X <- Y <- Z
Branch B: X <- M

Git中的每个提交都指向一个顶级树对象,该对象又指向更多树对象,或包含有关该提交中包含的文件的数据的blob。

当您推送本地分支B时,回购将不知道此分支引用的任何blob。因此,Git仓库将为分支B中的每个提交存储完整的树。

但是,让我们说您决定在本地分支B上执行git rebase -i,并通过更改单个文件来修改X提交。您是否在进行此更改时修改了分支A? 不,你没有。在进行此更改之前,分支A和B都引用相同的提交X。但是现在Git为你在分支B中修改的提交X创建了一个新的SHA-1。这个新提交将指向一个新的树对象,它最终将指向一个包含你修改过的单个文件的新blob。请注意,此树可能仍与分支A共享许多其他子树和blob。但提交和顶级树将不再相同。

这通常是Git分支的工作原理。信息将尽可能在分支之间共享,当分支发散时,底层树和blob将被更新以反映出来。因此,在将Branch B推送到遥控器后,不会担心分支A会发生什么。

答案 1 :(得分:2)

这将是好的,因为分支B通过连​​续跟随提交的父级或父级(在合并的情况下)包含从HEAD到初始提交的所有提交。推送将必须复制尚未在遥控器上的所有提交,否则遥控器将具有不完整的历史记录。

将名称A和B视为指向特定提交的标签。

如果你有一个带有功能分支的开发模型,你所描述的内容实际上是相当常见的:通常功能分支在某处分支,获取提交,合并后退然后删除。

        B (master)                        B (master)
        |                                 |
x---x---M            becomes      x---x---M
 \     /              ---->        \     /
  x---x                             x---x
      |
      A (feature)

来自A的提交可以从合并提交M到达,而分支指针B指向M.因此不会删除任何提交。你的情况就像推B但不是A所以遥控器只能在上面的ASCII图像中看到正确的版本。

旁注:您甚至可以删除两个分支,并且提交仍然存在,直到下一个垃圾收集。这基本上消除了丢失在某个时间点提交的数据的可能性。

答案 2 :(得分:0)

I have created  a repo commited locally on master是的,没关系。 情况是,如果我理解: 假设分支A是主分支,分支B开发

起初A和B处于相同状态,并与原点同步 在本地我向A提交了一些内容,然后我合并到了B,然后只推送到了分支B,并重置--hard A到HEAD。 那将是好的,这是git的好东西之一,你可以在本地做任何你想做的事,如果你不推动原点。 如果其他一些开发推动某些东西到A,你应该能够在重置你的分支A到头,做git pull起源A没有任何冲突。

示例repo,看看我最初提交给master,并且只在repo中存在develop。 https://github.com/ricardoul/StackoverflowMergedBranchAndNoCommit