【问题标题】:Creating a new empty branch for a new project为新项目创建一个新的空分支
【发布时间】:2022-01-07 04:59:06
【问题描述】:

我们正在使用 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

似乎 push 分支没问题,但是当我执行 fetch 或 pull 时,它会从其他分支下载信息,然后我还从其他项目中获取一些额外的文件。最好的解决方案是什么?

【问题讨论】:

  • 为什么需要将它存储在分支中?分支通常用于与同一代码库的某些偏差。也许只是启动一个新的存储库会是一个更好的解决方案。
  • 嗯,我们以前做过,IIRC,我想再做一次,所以我很好奇;)
  • "for a new project" - 作为@honk,我建议将它放在一个新的存储库中。从那里有两个选项可以整合它们。在原始项目中将其设为submodule,例如docs/ 指向另一个仓库。或者,如果您想稍后合并代码,请将其添加为远程。
  • orphan 方法的另一个缺点是您需要保留 .gitignore'd 文件,并且还要在两个根(分支)之间不断切换。所以我也支持新的 repo 方法,在一个新文件夹中,拥有相同的遥控器,并推送到另一个分支。

标签: git branch git-branch


【解决方案1】:

你可以创建一个孤立的分支:

git checkout --orphan <branchname>

这将创建一个没有父级的新分支。然后,您可以使用以下命令清除工作目录:

git rm --cached -r .

并添加文档文件,提交并推送到 github。

pull 或 fetch 将始终更新有关所有远程分支的本地信息。如果您只想拉取/获取单个远程分支的信息,则需要指定它。

【讨论】:

  • 不错的答案,但新分支开始时所有文件(来自前一个分支)都已暂存,这有点烦人。
  • 发出git checkout --orphan &lt;branch&gt;时;我在git branch 中没有看到任何 列表。
  • git checkout --orphan之后可以使用git reset --hard删除剩余文件。
  • git checkout --orphan &lt;branch&gt; 之后看不到分支的原因是它还没有任何提交。第一次提交后git branch 打印新分支。
  • git clean -fd 删除未跟踪的文件。
【解决方案2】:

正确的答案是创建一个孤儿分支。我详细解释了如何做到这一点on my blog.(存档链接)

...

开始之前,请升级到最新版本的 GIT。确保;确定 你正在运行最新版本,运行

which git

如果它吐出一个旧版本,你可能需要增加你的 PATH 包含您刚刚安装的版本的文件夹。

好的,我们准备好了。在 cd 进入包含你的 git 的文件夹之后 结帐,创建一个孤儿分支。对于这个例子,我将命名 分支“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

【讨论】:

  • 只删除工作目录中的所有内容是很危险的,因为任何重要的项目都会有未跟踪的文件(配置、环境、缓存等)。
【解决方案3】:

像这样创建一个空的新分支:

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 branch --orphan 更方便,如果这会让您有很多git rmgit mv 要做。

试试

git branch --set-upstream proj-doc origin/proj-doc

看看这是否有助于解决获取过多的问题。此外,如果您真的只想获取单个分支,那么在命令行中指定它是最安全的。

【讨论】:

  • 这个答案很有趣,因为它允许您在第一次提交完全空的情况下启动另一个分支/根。
  • 如果您不介意切换到它,另一种创建空分支的方法是git checkout --orphan new-branch; git reset --hard
  • xargs有什么用?
  • @Flux 这只是将树 id 作为提交树 arg 插入的另一种方式。
  • 顺便说一下,如果远程分支不存在,您可以使用git push --set-upstream origin proj-doc:projdoc(来自您当前的分支)将空分支推送到远程,而不是git branch --set-uptream-to
【解决方案4】:

如果你的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,看看它会删除哪些文件。
【解决方案5】:

假设您有一个带有文件/目录的 master 分支:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

一步一步如何制作空分支:

  1. git checkout —orphan new_branch_name
  2. 在执行以下命令之前,请确保您位于正确的目录中:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

在第 2 步中,我们只需在本地删除所有文件,以避免与新分支上的文件和您保留在 master 分支中的文件混淆。 然后,我们在第 3 步中取消链接所有这些文件。最后,第 4 步及之后的步骤将使用我们新的空分支。

完成后,您可以轻松地在分支之间切换:

git checkout master 
git checkout new_branch

【讨论】:

    【解决方案6】:

    最好的解决方案是使用--orphan 选项创建一个新分支,如下所示

    git checkout --orphan <branch name>
    

    通过这个,您将能够创建一个新分支并直接结帐到新分支。这将是一个无父分支。

    默认情况下--orphan选项不会删除工作目录中的文件,因此您可以通过以下方式删除工作目录文件:

    git rm --cached -r
    

    详细说明--orphan 的作用:

    --orphan &lt;new_branch&gt;
    创建一个新的孤立分支,命名为&lt;new_branch&gt;,从&lt;start_point&gt; 开始并切换到它。在这个新分支上进行的第一次提交将没有父级,它将成为与所有其他分支和提交完全断开的新历史的根。

    索引和工作树的调整就像你之前运行过 git checkout 一样。这允许您通过轻松运行 git commit -a 来创建一个新的历史记录,该历史记录记录一组类似于 的路径以进行根提交。

    当您想从提交中发布树而不暴露其完整历史时,这可能很有用。您可能希望这样做来发布一个项目的开源分支,该项目的当前树是“干净的”,但其完整历史记录包含专有或其他受累代码。

    如果你想开始一个断开的历史记录,记录一组与 完全不同的路径,那么你应该在创建孤立分支后立即通过运行 git rm 清除索引和工作树 -射频。从工作树的顶层开始。之后,您将准备好准备新文件、重新填充工作树、从其他地方复制它们、提取 tarball 等等。

    【讨论】:

    【解决方案7】:

    基于此answer from Hiery Nomus

    你可以创建一个孤立的分支:

    git checkout --orphan <branchname>
    

    这将创建一个没有父级的新分支。然后,您可以使用以下命令清除工作目录:

    git rm --cached -r .
    

    然后你只需用空提交提交分支,然后推送

    git commit -m <commit message> --allow-empty
    git push origin <newbranch>
    

    【讨论】:

      【解决方案8】:

      我找到了这个帮助:

      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"
      

      【讨论】:

      • 我猜我们这样做是为了创建一个永远不会意外合并回开发的“RELEASE 分支”,对吧?
      【解决方案9】:

      我找到了here

      如果你使用 git 2.23 或更高版本,你可能习惯使用git switchgit restore 而不是git checkout

      所以如果你需要一个空分支试试这个:

      git switch --orphan YourNewBranch
      

      就是这样:))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 2013-11-12
        • 2021-12-06
        相关资源
        最近更新 更多