从不在 git 中推送合并的更改
Never pushing merged changes in git
假设我在 git 中有两个分支:A 和 B。假设我对 A 进行了更改并将其合并到 B。然后我将最新版本的 B 推送到远程但我永远不要将更改从 A 推送到远程。事实上,假设我完全还原了该提交,因此它甚至不再存在于 A 中。
对这两个分支这样做有什么后果吗?如果 A 永远不会推送合并到 B 中的更改,B 的远程副本是否可以?
是的,会好的。
情况是,如果我理解:
假设分支 A 是 master 而分支 B develop
一开始A和B状态相同,并且和origin同步
在本地我向 A 提交了一些东西,然后我合并到 B,然后只推到原始分支 B,并将 --hard A 重置为 HEAD。
那没关系,这是 git 的好处之一,如果你不推送到原点,你可以在本地做任何你想做的事。
如果其他一些开发人员将某些东西推送到 A,您应该能够在将分支 A 重置为头部后,执行 git 拉取原点 A 而不会发生任何冲突。
示例repo,看一下我最初在master上提交的,只有在repo中存在develop。
https://github.com/ricardoul/WhosebugMergedBranchAndNoCommit
你的问题似乎是关于分支 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
提交。您在进行此更改时是否也修改了 Branch A? 不,你没有。在进行此更改之前,分支 A 和 B 都引用了相同的提交 X
。但是现在 Git 为您在分支 B 中修改的提交 X
创建了一个新的 SHA-1。这个新的提交将指向一个新的树对象,它最终将指向一个包含单个你修改的文件。请注意,这棵树可能仍与分支 A 共享许多其他子树和 blob。但是提交树和顶级树将不再相同。
这通常是 Git 分支的工作方式。信息将尽可能多地在分支之间共享,当分支发生分歧时,底层的树和 blob 将被更新以反映这一点。因此,无需担心将分支 B 推送到远程后分支 A 会发生什么。
没问题,因为分支 B 合并了从 HEAD
到初始提交的所有提交,依次跟随提交的父项或父项(在合并的情况下)。推送将必须复制尚未在远程上的所有提交,否则远程将具有不完整的历史记录。
将名称 A 和 B 视为指向特定提交的标签。
如果您有一个带有功能分支的开发模型,您所描述的实际上是相当普遍的:通常功能分支在某处分支,获取提交,合并回来,然后删除。
B (master) B (master)
| |
x---x---M becomes x---x---M
\ / ----> \ /
x---x x---x
|
A (feature)
从合并提交 M 可以访问来自 A 的提交,并且分支指针 B 指向 M。因此不会删除任何提交。您的情况就像按 B 而不是 A,因此遥控器只能在上面的 ASCII 图像中看到正确的版本。
旁注:您甚至可以删除两个分支,并且提交在下一次垃圾回收之前仍会存在。这基本上消除了丢失在某个时间点提交的数据的可能性。
假设我在 git 中有两个分支:A 和 B。假设我对 A 进行了更改并将其合并到 B。然后我将最新版本的 B 推送到远程但我永远不要将更改从 A 推送到远程。事实上,假设我完全还原了该提交,因此它甚至不再存在于 A 中。
对这两个分支这样做有什么后果吗?如果 A 永远不会推送合并到 B 中的更改,B 的远程副本是否可以?
一开始A和B状态相同,并且和origin同步 在本地我向 A 提交了一些东西,然后我合并到 B,然后只推到原始分支 B,并将 --hard A 重置为 HEAD。 那没关系,这是 git 的好处之一,如果你不推送到原点,你可以在本地做任何你想做的事。 如果其他一些开发人员将某些东西推送到 A,您应该能够在将分支 A 重置为头部后,执行 git 拉取原点 A 而不会发生任何冲突。
示例repo,看一下我最初在master上提交的,只有在repo中存在develop。 https://github.com/ricardoul/WhosebugMergedBranchAndNoCommit
你的问题似乎是关于分支 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
提交。您在进行此更改时是否也修改了 Branch A? 不,你没有。在进行此更改之前,分支 A 和 B 都引用了相同的提交 X
。但是现在 Git 为您在分支 B 中修改的提交 X
创建了一个新的 SHA-1。这个新的提交将指向一个新的树对象,它最终将指向一个包含单个你修改的文件。请注意,这棵树可能仍与分支 A 共享许多其他子树和 blob。但是提交树和顶级树将不再相同。
这通常是 Git 分支的工作方式。信息将尽可能多地在分支之间共享,当分支发生分歧时,底层的树和 blob 将被更新以反映这一点。因此,无需担心将分支 B 推送到远程后分支 A 会发生什么。
没问题,因为分支 B 合并了从 HEAD
到初始提交的所有提交,依次跟随提交的父项或父项(在合并的情况下)。推送将必须复制尚未在远程上的所有提交,否则远程将具有不完整的历史记录。
将名称 A 和 B 视为指向特定提交的标签。
如果您有一个带有功能分支的开发模型,您所描述的实际上是相当普遍的:通常功能分支在某处分支,获取提交,合并回来,然后删除。
B (master) B (master)
| |
x---x---M becomes x---x---M
\ / ----> \ /
x---x x---x
|
A (feature)
从合并提交 M 可以访问来自 A 的提交,并且分支指针 B 指向 M。因此不会删除任何提交。您的情况就像按 B 而不是 A,因此遥控器只能在上面的 ASCII 图像中看到正确的版本。
旁注:您甚至可以删除两个分支,并且提交在下一次垃圾回收之前仍会存在。这基本上消除了丢失在某个时间点提交的数据的可能性。