git工作流程:拉之前应该提交吗?

时间:2019-03-29 18:52:59

标签: git git-commit git-stash

我阅读了以下帖子: How do you git fetch then merge? "Error: Your local changes to the following files would be overwritten by merge"

我和git在同一分支上与朋友一起工作。当他对我们的项目进行更改并撤消该项目时,他得到了错误,即他的本地更改将被覆盖。

这是否是可能的工作流程,以推动他的新变化:

git commit 
git pull (or fetch and merge)
git push

或者git stashgit commit

3 个答案:

答案 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(除非配置为不同),因此您可以适当地替换它。

两个人共享一个分支的最简单的工作流程可能是commitfetchmergepush。最好将其视为默认值,并认识到您会做其他事情的原因:

首先,这确实假定您已经在本地创建了想要创建永久提交点的状态。您有什么标准可以为您的团队进行讨论,但是基本上您只是在说这是您将来应该回到的观点。您可能不希望因一堆未完成的更改而使您的历史混乱,并且出于调试目的,一些团队表示每次永久提交都应通过自动化测试。

这很重要,因为如果您正在提交O,则有本地更改,您将其提交为L,然后获取并合并远程提交R,则最终像

O -- L -- M <--(master)
 \       /
  -- R --

现在L已被锁定到您的历史记录中(尤其是在随后的push之后)。因此,例如,如果您随后进行了更多本地更改,然后将其提交给

O -- L -- M -- L2 <--(master)
 \       /
  -- R --

没有一种简单的方法可以将LL2压在一起。

解决此问题的最简单方法是stash您的本地更改,而不是在尚未准备好提交时提交。弹出(或应用)存储时,您仍然必须解决所有冲突。结果将是

O -- R <--(master)

未提交(并且可能未暂存,具体取决于您如何处理存储)的更改。

另一个常见的变化是在新获取的提交之上对rebase进行局部更改。这可以使历史记录看起来更简单(省去了将本地更改与远程更改合并的提交),并且由于它将本地更改保持在最前端,因此可以轻松修改它们(只要您没有推送它们)。但是,它还会创建尚未真正通过任何可能的自动化测试的提交状态,因此如果您想要上面建议的“干净提交”策略,可能会犯错。