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

110885 次浏览

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'

Github有一个叫做项目页面的特性,你可以在你的项目中创建一个特定的命名分支来提供将由Github提供的文件。他们的指示如下:

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

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

虽然使用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

然后从中获取

$ 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

现在可以删除/path/to/不相关

http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches找到这个脚本,它工作得非常好!

#!/bin/bash


set -e


if test -z "$2" -o -n "$3"; then
echo "usage: $0 REPO BRANCHNAME" >&2
exit 1
fi


repo=$1
branch=$2


git fetch "$repo" "$branch"


head=$(git rev-parse HEAD)
fetched=$(git rev-parse FETCH_HEAD)
headref=$(git rev-parse --symbolic-full-name HEAD)


git checkout $fetched .


tree=$(git write-tree)


newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched)
git update-ref $headref $newhead $head
git reset --hard $headref

有一个新特性(从V1.7.2开始)使这个任务比其他答案中的任务更高级一些。

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

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

创建一个新的孤儿分支,命名为 new_branch> & lt; start_point>然后切换到它。的 在这个新分支上的第一个提交 会没有父母,会是这样吗 完全是新历史的根源 与其他所有人都断开了联系

这并没有做请求者想要的完全,因为它从<start_point>填充索引和工作树(因为这毕竟是一个签出命令)。惟一的其他必要操作是从工作树和索引中删除任何不需要的项。不幸的是,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'

我没有指定<start_point>,因为它默认为HEAD,而且我们并不真正关心。这个序列本质上与Artem的回答中的命令序列做相同的事情,只是没有求助于可怕的管道命令。

目前选择的答案是正确的,我想顺便补充一下…

这实际上正是github.com让用户为他们的回购创建Github页面的方式,通过一个名为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. 利润。

注意,你也可以指定一个/docs文件夹在你的repo是“项目网站”的来源,Github用来建立网站。

希望这能有所帮助!

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

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"
如果你现有的内容已经提交了,你现在(Git 2.18 Q2 2018)可以将它提取到它自己的新的孤儿分支中,因为“git rebase -i --root”的实现已经更新为使用 音序器机械更多。

这个排序器现在是允许将提交图的整个拓扑移植到其他地方

< p >看到提交8 fa6eea 提交9 c85a1c提交ebddf39 提交21 d0764, 提交d87d48b, 提交ba97aea 约翰内斯·辛德林(dscho)(2018年5月3日)。< br > (由Junio C Hamano—gitster提交c5aa4bc中合并,2018年5月30日)

Sequencer:允许引入新的根提交

在新的--rebase-merges模式的上下文中,它被设计 特别是允许更改现有的分支拓扑结构 一般情况下,用户可能希望将提交提取到一个完全新鲜的 以新创建的根提交开始的分支.

.

. 现在可以通过在前面插入命令reset [new root]来实现 picking希望成为根提交的提交。例子:< / p >
reset [new root]
pick 012345 a commit that is about to become a root commit
pick 234567 this commit will have the previous one as parent

这与reset命令的其他用法不冲突 [new root]不是(一部分)有效的ref名称:两者都是开括号 以及空格在ref名称中是非法的

在最近的Git版本中,至少是2.27,这可以通过__abc0命令干净地实现:

git switch --orphan <new-branch>

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

创建一个单独的存储库对我来说效果很好。不用担心<start_point>

  1. 在其他地方创建一个新的空回购。
  2. 将master分支重命名为master以外的任何名称,即gh-pages
  3. 开始你的孤儿工作吧。
  4. 将您的工作提交到新存储库中的唯一分支。
  5. 将新分支推到包含原始主分支的同一个远程回购。

此方法已在: