Master
Branch 有这样的提交: A -> B -> C(HEAD)
. HEAD
在C
.
我做了什么:
我签出了B
并在其上进行了提交。
现在树看起来像这样:
A -> B -> C(主((原产地/主( | |-> B1 -> B2(头部(
项目目录上的git status
给我以下消息:
# 当前不在任何分支上。没有要提交的内容(工作目录清理('
所以这意味着B1
和B2
不能被推。我知道这种情况正在发生,因为这些提交不存在于任何分支上。现在,如果我将分支切换回 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 reflog
或 HEAD@{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 变基。