我和git在同一分支上与朋友一起工作。当他对我们的项目进行更改并撤消该项目时,他得到了错误,即他的本地更改将被覆盖。
这是否是可能的工作流程,以推动他的新变化:
git commit
git pull (or fetch and merge)
git push
或者git stash
比git commit
好
答案 0 :(得分:1)
这很好(并且可以完成工作):
git commit
git pull (or fetch and merge)
git push
这也很好(并且不会完成工作):
git stash save
git pull (or fetch and merge)
git stash pop
答案 1 :(得分:1)
通常只有在具有完整的变更集的情况下才应提交(这通常意味着它在没有警告的情况下进行编译,所有测试均通过,并且在逻辑上有所改进)。
如果您进行了这样的“完整”更改,则应提交。如果不是这样,最好将您的更改存储起来,从远程拉出,然后将隐藏的更改弹出回到您的工作索引中。
答案 2 :(得分:1)
在下文中,我不提及使用pull
;正如您所注意到的,它基本上是 fetch
,然后是merge
(除非配置为不同),因此您可以适当地替换它。
两个人共享一个分支的最简单的工作流程可能是commit
,fetch
,merge
,push
。最好将其视为默认值,并认识到您会做其他事情的原因:
首先,这确实假定您已经在本地创建了想要创建永久提交点的状态。您有什么标准可以为您的团队进行讨论,但是基本上您只是在说这是您将来应该回到的观点。您可能不希望因一堆未完成的更改而使您的历史混乱,并且出于调试目的,一些团队表示每次永久提交都应通过自动化测试。
这很重要,因为如果您正在提交O
,则有本地更改,您将其提交为L
,然后获取并合并远程提交R
,则最终像
O -- L -- M <--(master)
\ /
-- R --
现在L
已被锁定到您的历史记录中(尤其是在随后的push
之后)。因此,例如,如果您随后进行了更多本地更改,然后将其提交给
O -- L -- M -- L2 <--(master)
\ /
-- R --
没有一种简单的方法可以将L
和L2
压在一起。
解决此问题的最简单方法是stash
您的本地更改,而不是在尚未准备好提交时提交。弹出(或应用)存储时,您仍然必须解决所有冲突。结果将是
O -- R <--(master)
未提交(并且可能未暂存,具体取决于您如何处理存储)的更改。
另一个常见的变化是在新获取的提交之上对rebase
进行局部更改。这可以使历史记录看起来更简单(省去了将本地更改与远程更改合并的提交),并且由于它将本地更改保持在最前端,因此可以轻松修改它们(只要您没有推送它们)。但是,它还会创建尚未真正通过任何可能的自动化测试的提交状态,因此如果您想要上面建议的“干净提交”策略,可能会犯错。