创建没有(先前)本地历史记录的远程分支

时间:2020-04-21 18:14:13

标签: git github

我的计算机中有一个本地分支,但是我想创建一个完全没有历史记录的新分支(最初只是一次提交),并在远程使用此新分支。我该怎么办?

例如本地分支机构具有:

commit1 commit2 commit3

但是我希望我的新分支只有 commit0 ,这是最后一个状态( commit3 )的代码,没有以前的历史记录。然后,我希望可以轻松地合并内容,例如,如果我在本地分支机构中执行 commit4 ,我希望仅更改 commit0 commit4 远程分支。

如何实现这一目标的最佳方法?我主要希望“压缩”远程分支中的内容,而不必删除本地分支中的历史记录,以便仍然可以在本地分支上工作。

1 个答案:

答案 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子图是不相交的子图。