如何使用git branch来提交我的代码而不影响主线代码

时间:2012-03-15 22:55:07

标签: git

我正在开发我们当前发布的分支“base”,它将很快发布。最后一刻我的功能被拔出,我在基础分支上有一些未推送的更改。这是一个很大的集合,包括大约400次提交的巨大合并。由于它被推,我不能把它推到基地。另外,我不想重新合并。

所以,我想知道我是否可以这样做:

来自具有合并更改的树,分支一个新分支,说“post-release”,然后将其推送到存储库而不更改基础。可能吗?我想防止意外提交基础(我看到有时多个refs在一次推送中得到更新)。

此图表可能有助于查看问题。

master
------------------------------------------->
    \                           
     \---release1--->            
                     \
                      \--base (releasing soon)------>
                          (I have some changes merged on a local tree 
                           based off "base" but not pushed to base)     

由于base将被释放,我不想推送我的本地更改,而是在某些分支中保留这些更改(我可以将其推送到repo。)。

理想情况下,我应该开始创建一个基于“基础”分支的分支,然后合并它,但我没有这样做。

2 个答案:

答案 0 :(得分:1)

首先,如果你担心的是保存合并,那就是rerere的用途。

除此之外,你想要做的事情是:在分支中“保存”你的变化很容易。

只需git branch my_new_branch,然后git reset --hard base(确保首先提交所有工作副本更改!reset --hard删除非索引更改!)。现在,您有两个分支,当前HEAD位于(和{{​​1}}处,而第二个分支(base)仍然包含您未经撤消的更改并跟踪my_new_branch。您可以根据需要多次使用basegit merge,以便在重新整合git rebase之前使my_new_branch保持最新状态。

答案 1 :(得分:1)

我不确定我理解你的问题。从图中我们可以尝试构建一些新的图表。显然你有一个远程共享仓库:

[master]  * --- [possibly more commits]
           \
[release1]  * --- A --- B --- C
                   \
[base]               D --- E

在你自己的私人回购中:

[master]  * --- [possibly more commits]
           \
[release1]  * --- A --- B --- C
                   \
[base]               D --- E
                      \
[devel]                 F --- G --- I --- J
                         \               /
                           --- H --------

这样分支“devel”的尖端是提交J,它是FGI + H的合并,都指向D(在“base”中),指向“A”(在release1中)。现在有人计划通过合并ABC + DE来发布他们将会发布的“release2”吗?

如果你希望你的“devel”分支基于该合并,你只需要重新定义合并的结果(它还不存在,所以你必须等待)。

或者,也许您的意思是上面的远程共享仓库或多或少准确,但您拥有自己的“devel”分支。也许你的(本地)repo commit-tree看起来更像是这样:

[master]  * --- [possibly more commits]
           \
[release1]  * --- A --- B --- C
                   \
[base]               D --- E --- F --- G --- I --- J
                                  \               /
                                   --- H ---------

如果您希望它看起来像这样:

[master]  * --- [possibly more commits]
           \
[release1]  * --- A --- B --- C
                   \
[base]               D --- E
                            \
[devel]                      F --- G --- I --- J
                              \               /
                               --- H ---------

然后你可以从创建一个挂起提交E:

的“devel”分支开始
git branch devel E  # use the commit-ID for commit E

然后重新指向本地分支“base”以提交E:

git branch -d base; git branch base E # again you'll want the sha1
# or: git update-ref refs/heads/base E

并且你已经完成了(现在,无论如何;你最终还是要在以后修改你的“devel”分支。)


注意(我认为在理解分支时可能会有很多帮助):我在我的图表中将分支标签放在每个树级别的左侧,但事实上,分支标签坐在“右边”(在每个分支的“尖端”,就像它一样)。当您在分支上执行“git commit”时,会添加新提交,然后更新分支提示。我怀疑大多数人“考虑”分支,好像标签设置一次,当你执行“git branch”命令,然后永远呆在那里 - 但这不是它们的工作方式。分支标签跟随分支的尖端。分支的“水平部分”,当您查看提交树时,如果它是按照我在此处绘制的方式绘制的,则必须根据提交树结构进行处理。