如何使不可推送的提交可推送?

时间:2012-02-23 15:39:38

标签: git git-branch git-push git-commit

Master分支提交的内容如下:A -> B -> C(HEAD)HEAD位于C

我做了什么:

我检查了B并在其上做了提交。

现在树看起来像这样:

    A -> B -> C(master)(origin/master)
         |
         | -> B1 -> B2(HEAD)
项目目录中的

git status给出了以下消息:

# Not currently on any branch.
nothing to commit (working directory clean)`

因此,这意味着无法推送B1B2。我知道这种情况正在发生,因为这些提交在任何分支上都不存在。现在,如果我将我的分支切换回master,这些提交会丢失吗?我期待在这些未命名的分支上再提交一些(B3, B4 ... BN),之后我希望C能够在其上面。从本质上讲,我希望以这种方式看到master分支:

    A -> B -> B1 -> B2 -> B3 -------> BN -> C(master)(origin/master)

或至少这样:

    A -> B ---------------------> C(master)(origin/master) -> D
         |                                                    ^
         |                                                    |
         | -> B1 -> B2 -> -> ...->BN--------------------------

我有什么选择才能实现这一目标?我希望能够在origin中保存提交。

感谢任何建议/指示。

4 个答案:

答案 0 :(得分:3)

您期望的结果

A -> B -> B1 -> B2 -> B3 -------> BN -> C(master)(origin/master)
除非您可以在远程仓库中重写 C ,否则无法

;这样做会给基于 C 完成工作的其他人带来问题。

第二个偏好

A -> B ---------------------> C(master)(origin/master) -> D
     |                                                    ^
     |                                                    |
     | -> B1 -> B2 -> -> ...->BN--------------------------

很简单:正如马格努斯所说,如果你给 B2 (或者序列中当前最新的提交)一个分支名称,你将会让生活变得更轻松:这更容易记住并键入哈希值,并确保它不会被垃圾收集。

git checkout -b bbranch

A -> B -> C(master)(origin/master)
     |                                                    
     |                                                    
     | -> B1 -> B2 (bbranch)

现在,如果您想出于任何原因将 B1 B2 推送到原点,您可以正常合并和推送

git checkout master
git pull
git merge bbranch

A -> B ------> C -> D (master)
     |             /
     |            /
     | -> B1 -> B2 (bbranch)

git push

您可以保持处理 bbranch ,并在完成后再次合并

A -> B ------> C -> D -> E -> ... -> En -> F (master)
     |             /                      /
     |            /                      /
     | -> B1 -> B2 -> B3  ->  ...  -> Bn  (bbranch)

注意:如果您因任何原因想要将提交推送到来源,但 想要,那么可以简单地推送 bbranch ,并且它会接受你的提交。然后,您需要确保没有其他人接触 bbranch ,或者让您的本地副本成为远程跟踪分支。

在这种情况下,将合并步骤B2 -> D替换为git push origin bbranch

答案 1 :(得分:1)

不确定为什么不为您的提交创建新分支。这就是我要做的事情:

git checkout B
git checkout -b fix
.. do some stuff
git commit -am 'did some stuff to B'
git checkout master
git merge fix

第一个回答:

git checkout master
git merge B2

你的提交永远不会丢失,除非你清理对它们的引用(使用git gc等)。只要您提交了更改,您就是安全的。

答案 2 :(得分:1)

如果我理解正确的话,你要求的是一种在外部存储库中提交提交的方法,当它们不属于分支时。

提交B1和B2可通过其SHA1哈希访问,但不能通过任何命名引用访问。因此,从git的角度来看,它们是“垃圾”,最终将被git gc清除(在您的设置定义的足够长的时间之后)。

当您执行git push时,它会推送您的存储库“部分”的更改。这包括从命名引用可访问的所有更改集。 “垃圾”提交不会。

因此,如果您不希望更改成为某些其他分支的一部分,但您仍希望推送它们,则应将它们作为自己的分支。这将允许您推送它们,为您提供访问它们的句柄,并防止它们被垃圾收集(您不需要)。

另一方面,如果您准备将<{em> 部分<{1}}分支松散提交,则需要master(将它们置于当前{ {1}})或git rebase(将其与主人整合,同时保留您目前拥有的准确历史记录)。您也可以重写master分支以包含提交作为“第一”示例,但我不建议这样做(特别是如果您已将git merge推送到其他状态)。

要更明确地回答您的问题“如果我将master切换回master,那些提交会丢失吗?”,答案是“最终,是的,但是立即,不是。”。您可以检查提交的显式SHA1 ID(并使用HEADmaster语法查找)。但是如果你没有给他们附上一个名字参考,他们会及时离开。

答案 3 :(得分:0)

使用--interactive选项检查git rebase。