我有一个奇怪的问题,我试图理解git rebase。另一位开发人员和我正在研究同一个项目,都是从develop
分支推送/拉出。
我们正在处理相同的文件,因此我们预计在从git推送/拉出时会出现一些冲突。
所以我们做的是:
我们对这个操作非常满意,直到我们发现有一些行在我的版本中被评论但在我的同事中没有。由于我的版本是推送的最后一个版本,所以这些行仍然在回购邮件上注释。
为什么git没有抱怨每个版本的同一行不同?我知道git会注意到注释并将它们标记为更改。是因为我重新定位而不是进行合并提交吗?谁能帮我理解发生了什么?我担心这种变化会被忽视,导致项目后期出现错误。
答案 0 :(得分:2)
你的git flow错了,这里有两件事:
1)切勿在公共分支上使用git rebase
(或修改历史记录的其他命令)。可以创建分支,对其进行一些操作,重新定位并推送它,但是当它已经被其他人推送和使用时,不要进行重组。
2)你可能来自svn
之类的东西,习惯于在一个分支上工作。 Git具有轻量级分支,最好为每次更改创建新分支:
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/feature
和colleague/feature
无关的分支。就好像你创建了一个新分支并将更改移到了它上面。
如果您尝试将feature
分支推送回origin
存储库,git会告诉您分支已经分歧。
你仍然可以使用--force
推送它,历史就是这样:
... O ---- O ---- A ---- B --- origin/master
\ \
\ \ /-- origin/feature
\ \ /
\ --- C' -- your/feature
\
\-- D colleague/feature
看看发生了什么?
现在你的同事的分支机构已与你的分支机构断开连接,因此他在推送/拉动变更时会遇到问题。
此时,他可以尝试使用--force
并覆盖feature
分支的变体。
这样你最终可能会失去一些变化。 好吧,什么都没有真正丢失并且可以恢复,但处理这种情况可能很复杂。