将分支移动到历史记录中的另一个点

时间:2011-08-30 19:05:45

标签: git branch

我们有以下历史

start         master  public
|                 |   |
v                 v   v
o---o-- ... --o---o---o

不幸的是,我们在包含一些敏感数据的master分支中做了一些提交。我们在一个名为public的独立分支中进行了修改。现在我们想要“切断”public分支,以便在public中获得完整而干净的“状态”,但不会通过master包含折衷的历史记录部分。换句话说,我们想要以下新历史:

start         master
|                 |
v                 v
o---o-- ... --o---o
 \
  o <- public

现在检出public将导致与原始情况相同的工作树,但没有明智的历史细节。然后,我们将旧的master分支保留下来:将其重命名为unsafe,并从新的master分支中详细说明新的public分支。通过这种方式,我们可以保留unsafe中的旧历史记录,并且能够毫无后顾之忧地将public分支推向公众:

start         unsafe
|                 |
v                 v
o---o-- ... --o---o
 \
  o---o-- ... --o <-- public
   \           /
    o-- .. --o-- ... --o <-- master

实现此目的的git命令是什么?

PS:当然我们可以签出start,创建一个新的分支并在那里提交public分支的整个工作树。但是必须有一种不同的,更加迷人的方式!

1 个答案:

答案 0 :(得分:3)

将公共中的所有提交合并到一个提交中的正确方法(即将多个提交合并为一个,或完全删除单个提交等)是使用git rebase -i。所以你要做的是(假设第一次提交有一个标签start,如图所示):

git checkout public
git rebase -i start

出现编辑器窗口,您可以在其中编辑所有修补程序的顺序 只需使用squash即可获得所有补丁。保存该文件并关闭编辑器后,git将根据请求重新组合您的修补程序历史记录。当然,主分支根本不会改变它的历史。

要将您当前的主程序重命名为不安全并在公共场所开始所有进一步的开发,我会这样做:

git checkout -b unsafe master # <- creates a new branch "unsafe"
git checkout master
git reset --hard public    # <- forces master branch to point to public

如果你没有创建unsafe分支,硬重置将松开master中的所有提交,你将无法(轻松)访问它们。因此,请确保您真正创建了该分支。

另一种方法是将master重命名为unsafe,然后创建一个新的主分支:

git branch -m master unsafe  # renames master to unsafe
git checkout -b master public  # creates new branch master as a copy of public

两者都应该产生完全相同的分支结构。 (当然,第二个没有失去历史的危险......)