什么是`git checkout --orphan`?

rnmwe5a2  于 2023-04-19  发布在  Git
关注(0)|答案(5)|浏览(428)

我刚刚发现了git checkout --orphan,但我不知道如何使用它。它的帮助页面上说它会创建一个新的无父级分支
master分支中,我尝试了git checkout --orphan br,只看到工作目录中的文件更改为“Changes to be committed”,并且git logfatal: bad default revision 'HEAD'
那么使用git checkout --orphan有什么好处呢?

cyvaqqii

cyvaqqii1#

git checkout --orphan的核心用途是在一个非新的存储库上创建一个类似git init状态的分支。
如果没有这个功能,* 所有 * 的git分支都将有一个共同的祖先,即初始提交。这是一种常见的情况,但绝不是唯一的情况。例如,git允许您在单个仓库中跟踪多个独立的项目作为不同的分支。
这就是为什么你的文件被报告为“要提交的更改”:在git init状态下,第一次提交还没有被创建,所以所有的文件对git来说都是新的。

qvtsj1bj

qvtsj1bj2#

它被GitHub Pages使用,它将仓库的网站存储在仓库中,但在一个单独的分支上。除了网站的历史记录外,没有理由在这个分支上存储任何东西。

wdebmtf2

wdebmtf23#

我们正在从私有仓库转移到公共仓库,由于敏感的提交信息,我们希望将分支重置为new并将其作为空白分支推送。下面是一个典型的工作流程:
how to delete all commit history in github?

46qrfjad

46qrfjad4#

另一个可能有用的用例是构建需要特定.git文件夹设置(例如用户,远程url)的机器或虚拟示例进行测试,并且由于空间限制而丢弃所有历史记录。这通常是不使用Docker等容器的遗留设置的情况。
这通常是为专用的部署分支而不是处理master。一旦新的分支被推送到远程,在示例上做:

git clone [remote-url] --branch [name] --single-branch [folder]

直接使用master时,浅克隆是更好的选择(不推荐):

git clone -–depth [depth] [remote-url]
whlutmcx

whlutmcx5#

在我看来,这个命令可能有些令人惊讶。对于这个命令,您可能有两种截然不同的期望:
1.使用截断的历史记录重新开始(相同的树)
1.全新开始(新树;你必须从头开始添加文件)

1:它的实际作用

正如JB.所解释的,git checkout --orphan <branch name>将:
1.把你放到一个 orphan 分支上,也就是一个还没有提交的分支
1.转移您来自的树(如果您在master上,则为master^{tree}
1.保留任何未暂存和未跟踪的文件
这意味着你之前提交的 trees 和你之后立即创建的提交的 * trees * 是相等的:[1]

$ # 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仍然存在)。

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建议你使用的命令迂回,如果你想从一个新的树开始:

git checkout --orphan orphan
git rm -rf .

然后你也可以做(由我添加):

git clean --force -d

注意事项

1.好吧,我猜实际上它会是完全相同的树,因为它们具有相同的哈希。
1.说:

$ <make orphan branch>
 $ vim branch-descriptions.txt
 $ git add branch-descriptions.txt
 $ git commit --message "Init: descriptions"

相关问题