在Mercurial或Git中进行推送而没有提交

9

似乎无论是Mercurial还是Git,在我没有先提交的情况下,我就无法推送?

所以如果我没有提交(尚未准备好),我就不能将代码推送到远程服务器上备份吗?这段代码在笔记本电脑中,需要随身携带,有点易碎。

5个回答

17

您总是随时准备着提交。

经常进行提交,可以将其提交到正在进行的分支并尽可能广泛地分发。

当您达到当前所谓的“准备提交”的状态时,请检查您的分支与上游的差异,并执行rebase -i以清理它并使其看起来符合您的要求。

这比试图在提交之前非常努力地使一切都完美要更容易、更安全,并且通常会给您带来更好的结果。请记住:提交不一定代表宇宙中所需的永久状态,它只是您所在的某个位置。如何发布它取决于您。

Git使得发布一个名为do-not-look-at-me的正在进行工作的分支非常容易,您可以在任何时间点以任何形式将其移动到您认为最适合您的正式代码库中。


7

只需创建一个新的临时分支。

将未完成的更改提交到该分支,并将该分支推送。

当您的更改准备好时,请使用rebase合并您未完成的提交,然后将结果合并到您的master中并删除该临时分支。(您可以使用git push origin :branch从远程存储库中删除分支 - 注意分支名称前面的冒号。)

永远没有理由不提交您的更改,尽管在它们尚未准备好时可能有不提交到特定分支的原因。


3

没错。Push的目的是与其他存储库共享一个或多个提交。它们都不是主要用作备份(尽管有些人会将它们用作备份)。

有很多专业的备份工具和在线服务。请参见个人使用的在线备份列表。


1
拥有一个单独的备份系统可能会显得有点麻烦。如果只有Git或Mercurial可以让人们为未提交的推送设置一个仓库就好了。类似于git push --uncommitted ssh://somewhat/peter/tmp这样的方式。 - nonopolarity
2
@Jian,再次强调,这些不是备份程序。旨在的想法是进行一个或多个有意义的提交,然后分享它们。拥有同时包含提交和正在进行的工作的存储库并没有太多意义。 - Matthew Flaschen
“独立备份系统”也可以是一个存储库。这是我的工作方式:我在个人存储库中编写代码(经常提交),并且有一个中央存储库与同事共享我的工作(较少推送)。为了备份我在个人存储库中的工作,我有第三个存储库:我的个人存储库中的钩子每次提交时都会在该备份存储库上执行推送。这样,备份操作完全透明(时间惩罚可以忽略不计)。 - barjak
相比之下,TFS允许进行未提交的远程备份:Shelvesets。 - Lee Grissom

2
让我看看您的情况是否正确。您有:
1. 工作目录中一些未提交的编辑,您不想立即提交; 2. 本地存储库中一些未推送的更改;
但是您烦人的老板在您背后拍了拍您,说:“嘿!您什么时候推送您在员工会议上提到的更改?我们都在等着呢!”他正在那里等待您这样做,那么您如何快速轻松地将他甩开呢?
这很容易。您需要使用 MQ 扩展。它与标准 Mercurial 安装捆绑在一起。
首先将其添加到您的 .hgrc 文件中。
[extensions]
mq =

将未提交的编辑内容暂存到补丁队列条目中,请按照以下步骤进行:
$ hg qnew stash
$ hg qpop

现在推送你之前的提交,这样你的老板就不会再催你了。
$ hg push

最后,这样恢复您的工作目录:
$ hg qpush

此时,您仍然在您的补丁队列中记录了该补丁。现在它只是被标记为“已应用”。完成代码编辑后,请执行以下操作以使用您完成的编辑和提交日志消息更新补丁,然后将补丁最终化为更改集:
$ hg qrefresh -m"Commit message goes here."
$ hg qfinish stash

这是基础知识,但如果你想变得更加高级,还有很多其他操作可供选择。MQ扩展就像一个全新的修订控制世界,隐藏在Mercurial仓库下面。它就像Git stash,但更加灵活,稍微不那么令人困惑。
学习、变异、进化!

2

没错,你不能推送未提交的更改。但是,仅仅因为你的更改还没有准备好,这并不意味着你不能提交它们。我对Mercurial没有经验,但是在Git中,你可以修改已提交的提交记录(git commit --amend)来进行修改。你也可以进行一系列的提交,然后进行交互式变基以将它们合并为一个单独的提交记录。或者你可以根据需要进行提交,并不担心确保你的历史记录完全干净。


1
从上游rebase恢复所解释的,--amend可能会变成一个很大的麻烦。任何从pre-amend版本拉取的人一旦得到修改后的版本就必须修改他们的历史记录。 - Matthew Flaschen
1
只有当他推送的仓库是共享的时候,这才是相关的。如果他只是用它作为备份目的,那就不应该有问题。 - mkarasek
1
...并且该分支是官方的。如果您推送到名为my-wip的分支,并且有人认为他们应该围绕此构建产品,则他们应该感到困惑。 - Dustin

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