Git rebase忽略相同的更改行

时间:2016-01-27 16:25:26

标签: git

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

所以我们做的是:

  1. 我的同事首先承诺并推动他所有的改变。
  2. 我也提交了我的更改,但在推送之前,我从repo中取出以获取新的更新。拉结束没有冲突。我有点惊讶,但我认为这只是运气,我们没有修改相同的确切线。
  3. 之后我推送我的提交做一个git rebase,没有任何错误或任何错误。
  4. 我们对这个操作非常满意,直到我们发现有一些行在我的版本中被评论但在我的同事中没有。由于我的版本是推送的最后一个版本,所以这些行仍然在回购邮件上注释。

    为什么git没有抱怨每个版本的同一行不同?我知道git会注意到注释并将它们标记为更改。是因为我重新定位而不是进行合并提交吗?谁能帮我理解发生了什么?我担心这种变化会被忽视,导致项目后期出现错误。

1 个答案:

答案 0 :(得分:2)

你的git flow错了,这里有两件事:

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

2)你可能来自svn之类的东西,习惯于在一个分支上工作。 Git具有轻量级分支,最好为每次更改创建新分支:

  • 永远不要直接提交到主分支,它将是您将完成的功能放在一起的集成分支
  • 为每个新功能创建一个新分支并在那里进行开发
  • 完成功能后,请检查更改:如果功能正常,请将其合并到主控
    • 如果有冲突,则恢复合并(或者如果你使用github,它将不允许你合并它)。
    • 将主人合并回您的分支机构
    • 解决冲突
    • 推送最终分支版本

3)除了历史记录浏览之外,不要使用GUI客户端

为什么你不应该改变公共分支

让我们想象以下情况:从feature创建了一个名为master的分支。

你和你的同事都有这个分支并在其上工作(我的意思是"公共"分支)。

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

... O ---- O ---- A ---- B      origin/master
                   \
                    ----        origin/feature
                     \
                      --- C     your/feature
                      \
                       \-- D    colleague/feature

2)你在master上重新设置你的功能分支。

请注意,我们更改了历史记录并使用了新的C'在your/feature分支上提交,它不再来自origin/feature

... O ---- O ---- A ---- B ---         origin/master
                   \     \
                    ---   \            origin/feature
                     \     \
                      \     --- C'     your/feature
                       \
                        \-- D          colleague/feature

3)现在你有一个与origin/featurecolleague/feature无关的分支。就好像你创建了一个新分支并将更改移到了它上面。

如果您尝试将feature分支推送回origin存储库,git会告诉您分支已经分歧。

你仍然可以使用--force推送它,历史就是这样:

... O ---- O ---- A ---- B ---         origin/master
                   \     \
                    \     \       /--  origin/feature
                     \     \     /
                      \     --- C' --  your/feature
                       \
                        \-- D          colleague/feature

看看发生了什么?

现在你的同事的分支机构已与你的分支机构断开连接,因此他在推送/拉动变更时会遇到问题。

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

这样你最终可能会失去一些变化。 好吧,什么都没有真正丢失并且可以恢复,但处理这种情况可能很复杂。