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)`
因此,这意味着无法推送B1
和B2
。我知道这种情况正在发生,因为这些提交在任何分支上都不存在。现在,如果我将我的分支切换回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
中保存提交。
感谢任何建议/指示。
答案 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(并使用HEAD
或master
语法查找)。但是如果你没有给他们附上一个名字参考,他们会及时离开。
答案 3 :(得分:0)
使用--interactive选项检查git rebase。