如何在Git中更新代码库而无需删除、隐藏或提交当前更改?

3

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

  • 编写一些代码
  • hg pull
  • hg update
  • 解决任何合并冲突
  • 继续编写代码,重复以上步骤直到完成
  • hg pull(并解决所有冲突)
  • 使用消息hg commit(或add)
  • hg push

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

但是,在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模型来调整我的旧工作流程?


如果您拉取的更改与本地更改发生冲突,您希望出现什么行为?这有助于为您提供更好的答案。 - larsks
@larsks 我期望不冲突的更改能够应用,当发生冲突时,我期望尝试合并,可能会导致部分损坏的文件,需要手动合并(通常意味着标记如<<<<<<<local和>>>>other来区分我的代码和无法合并的新更改)。 - Veg
3个回答

3
最简单的解决方案是进行一次“临时”提交:
# 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

许多人对“未完成”的内容犹豫不决。在git中,提交(commit)是如此快速且廉价的操作,因此没有必要感到担忧。只需进行一次临时提交(temp commit),然后将其丢弃即可。
如果您经常拉取新更改,请考虑使用git pull --rebase(甚至将其设置为默认行为) - 这样您就不会在每次拉取时得到一个合并提交(merge commit),这只会搞乱历史记录。
注意:在上述示例中,您必须使用--rebase选项进行拉取,否则无法丢弃临时提交(因为它将成为合并提交的一个父节点)。还有其他解决方法,但这是我认为最简单的方法。

1
请注意,这些备注也适用于Mercurial:
  • 提交很便宜(并且可以使用“hg commit --amend”)
  • 考虑使用变基
- Mathiasdm

2
有人可能会认为,如果合并未提交的内容成功,则问题更加严重。如果失败,则相对较轻。
在我看来,你要么想提交当前状态下的工作,要么不想提交。
如果你不想提交它,那么合并应该是与已提交的基础代码进行的,因此你应该将当前的工作存储起来,正确地执行和记录合并操作,然后使用存储弹出命令将已存储的更改合并回你的工作树。现在你拥有了所需的工作树,并且也有了正确记录合并历史的合并提交,其中合并父项正确记录了已合并的历史。
如果你想提交当前状态下的工作,请先提交它,然后再进行合并。现在你的仓库具有与上述相同的功能:一个正确记录的合并提交和一个正确合并的工作树。
因此,考虑到这一点,我认为适应的方法是采用。

1

对于你来说最好的选择可能是

  • 继续在本地使用Mercurial
  • 使用Hg-git与远程Git仓库进行互操作 - 保持你以前良好的工作流程

你将摆脱Git的烦恼,只需在你的分支中(带有你仍然本地提交的内容),创建匿名分支并添加新的变更集即可轻松拉取任何新的变更集,而不会影响你的历史记录。稍后需要时,你可以检查|合并头。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接