我的计算机中有一个本地分支,但是我想创建一个完全没有历史记录的新分支(最初只是一次提交),并在远程使用此新分支。我该怎么办?
例如本地分支机构具有:
commit1 , commit2 , commit3
但是我希望我的新分支只有 commit0 ,这是最后一个状态( commit3 )的代码,没有以前的历史记录。然后,我希望可以轻松地合并内容,例如,如果我在本地分支机构中执行 commit4 ,我希望仅更改 commit0 和 commit4 远程分支。
如何实现这一目标的最佳方法?我主要希望“压缩”远程分支中的内容,而不必删除本地分支中的历史记录,以便仍然可以在本地分支上工作。
答案 0 :(得分:2)
我希望我的新分支仅具有commit0,它是最后一个状态(commit3)的代码,没有以前的历史记录。
您可以轻松获得它:
git checkout commit3 # get index and work-tree set up
git status # make sure you're on commit3 and things are otherwise clean
然后:
git checkout --orphan new-branch
git commit
,并且您在新分支上有了这个新的commit0
,后面没有任何历史记录:commit0
是新的 root提交。
然后我希望轻松地合并内容,例如,如果我在本地分支中确实执行commit4,则希望在远程分支中仅具有commit0和commit4更改。
您无法完全获得此权限。您可以 进行设置,以使您拥有commit0和commit5,其中commit5的快照与commit4的快照匹配,并且将commit0作为其父对象。但是commit4(具有那个哈希ID的提交)永远拥有commit3作为其父项。哈希ID在所有 Git存储库中是通用的,并且任何提交的任何部分都不能更改,包括其父链接。
重要的是要意识到Git中的 branch 这个词是模棱两可的:参见What exactly do we mean by "branch"?有时 branch 表示提交链,终止于一项具体的提交。有时,这意味着分支名称。 Git储存库都有自己的专用分支名称,因此没有必要通过网址master
到达Git储存库中的$url1
并命名与master
在Git储存库中{ {1}}个名称。
历史记录是 提交。通过使用历史记录进行合并。如果两个提交链没有连接,则没有任何内容可以合并。
Git确实允许您构建自己的解决方案:它是一个工具集,而不是本身的解决方案。您可以编写您自己的 Git命令,该命令可将新快照添加到您选择的分支名称中,而无需在实际的工作分支中使用任何现有的提交。这可以让您构建所需的设备:
$url2
将运行您的git my-private-copy-to new-branch <commit-specifier>
命令,该命令将使用树(从参数2)向指定分支(参数1)添加新的提交。请注意,在我想象的命令中-该命令不存在,而只是一个小的Shell脚本-不涉及 merging 。
由于该命令不存在,因此必须将其编写,如果要合并,可以将其放在编写的命令中,但是标准合并会使用并添加到提交图或子图中记录的历史记录,并且您已经故意确保您的主要工作和此git-my-private-copy-to
子图是不相交的子图。