如何在 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++ 代码中可用而无需重新编译?
Git - 如何从存储库(devops)中删除文件而不在本地克隆它