git - Git 显示我添加了另一个人的更改
问题描述
我自己和一位同事在同一个分支上工作(不是一直,而是现在)。他和我几乎同时做出了承诺,他推动了他的改变。
我通过 Github Desktop 进行了推送,我惊讶地发现有两个提交分配给了我自己:我的原始提交和“将https://github.com/company/repository的分支 'xyz' 合并到 xyz”,其中我没想到。看起来我将他的更改合并到了分支中。
我的期望是,由于我没有进行强制推送,因此我无法在没有同事更改的情况下将分支设置为包含我的更改。从我从 Github 桌面日志中可以看到,它看起来像是在推送之前完成了拉取(因此合并)。但是,查看历史记录,在我看来,分支设置为首先包含我的更改,没有我的同事更改,然后我将这些更改合并,这正是我认为如果不进行强制推送是不可能的。
我对历史的首选“状态”是只显示我的更改合并到分支中,而不是我进行了同事的更改。完成此操作的唯一方法是使用我的更改创建一个新的命名分支,提交并推送,切换回原始分支,然后从新命名的分支合并?
出于某种原因,我认为这基本上会发生,而无需经过所有这些无关的步骤。我错了吗?有没有更好的方法来实现这一点?
谢谢!
解决方案
如果两个人在同一个分支上工作,那么在事情的自然过程中几乎不可避免地每个人都会提交并且一个人会先于另一个人推送。因此,我们将首先遇到这种情况:
A -- B -- C --| <-- master G -- H <-- branch as seen by them
\ /
D -- E -- F -- |
\
I -- J <-- branch as seen by us
然后,当他们推动时,这种情况:
A -- B -- C --| <-- master
\
D -- E -- F -- G -- H <-- branch on the remote
\
I -- J <-- branch as seen by us
如果你现在拉,你有 I 和 J,但远程有 G 和 H。除非你采取特殊措施,Git 默认情况下会自动在你的本地创建一个合并提交来协调这个差异:
A -- B -- C --| <-- master
\
D -- E -- F -- G -- H
\ \
I -- J -- M <-- branch as seen by us
...其中 M 是合并提交。
这是完全正常的。谁先推送,另一个将与合并提交进行协调。当然,当你推送时,合并提交会被推送,因此我们会在分支的生命周期中得到一个由发散和合并、发散和合并的平行四边形组成的链。
如果您不喜欢合并提交,您可以--rebase
在拉取时说。在这种情况下,传入的新提交将首先放置,您的本地新提交将放在第二位:
A -- B -- C --| <-- master
\
D -- E -- F -- G -- H -- I' -- J' <-- branch as seen by us
\
I -- J
提交 I 和 J 被复制以使 I' 和 J' 看起来像它们,但被附加到 H 处分支的传入版本的末尾。
即使您有本地提交,这种变基方法也是使您的分支版本“赶上”的一种非常标准的方法。但这并不总是可行的,当 Git 拒绝这样做时,可能会导致混乱的情况。
更标准的方法是:不要那样做。公共分支应该是没有人直接工作的地方;不应该有其他共同的分支。你在一个特性分支上工作,它们在一个不同的特性分支上工作,现在它们只是保持完全独立,并且每个都在自己的时间合并到主分支中(这里称为master
,尽管这个名称没有什么特别之处)。很可能仍然有一个代表每个合并的合并提交master
(我认为这很好,因为它保留了历史真相),但它不会以任何方式影响您的分支;你的分支只是前进,独自一人。
推荐阅读
- r - R:双变量(或多变量)核密度的概率/数值积分
- javascript - 从节点 12 升级到 14 后无法识别需求功能
- java - Eclipse 中的奇怪字符而不是实际标题
- html - 固定列和标题导致第二个 TD 元素重叠
- reactjs - 哪种方式从父组件获取信息更快更合适?
- python - 根据 python 中的列表检查输入-为什么一种方法有效而另一种方法无效?
- typescript - Typescript - 转换 Object.keys() 的返回值的更好方法是什么?
- python - GridserachCV,python 中的 make_scorer,用于特定于类的 F1
- ios - 如何在 Swift 中单击重新加载/重置按钮时在选项卡栏中重新加载项目的视图控制器
- java - 如何调用指示应该在实例上调用什么方法的传递参数