我们正在使用 git 存储库来存储我们的项目。我们有我们的分支离开原来的分支。但是现在我们想创建一个小的新项目来跟踪一些文档。为此,我们希望创建一个新的空分支来开始存储我们的文件,并且我希望网络的其他用户克隆该分支。
我们怎么能做到这一点?
我尝试了一些东西,但它们没有用。
$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc
它似乎可以推送分支,但是当我进行提取或拉取时,它会从其他分支下载信息,然后我还会从其他项目中获取一些额外的文件。最好的解决方案是什么?
submodule
,例如 docs/
指向该其他存储库。或者,如果您想稍后合并代码,请将其添加为远程。
.gitignore
的文件,并且还要在两个根(分支)之间不断切换。所以我也支持新的 repo 方法,在一个新文件夹中,拥有相同的遥控器,并推送到另一个分支。
您可以创建一个孤立的分支:
git checkout --orphan <branchname>
这将创建一个没有父级的新分支。然后,您可以使用以下命令清除工作目录:
git rm --cached -r .
并添加文档文件,提交它们并将它们推送到 github。
pull 或 fetch 将始终更新有关所有远程分支的本地信息。如果您只想拉取/获取单个远程分支的信息,则需要指定它。
正确的答案是创建一个孤儿分支。我详细解释了如何做到这一点on my blog.(存档链接)
...在开始之前,请升级到最新版本的 GIT。为确保您运行的是最新版本,请运行 which git 如果它吐出旧版本,您可能需要使用包含刚刚安装的版本的文件夹来扩充您的 PATH。好的,我们准备好了。将 cd 放入包含 git checkout 的文件夹后,创建一个孤立分支。对于此示例,我将分支命名为“mybranch”。 git checkout --orphan mybranch 删除孤立分支 git rm -rf 中的所有内容。进行一些更改 vi README.txt 添加并提交更改 git add README.txt git commit -m "Adding readme file" 就是这样。如果你运行 git log 你会注意到提交历史是从头开始的。要切换回您的主分支,只需运行 git checkout master 您可以通过运行 git checkout mybranch 返回到孤立分支
像这样创建一个空的新分支:
true | git mktree | xargs git commit-tree | xargs git branch proj-doc
如果您的 proj-doc 文件已经在单个子目录下的提交中,您可以这样创建新分支:
git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc
如果这会让您有很多 git rm
和 git mv
工作要做,这可能比 git branch --orphan
更方便。
尝试
git branch --set-upstream proj-doc origin/proj-doc
看看这是否有助于解决您获取过多的问题。此外,如果您真的只想获取单个分支,那么在命令行上指定它是最安全的。
git checkout --orphan new-branch; git reset --hard
xargs
有什么用?
git push --set-upstream origin proj-doc:projdoc
(从您当前的分支)将空分支推送到远程,而不是 git branch --set-uptream-to
。
如果您的 git 版本没有 --orphan 选项,则应使用此方法:
git symbolic-ref HEAD refs/heads/<newbranch>
rm .git/index
git clean -fdx
做了一些工作后:
git add -A
git commit -m <message>
git push origin <newbranch>
git clean
可以删除您不想删除的文件!在使用 -f
选项真正运行它之前,首先运行 git clean -ndx
以查看它将删除哪些文件。
假设您有一个包含文件/目录的 master
分支:
> git branch
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n
一步一步如何制作一个空分支:
git checkout --orphan new_branch_name 在执行以下命令之前确保您在正确的目录中: ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_ git rm -rf . touch new_file git add new_file git commit -m '在新分支中添加第一个文件' git push origin new_branch_name
在第 2 步中,我们只是在本地删除所有文件,以避免与新分支上的文件和您保留在 master
分支中的文件混淆。然后,我们在步骤 3 中取消链接所有这些文件。最后,步骤 4 及之后的步骤正在使用我们新的空分支。
完成后,您可以轻松地在分支之间切换:
git checkout master
git checkout new_branch
最好的解决方案是使用 --orphan
选项创建一个新分支,如下所示
git checkout --orphan <branch name>
这样,您将能够创建一个新分支并直接结帐到新分支。这将是一个无父分支。
默认情况下,--orphan
选项不会删除工作目录中的文件,因此您可以通过以下方式删除工作目录文件:
git rm --cached -r
详细说明 --orphan 的作用:
--orphan
索引和工作树的调整就像您之前运行过 git checkout
当您想从提交中发布树而不暴露其完整历史时,这可能很有用。您可能希望这样做以发布一个项目的开源分支,该项目的当前树是“干净的”,但其完整历史记录包含专有或其他受累的代码位。
如果你想开始一个断开的历史记录,记录一组与
2022 更新
从 Git 2.23 开始,您可以使用 git switch --orphan <new branch>
创建一个没有历史记录的空分支。与 git checkout --orphan
不同,所有跟踪文件都将被删除。
一旦你在这个分支上确实有提交,它就可以被推送到远程存储库:
git switch --orphan <new branch>
git commit --allow-empty -m "Initial commit on orphan branch"
git push -u origin <new branch>
您可以创建一个孤立的分支:
git checkout --orphan <branchname>
这将创建一个没有父级的新分支。然后,您可以使用以下命令清除工作目录:
git rm --cached -r .
然后你只需用空提交提交分支,然后推送
git commit -m <commit message> --allow-empty
git push origin <newbranch>
我找到了这个帮助:
git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
我找到了here
如果您使用 git 2.23 或更高版本,您可能习惯于 git switch
和 git restore
而不是 git checkout
所以如果你需要一个空分支试试这个:
git switch --orphan YourNewBranch
而已 :))
git checkout --orphan <branch>
时;我没有看到任何 <branch> 的列表。在git branch
。git checkout --orphan
之后,可以使用git reset --hard
删除剩余的文件。git checkout --orphan <branch>
之后看不到分支的原因是它还没有任何提交。在第一次提交git branch
后打印新分支。