让我说我在git中有两个分支:A和B.假设我在A中进行了更改并将其合并到B.然后我将最新版本的B推到远程但我从不推从A到远程的变化。事实上,让我们说我完全恢复了这个提交,所以它在A中甚至不再存在。
对于任何一个分支,这样做会有什么后果吗?如果A永远不会被推入合并到B的变化,那么B的远程副本是否可以接受?
答案 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)
是的,没关系。 情况是,如果我理解: 假设分支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