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



Master Branch 有这样的提交: A -> B -> C(HEAD) . HEADC.

我做了什么:

我签出了B并在其上进行了提交。

现在树看起来像这样:

   A -> B -> C(主((原产地/主(         |         |-> B1 -> B2(头部(

项目目录上的git status给我以下消息:

# 当前不在任何分支上。没有要提交的内容(工作目录清理('

所以这意味着B1B2不能被推。我知道这种情况正在发生,因为这些提交不存在于任何分支上。现在,如果我将分支切换回 master,这些提交会丢失吗?我期待在这些未命名的分支上有更多的提交(B3, B4 ... BN(,之后我希望C它之上。从本质上讲,我希望以这种方式看到master分支:

   A -> B -> B1 -> B2 -> B3 -------> BN -> C(主((原产地/主(

或者至少这样:

   A -> B ---------------------> C(主((原产地/主( -> D         |                                                   ^         |                                                   |         |-> B1 -> B2 -> -> ...->BN--------------------------

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

任何建议/指示不胜感激。

您想要的结果

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

除非你可以在远程存储库中重写 C,否则是不可能的;这样做会给基于 C 做工作的其他人带来问题。

第二种偏好

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

很简单:正如 Magnus 所说,如果你给 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)

注意:如果你出于任何原因想将你的提交推送到,但你不希望它们在 master 上,你可以简单地推送 bbranch,它会带走你的提交。然后,您需要确保没有其他人会触摸 bbranch,或者将您的本地副本设置为远程跟踪分支。

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

如果我理解正确的话,您所要求的是一种使提交在外部存储库中可见的方法,当它们不是分支的一部分时

提交 B1

和 B2 可通过其 SHA1 哈希访问,但不能通过任何命名引用访问。因此,从 git 的角度来看,它们是"垃圾",最终会被git gc清理(经过您的设置定义的足够时间后(。

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

因此,如果您不希望更改成为其他分支的一部分,但仍然想推送它们,则应使它们成为自己的分支。这将具有允许您推送它们的效果,为您提供访问它们的句柄,并防止它们被垃圾回收(您不希望(。

另一方面,如果您准备使松散提交成为master分支的一部分,则需要git rebase(将它们放在当前master之上(或git merge(将它们与 master 集成,同时保留您当前拥有的准确历史记录(。您也可以重写master分支以包含提交作为"第一个"示例,但我不建议这样做(特别是如果您已经在另一种状态下推送master(。

为了更明确地回答您的问题"如果我将HEAD切换回master,这些提交会丢失吗?",答案是"最终,是的,但立即,否。您可以签出提交的显式 SHA1 ID(并使用 git reflogHEAD@{1} 语法查找这些 ID(。但是,如果您不将命名的引用附加到它们,它们就会及时消失。

不知道为什么不为提交创建新分支。以下是我会做的:

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 等(。只要您提交了更改,您就是安全的。

使用 -

-interactive 选项检查 git 变基。

相关内容

  • 没有找到相关文章

最新更新