我们有以下历史
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
分支的整个工作树。但是必须有一种不同的,更加迷人的方式!
答案 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
两者都应该产生完全相同的分支结构。 (当然,第二个没有失去历史的危险......)