如何在 git 中更新我的代码库,而无需删除、存储或签入我当前的更改?

Posted

技术标签:

【中文标题】如何在 git 中更新我的代码库,而无需删除、存储或签入我当前的更改?【英文标题】:How do i update my code base in git without having to delete, stash or checkin my current changes? 【发布时间】:2015-02-02 21:43:36 【问题描述】:

我的团队刚刚将我们的项目从 mercurial 转移到了 git,我仍然习惯于工作流程。当我们使用 mercurial 时,我的流程如下所示:

写一些代码 汞拉 汞更新 解决任何合并冲突 继续写代码,重复以上步骤直到完成 hg pull(并解决所有冲突) hg 提交(或添加)一条消息 hg 推

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

在我编写代码后,我似乎无法使用 git。当我运行“git pull”时,我收到以下错误消息: '错误:您对以下文件的本地更改将被合并覆盖:...请在合并之前提交您的更改或存储它们。'

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

【问题讨论】:

如果您拉取与本地更改冲突的更改,您期望/想要什么行为?这可能有助于为您提供更好的答案。 @larsks 我希望应用不发生冲突的更改,当发生冲突时,我希望尝试合并,可能导致文件部分损坏,提示我手动合并(通常这意味着像 >>>other 这样的标记来区分我的代码和不可合并的新更改所在的位置) 【参考方案1】:

最简单的解决方案是进行“临时”提交:

# 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 中,提交是如此的快速和廉价,以至于没有理由产生这种感觉。只需进行临时提交,然后将其丢弃。

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

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

【讨论】:

请注意,同样的评论也适用于 Mercurial:- 提交很便宜(并且可以使用 'hg commit --amend')- 考虑使用 rebase【参考方案2】:

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

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

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

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

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

【讨论】:

【参考方案3】:

可能是你的最佳选择

继续在本地使用 Mercurial 使用 Hg-git 获得与远程 Git 存储库的互操作性 - 与旧的良好工作流

您将摆脱 Git 的无脑,并在其中提取任何新的变更集(创建|添加变更集到)您分支中的匿名分支(仍然是本地提交),而不会触及您的历史记录。您可以在需要时检查|合并磁头

【讨论】:

以上是关于如何在 git 中更新我的代码库,而无需删除、存储或签入我当前的更改?的主要内容,如果未能解决你的问题,请参考以下文章

尝试 couchapp 推送我从团队的 Git 存储库更新的代码时出错

如何使 Git 提交哈希在 C++ 代码中可用而无需重新编译?

如何在 Mercurial 中更新现有克隆存储库的 URL

Git - 如何从存储库(devops)中删除文件而不在本地克隆它

如何在服务器上提交更改并从代码存储库中提取更新而不会发生冲突?

检查目录是不是为 git 存储库(无需 cd 进入)