如何在 git 中更新我的代码库而不必删除、隐藏或签入我当前的更改?

How do i update my code base in git without having to delete, stash or checkin my current changes?

我的团队刚刚将我们的项目从 Mercurial 转移到 git,我仍在适应工作流程。当我们使用 mercurial 时,我的流程将如下所示:

本质上,编写代码,偶尔拉动以保持同步,完成后提交。

使用git我写完代码后似乎无法拉动。当我 运行 'git pull' 时,我收到以下错误消息:
'error: Your local changes to the following files would be overwritten by merge:...Please, commit your changes or stash them before you can merge.'

我犹豫是否要提交我的更改,因为在我的流程中,它们几乎从未完成到让我想要提交的程度。 有没有办法让我提取更新的更改并应用它们,而无需清除或隐藏我自己的更改?如果没有,我怎样才能使我的旧工作流程适应 git 模型?

最简单的解决方案是 "temporary" 提交:

# Possibly: git add any untracked new files
git commit -am "INTERIM commit - WIP"
# need "rebase" here, because we want to discard
# our temporary commit later
git pull --rebase 
# resolve any possible conflicts
git reset HEAD~1 # throw away interim commit, keep changes

很多人都在犹豫要不要做出一些 "unfinished" 的事情。在 git 中,提交是如此的快速和廉价,以至于没有理由有这种感觉。只需进行临时提交,然后将其丢弃。

如果您经常拉取新更改,请考虑 git pull --rebase(甚至可以将其设为默认值)- 这样您就不会在每次拉取时都获得合并提交,这只会弄乱历史。

注意:在我给出的示例中,您必须使用 --rebase 选项进行拉取,否则无法丢弃临时提交(因为它将成为合并提交的父项)。还有其他方法可以解决这个问题,但这是最简单的(对我来说)。

有人可能会争辩说,与未提交的内容合并成功比失败更容易出现问题。

在我看来,您要么想要以当前状态提交您的工作,要么不想。

如果您不想提交它,那么合并应该是对您提交的提示的干净检查——所以您应该隐藏您当前的工作,正确地执行和记录合并,然后进行 stash pop 合并隐藏的更改回到您的工作树中。现在你有了你要的工作树,还有一个正确记录的合并提交,合并父项正确记录了合并历史。

如果您确实想提交当前状态的工作,请提交。然后合并。现在你的 repo 具有与上面相同的功能:正确记录的合并提交 正确合并的工作树。

所以,考虑到这一点,我想我会比假设更进一步,说适应的方法是采用。

最适合您的选择可能是

  • 继续在本地使用 Mercurial
  • 使用 Hg-git 获得与远程 Git 存储库的互操作性 - 与您的旧 goodworkflow

您将摆脱 Git 的愚蠢行为,并在其中拉取任何新的变更集,只需(创建|添加变更集)您分支中的匿名分支(仍然是本地提交),而不会触及您的历史线。您可以稍后在需要时检查|合并头像