管理git分支

时间:2012-04-12 15:49:19

标签: git

我正在寻找一些关于如何使用Git实现以下功能的建议:

分支机构: 主人(稳定的分支) 不稳定

所有工作都在不稳定的分支中完成,其中代码可能在任何时候都不起作用,但我推动它来保存我的进度。当我达到一个稳定的点时,我想让主人与不稳定的人完全一样。在合并并选择不稳定的分支状态时,我不想完成所有更改,我只是希望它使用不稳定的分支状态并使master完全相同。它可能需要删除一些文件,添加一些文件,更改一些文件。我不想将所有提交从unstable复制到master,但只需添加一个包含所有更改的新提交。

我成功实现此目的的唯一两种方法是

git checkout master
git reset --hard unstable

但是这似乎复制了不稳定的所有提交,然后我无法将master推送到远程(被远程拒绝) 或

git checkout master
rm -rf ./*

然后从另一个分支复制所有文件并提交。

必须有更好的方法来实现这一目标,或者采用完全不同的方法吗?

3 个答案:

答案 0 :(得分:4)

git checkout master
git merge --squash unstable
git commit

自上次合并以来,将对所有更改(不稳定分支中的提交)进行一次提交。

答案 1 :(得分:4)

master中进行开发时,unstable听起来并没有改变。您有两种选择,具体取决于您希望最终树的外观。

假设你从这棵树开始:

A---B         (master)
     \
      C---D   (unstable)

如果您希望master只是快进到unstable(单个中继,masterunstable指向同一个提交):

git checkout master
git rebase unstable

结果树:

A---B---C---D  (master, unstable)

如果您想要合并提交(unstable分支关闭,然后合并回master):

git checkout master
git merge --no-ff unstable

结果树:

A---B-------D'  (master)
     \     /
      C---D     (unstable)

更新由于@KurzedMetal非常友好地指出,您不需要其中任何一个选项。我想他的回答是正确的。 git merge --squash unstable master; git commit之后的树看起来像:

A---B---------E  (master)
     \
      C---D      (unstable)

请注意masterunstable之间缺乏关系。在此之后,您可能希望使用以下内容重置unstable

git checkout unstable
git reset --hard master

导致:

A---B---E       (master, unstable)
但是,我不确定你为什么要使用这种策略。失去所有历史对我来说似乎是不明智的。

答案 2 :(得分:0)

git checkout master

git merge unstable

然后你将进行合并提交,而你在master中的状态与unstable分支完全相同。

一旦你认为你的合并中断了,你就可以回退一次提交(合并提交),并将恢复到原始状态。小孩的东西:)