在git中,有一种简单的方法可以将不相关的分支引入存储库吗?

hil*_*llu 318 git branch

在帮助朋友解决git问题的同时,我不得不介绍一个需要与分支完全分离的master分支.这个分支的内容确实与master分支上开发的内容有不同的起源,但它们将master在以后合并到分支中.

我记得从底层向上阅读John Wiegley的Git,分支本质上是一个遵循某个约定的提交的标签,以及如何将提交绑定到文件树,并且可选地绑定到父提交.我们使用git的管道创建了对现有存储库的无父提交:

所以我们摆脱了索引中的所有文件......

$ git rm -rf .
Run Code Online (Sandbox Code Playgroud)

...从tarball中提取目录和文件,将其添加到索引中...

$ git add .
Run Code Online (Sandbox Code Playgroud)

...并创建了一个树对象......

$ git write-tree
Run Code Online (Sandbox Code Playgroud)

(git-write-tree告诉我们创建的树对象的sha1sum.)

然后,我们提交了树,没有指定父提交......

$ echo "Imported project foo" | git commit-tree $TREE
Run Code Online (Sandbox Code Playgroud)

(git-commit-tree告诉我们创建的提交对象的sha1sum.)

...并创建了一个指向新创建的提交的新分支.

$ git update-ref refs/heads/other-branch $COMMIT
Run Code Online (Sandbox Code Playgroud)

最后,我们回到master分公司继续在那里工作.

$ git checkout -f master
Run Code Online (Sandbox Code Playgroud)

这似乎按计划进行.但这显然不是我推荐给刚刚开始使用git的人的一种程序,温和地说.有没有更简单的方法来创建一个与目前存储库中发生的所有内容完全无关的新分支?

tco*_*ovo 488

有一个新功能(自V1.7.2起)使这项任务比任何其他答案中的任务更高级.

git checkout现在支持该--orphan选项.从手册页:

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

创建一个名为<new_branch> 的新孤立分支,从<start_point>启动并切换到它.在这个新分支上进行的第一次提交将没有父项,它将成为与所有其他分支和提交完全断开的新历史的根.

这并不完全是提问者想要的,因为它填充了索引和工作树<start_point>(因为这毕竟是一个checkout命令).唯一需要的其他操作是从工作树和索引中删除任何不需要的项目.不幸的是,git reset --hard不起作用,但git rm -rf .可以代替使用(我相信这相当于rm .git/index; git clean -fdx其他答案中给出的).


综上所述:

git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'
Run Code Online (Sandbox Code Playgroud)

我没有<start_point>指定,因为它默认为HEAD,我们并不关心.这个序列与Artem的答案中的命令序列基本相同,只是没有使用可怕的管道命令.

  • 注意:此功能已添加到git 1.7.2中 (23认同)
  • @JJD:我给的剧本应该给你你想要的东西,除非我误解了你.当您说"保持可见"时,您是否意味着即使您检出了不同的分支,文件仍将保留在工作目录中?在`git merge`上使用`--no-commit`就可以实现这一点.你可能需要跟进一个`git reset origin/master`,这样你的下一个提交就可以到达你想要的位置,但是你的孤儿分支中的文件将显示为"未跟踪的文件",除非你还将它们包含在你的.gitignore中文件. (2认同)

Art*_*rov 31

来自Git社区书籍:

git symbolic-ref HEAD refs/heads/newbranch 
rm .git/index 
git clean -fdx 
<do work> 
git add your files 
git commit -m 'Initial commit'
Run Code Online (Sandbox Code Playgroud)

  • @kikito:回复:"下一个答案更好"...... SO上的订单不稳定.你能添加一个指向你认为更好的答案的链接吗? (13认同)
  • 我指的是http://stackoverflow.com/a/4288660/312586.你是对的,我不应该说"下一步".当我评论时,它得分低于这个答案. (2认同)

Jak*_*ski 22

虽然使用git symbolic-ref和删除索引的解决方案有效,但创建存储库可能在概念上更清晰

$ cd /path/to/unrelated
$ git init
[edit and add files]
$ git add .
$ git commit -m "Initial commit of unrelated"
[master (root-commit) 2a665f6] Initial commit of unrelated
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo
Run Code Online (Sandbox Code Playgroud)

然后从中获取

$ cd /path/to/repo
$ git fetch /path/to/unrelated master:unrelated-branch
warning: no common commits
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From /path/to/unrelated
 * [new branch]      master     -> unrelated-branch
Run Code Online (Sandbox Code Playgroud)

现在你可以删除/ path/to/unrelated

  • 因为它是,而且应该是一件罕见的事情.如果你有不相关的东西分支,它通常属于不相关的存储库,而不是填充现有的存储库(尽管有例外). (3认同)
  • +1。对于 git 新手来说,你显然可以通过 `gitbranch` 列出分支,并通过 `git checkout BRANCH_NAME` 在它们之间切换。 (2认同)

Gre*_*ill 13

Github有一个名为Project Pages的功能,您可以在项目中创建一个特定的命名分支,以提供由Github提供的文件.他们的指示如下:

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx
Run Code Online (Sandbox Code Playgroud)

从那里你有一个空的存储库,然后你可以添加你的新内容.


unk*_*col 10

当前选择的答案是正确的,我只是巧合地添加...

这实际上就是github.com允许用户通过一个名为的孤立分支为他们的回购创建Github Pages的方式gh-pages.这里给出并解释了漂亮的步骤:

https://help.github.com/articles/creating-project-pages-manually

基本上用于设置它的git命令如下:

  1. git checkout --orphan gh-pages (在你的repo上创建一个名为gh-pages的无父分支)
  2. git rm -rf . (从分支工作树中删除任何文件)
  3. rm '.gitignore' (即使是gitignore)
  4. 现在添加网站内容(添加index.html等)并提交和推送.
  5. 利润.

请注意,您还可以在您的repo上指定/ docs文件夹作为Github用于构建网站的"项目站点"的来源.

希望这可以帮助!


Dan*_*eis 6

在最近的 Git 版本中,至少 2.27,这可以使用以下switch命令干净地实现:

git switch --orphan <new-branch>
Run Code Online (Sandbox Code Playgroud)

官方文档:https : //www.git-scm.com/docs/git-switch


Sin*_*ing 5

有时我只想立即在项目中创建空分支然后开始工作,我将执行以下命令:

git checkout --orphan unrelated.branch.name
git rm --cached -r .
echo "init unrelated branch" > README.md
git add README.md
git commit -m "init unrelated branch"
Run Code Online (Sandbox Code Playgroud)