我刚刚发现了git checkout --orphan,但我不知道如何使用它。它的帮助页面上说它会创建一个新的无父级分支。在master分支中,我尝试了git checkout --orphan br,只看到工作目录中的文件更改为“Changes to be committed”,并且git log说fatal: bad default revision 'HEAD'。那么使用git checkout --orphan有什么好处呢?
git checkout --orphan
master
git checkout --orphan br
git log
fatal: bad default revision 'HEAD'
cyvaqqii1#
git checkout --orphan的核心用途是在一个非新的存储库上创建一个类似git init状态的分支。如果没有这个功能,* 所有 * 的git分支都将有一个共同的祖先,即初始提交。这是一种常见的情况,但绝不是唯一的情况。例如,git允许您在单个仓库中跟踪多个独立的项目作为不同的分支。这就是为什么你的文件被报告为“要提交的更改”:在git init状态下,第一次提交还没有被创建,所以所有的文件对git来说都是新的。
git init
qvtsj1bj2#
它被GitHub Pages使用,它将仓库的网站存储在仓库中,但在一个单独的分支上。除了网站的历史记录外,没有理由在这个分支上存储任何东西。
wdebmtf23#
我们正在从私有仓库转移到公共仓库,由于敏感的提交信息,我们希望将分支重置为new并将其作为空白分支推送。下面是一个典型的工作流程:how to delete all commit history in github?
new
46qrfjad4#
另一个可能有用的用例是构建需要特定.git文件夹设置(例如用户,远程url)的机器或虚拟示例进行测试,并且由于空间限制而丢弃所有历史记录。这通常是不使用Docker等容器的遗留设置的情况。这通常是为专用的部署分支而不是处理master。一旦新的分支被推送到远程,在示例上做:
git clone [remote-url] --branch [name] --single-branch [folder]
直接使用master时,浅克隆是更好的选择(不推荐):
git clone -–depth [depth] [remote-url]
whlutmcx5#
在我看来,这个命令可能有些令人惊讶。对于这个命令,您可能有两种截然不同的期望:1.使用截断的历史记录重新开始(相同的树)1.全新开始(新树;你必须从头开始添加文件)
正如JB.所解释的,git checkout --orphan <branch name>将:1.把你放到一个 orphan 分支上,也就是一个还没有提交的分支1.转移您来自的树(如果您在master上,则为master^{tree})1.保留任何未暂存和未跟踪的文件这意味着你之前提交的 trees 和你之后立即创建的提交的 * trees * 是相等的:[1]
git checkout --orphan <branch name>
master^{tree}
$ # Let’s say that you’re currently on `master` $ git checkout --orphan orphan $ git commit --message 'A new start' $ git diff master
diff没有输出,因为树是相等的。这有效地截断了master上的所有提交(当然master仍然存在)。
这是我期望它做的:1.把你放在一个孤儿分支1.给予你一棵空树用例可能是添加一些文件来记录一些存储库范围的metadata,例如分支元数据。事实证明,您可以使用git switch --orphan <branch name>来完成此任务,因为它几乎完成了我期望git checkout --orphan <branch name>完成的任务:1.把你放在一个孤儿分支
git switch --orphan <branch name>
.gitignore
git clean --force -d
但请注意,在撰写本文时(Git 2.40.0),此命令被标记为“EXPERIMENTAL”。
也许你不想使用一个实验性的命令。这是man git checkout建议你使用的命令迂回,如果你想从一个新的树开始:
man git checkout
git checkout --orphan orphan git rm -rf .
然后你也可以做(由我添加):
1.好吧,我猜实际上它会是完全相同的树,因为它们具有相同的哈希。1.说:
$ <make orphan branch> $ vim branch-descriptions.txt $ git add branch-descriptions.txt $ git commit --message "Init: descriptions"
5条答案
按热度按时间cyvaqqii1#
git checkout --orphan
的核心用途是在一个非新的存储库上创建一个类似git init
状态的分支。如果没有这个功能,* 所有 * 的git分支都将有一个共同的祖先,即初始提交。这是一种常见的情况,但绝不是唯一的情况。例如,git允许您在单个仓库中跟踪多个独立的项目作为不同的分支。
这就是为什么你的文件被报告为“要提交的更改”:在
git init
状态下,第一次提交还没有被创建,所以所有的文件对git来说都是新的。qvtsj1bj2#
它被GitHub Pages使用,它将仓库的网站存储在仓库中,但在一个单独的分支上。除了网站的历史记录外,没有理由在这个分支上存储任何东西。
wdebmtf23#
我们正在从私有仓库转移到公共仓库,由于敏感的提交信息,我们希望将分支重置为
new
并将其作为空白分支推送。下面是一个典型的工作流程:how to delete all commit history in github?
46qrfjad4#
另一个可能有用的用例是构建需要特定.git文件夹设置(例如用户,远程url)的机器或虚拟示例进行测试,并且由于空间限制而丢弃所有历史记录。这通常是不使用Docker等容器的遗留设置的情况。
这通常是为专用的部署分支而不是处理master。一旦新的分支被推送到远程,在示例上做:
直接使用master时,浅克隆是更好的选择(不推荐):
whlutmcx5#
在我看来,这个命令可能有些令人惊讶。对于这个命令,您可能有两种截然不同的期望:
1.使用截断的历史记录重新开始(相同的树)
1.全新开始(新树;你必须从头开始添加文件)
1:它的实际作用
正如JB.所解释的,
git checkout --orphan <branch name>
将:1.把你放到一个 orphan 分支上,也就是一个还没有提交的分支
1.转移您来自的树(如果您在
master
上,则为master^{tree}
)1.保留任何未暂存和未跟踪的文件
这意味着你之前提交的 trees 和你之后立即创建的提交的 * trees * 是相等的:[1]
diff没有输出,因为树是相等的。
这有效地截断了
master
上的所有提交(当然master
仍然存在)。2:您可能期望它执行的操作
这是我期望它做的:
1.把你放在一个孤儿分支
1.给予你一棵空树
用例可能是添加一些文件来记录一些存储库范围的metadata,例如分支元数据。
事实证明,您可以使用
git switch --orphan <branch name>
来完成此任务,因为它几乎完成了我期望git checkout --orphan <branch name>
完成的任务:1.把你放在一个孤儿分支
.gitignore
之类的东西忽略的所有内容git clean --force -d
但请注意,在撰写本文时(Git 2.40.0),此命令被标记为“EXPERIMENTAL”。
用
git checkout --orphan <branch name>
完成同样的事情也许你不想使用一个实验性的命令。这是
man git checkout
建议你使用的命令迂回,如果你想从一个新的树开始:然后你也可以做(由我添加):
注意事项
1.好吧,我猜实际上它会是完全相同的树,因为它们具有相同的哈希。
1.说: