Git重基忽略相同的更改行

Git重基忽略相同的更改行,git,Git,我试图理解git rebase有一个奇怪的问题。另一个开发人员和我正在处理同一个项目,都是从develope分支推/拉。 我们正在处理相同的文件,因此我们预计在从git推/拉时会出现一些冲突 因此,我们要做的是: 我的同事首先提交并推动所有更改 我也会提交我的更改,但在推之前,我会从回购协议中获取新的更新。拉动结束时没有冲突。我有点惊讶,但我认为这只是运气,我们没有修改相同的确切行 在那之后,我将我的提交推到git rebase上,没有任何错误 我们对这次行动非常满意,直到我们意识到有些台词在我

我试图理解git rebase有一个奇怪的问题。另一个开发人员和我正在处理同一个项目,都是从
develope
分支推/拉。 我们正在处理相同的文件,因此我们预计在从git推/拉时会出现一些冲突

因此,我们要做的是:

  • 我的同事首先提交并推动所有更改
  • 我也会提交我的更改,但在推之前,我会从回购协议中获取新的更新。拉动结束时没有冲突。我有点惊讶,但我认为这只是运气,我们没有修改相同的确切行
  • 在那之后,我将我的提交推到git rebase上,没有任何错误
  • 我们对这次行动非常满意,直到我们意识到有些台词在我的版本中有评论,但在我同事的版本中没有。由于我的版本是最后一个推出的版本,因此在回购协议上仍有评论


    为什么git没有抱怨同一行在每个版本中不同?我知道git会注意注释并将其标记为更改。是因为我重新设置了基准,而不是执行合并提交吗?有人能帮我理解发生了什么事吗?我担心这种更改会被忽略,并导致项目后期出现错误。

    您的git流是错误的,这里有两件事:

    1) 切勿在公共分支上使用git-rebase(或其他修改历史记录的命令)。创建分支、对它做一些工作、重新设置基础并推送它是可以的,但是当它已经被其他人推送和使用时,不要进行重新设置基础

    2) 您可能来自类似于
    svn
    的地方,并且习惯于在单个分支上工作。Git具有轻量级分支,最好为每次更改创建新分支:

    • 永远不要直接提交到主分支,将完成的功能放在一起的将是您的集成分支
    • 为每个新特性创建一个新分支,并在那里进行开发
    • 功能完成后,检查更改:如果更改良好,则将其合并到master
      • 如果存在冲突,则恢复合并(或者如果使用github,则不允许合并)
      • 将主机合并回您的分支
      • 解决冲突
      • 推送最终的分支版本
    3) 除了浏览历史记录外,不要使用GUI客户端

    为什么你永远不应该给公共分支机构重新定基 让我们想象一下以下情况:有一个名为
    feature
    的分支是从
    主节点创建的

    你和你的同事都有这个分支,并致力于它(这就是我所说的“公共”分支)

    1) 您和同事有一个功能分支

    ... O ---- O ---- A ---- B      origin/master
                       \
                        ----        origin/feature
                         \
                          --- C     your/feature
                          \
                           \-- D    colleague/feature
    
    2) 您可以在主控形状上重新设置要素分支的基础

    请注意,我们更改了历史记录,并在
    your/feature
    分支上有了新的C'commit,它不再从
    origin/feature
    派生:

    ... O ---- O ---- A ---- B ---         origin/master
                       \     \
                        ---   \            origin/feature
                         \     \
                          \     --- C'     your/feature
                           \
                            \-- D          colleague/feature
    
    3) 现在您有了一个分支,它与
    来源/功能
    同事/功能
    无关。这就像您创建了一个新分支并将更改移动到它上一样

    如果您试图将
    功能
    分支推回到
    源代码
    存储库,git会告诉您分支已经分叉

    您仍然可以使用
    --force
    推送它,历史记录如下:

    ... O ---- O ---- A ---- B ---         origin/master
                       \     \
                        \     \       /--  origin/feature
                         \     \     /
                          \     --- C' --  your/feature
                           \
                            \-- D          colleague/feature
    
    看看发生了什么

    现在,您同事的分支已与您的分支和源分支断开连接,因此他在推/拉更改时会遇到问题

    此时,他可以尝试使用
    --force
    并覆盖
    功能
    分支的变体

    这样,您可能会丢失一些更改。
    嗯,没有什么东西是真正丢失的,可以恢复的,但处理这种情况可能会很复杂。

    我可以解释到底出了什么问题,以及为什么如果您能够重现这个问题,在这种情况下,请使用您和同事方发出的git命令序列更新您的问题。仅从文本描述很难理解问题出现的确切原因。@BorisSerebrov我们使用图形界面来处理git,因此我无法轻松复制/粘贴命令序列。我感谢您的反馈,但如果您能解释原因以及如何操作,我会更有用。为什么我不应该在公共分支机构上使用rebase?另外,我最初的问题是,为什么git在修改相同的行时没有抛出冲突错误?如果这与重新定基有关,你能解释一下原因吗?@我补充了关于为什么重新定基对公共分支机构不安全的解释。至于解释——如果您没有使用的确切命令,那么确实无法确定。我强烈建议不要将GUI git客户端用于除历史浏览之外的任何事情。如果您希望安全并保持控制,那么您应该真正了解您使用的确切git命令以及它们的具体用途。