2

Master分支有这样的提交:A -> B -> C(HEAD)HEAD是在C

我做了什么 :

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

现在树看起来像这样:

    A -> B -> C(master)(原点/master)
         |
         | -> B1 -> B2(头部)

git status在项目目录上给我以下信息:

# 目前不在任何分支上。
没有什么可提交的(工作目录干净)`

所以它意味着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.

任何建议/方向表示赞赏。

4

4 回答 4

3

你想要的结果

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)

现在,如果您出于某种原因想要将B1B2推送到原点,您可以正常合并和推送

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)

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

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

于 2012-02-23T16:57:59.620 回答
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 等)。只要您提交了更改,您就是安全的。

于 2012-02-23T16:08:05.240 回答
1

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

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

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

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

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

为了更明确地回答您的问题“如果我切换HEADmaster,这些提交会丢失吗?”,答案是“最终,是,但立即,不是。”。您可以检查提交的显式 SHA1 ID(并使用git reflog、 或HEAD@{1}语法查找那些)。但是如果你不给它们附加一个命名的引用,它们就会消失。

于 2012-02-23T16:13:36.733 回答
0

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

于 2012-02-23T16:12:40.520 回答