为新项目创建一个新的空分支


351

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

似乎可以顺利执行该分支,但是当我执行访存或提取操作时,它会从其他分支下载信息,然后我还会从其他项目中获得一些额外的文件。最好的解决方案是什么?


11
为什么需要将其存储在分支中?分支通常是与相同代码库的某些偏差。也许只是启动一个新的存储库是一个更好的解决方案。
本杰明·班尼尔

2
好吧,我们以前做过,IIRC,我想再做一次,所以我很好奇;)
fazineroso 2012年

3
“用于新项目” -作为@honk,我建议将其放入新的存储库中。有两种选择可以将它们集成在一起。submodule在原始项目中将其设为a ,例如docs/指向该其他仓库。或者,如果您希望以后合并代码,请将其添加为远程对象。
gertvdijk 2012年

1
孤立方法的另一个缺点是,您需要保留您的.gitignore'd文件,并且还需要在两个根目录(分支)之间不断切换。因此,我也支持新的存储库方法,在一个新文件夹中,使用相同的遥控器,并推送到另一个分支。
simo 2014年

Answers:


666

您可以将分支创建为孤立的:

git checkout --orphan <branchname>

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

git rm --cached -r .

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

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


18
好的答案,但是新分支开始时,所有文件(来自上一个分支)都已开始,这很令人讨厌。
马特·芬威克

12
发行时git checkout --orphan <branch>; 我在中没有看到<branch>的任何列表git branch
Santosh Kumar

51
之后git checkout --orphan可以使用git reset --hard删除剩余的文件。
伊利亚·科泽夫尼科夫

16
之所以看不到分支,git checkout --orphan <branch>是因为它还没有提交。在第一次提交后,将git branch打印新分支。
Krøllebølle

13
git clean -fd删除未跟踪的文件。
stefgosselin

71

正确的答案是创建一个孤立的分支。我会在博客上详细说明如何执行此操作(已存档的链接)

...

在开始之前,请升级到最新版本的GIT。为了确保您正在运行最新版本,请运行

which git

如果它吐出的是旧版本,则可能需要使用包含刚安装的版本的文件夹来扩展PATH。

好,我们准备好了。在包含git checkout的文件夹中执行cd后,创建一个孤立分支。在此示例中,我将分支命名为“ 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

16
不鼓励仅链接的答案。如果链接被移动或删除,您的答案将变得一文不值。考虑将基本部分直接添加到此答案中。请特别注意那些先前的答案未涵盖的问题。
2013年

3
不幸的是,该链接不再有效。
阿列克谢

1
档案是一件很棒的事情。
lucid_dreamer

3
仅删除工作目录中的所有内容非常危险,因为任何不重要的项目都将具有未跟踪的文件(配置,环境,缓存等)。
Slava Fomin II

12

创建一个空的新分支,如下所示:

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

看看这是否有助于解决您的太多问题。另外,如果您确实只想获取单个分支,则仅在命令行上指定它是最安全的。


1
这个答案很有趣,因为它允许您使用完全空的第一次提交来启动另一个分支/根。
斯特凡·古里康

如果您不介意切换到空白分支的另一种方法是git checkout --orphan new-branch; git reset --hard
jthill '19

的用途是xargs什么?
Flux

@Flux是将树ID作为提交树arg嵌入的另一种方法。
jthill

我真的很喜欢这种方法,因为它可以创建一个空的新分支,而无需离开您当前的分支,再加上一个空的提交作为起点。
布莱斯

8

如果您的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>

2
请注意,git clean可以删除您不想删除的文件!git clean -ndx首先运行,以查看将删除哪些文件,然后再使用该-f选项运行它。
拉西

7

假设您有一个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

1

在此基础上,Hiery Nomus给出了答案

您可以将分支创建为孤立的:

git checkout --orphan <branchname>

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

git rm --cached -r .

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

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

1

查看此文档,其中包含有关以下内容的明确详细信息:

--orphan <new_branch>
创建一个新的孤立分支,<new_branch>从开始<start_point>并切换到该分支,该分支名为。在这个新分支上进行的第一次提交将没有父母,这将是与所有其他分支和提交完全脱节的新历史的根源。

调整索引和工作树就像以前运行git checkout一样。这使您可以开始新的历史记录,该历史记录通过轻松运行git commit -a进行根提交来记录一组路径。


1
欢迎使用指向解决方案的链接,但是请确保没有该链接的情况下,您的回答是有用的:在链接周围添加上下文,以便您的其他用户可以了解它的含义和含义,然后引用您所使用页面中最相关的部分如果目标页面不可用,请重新链接。只是链接的答案可能会被删除。
Yunnosch

1

我找到了这个帮助:

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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.