今天帮助一个有git问题的朋友,我不得不介绍一个
需要与master
分支完全分离的分支。
这个分支的内容真的与什么不同
已在master
分支上开发,但它们将成为。{1}}分支
稍后合并到master
分支。
我记得约翰威格利的Git from the bottom up怎么样 分支本质上是一个遵循某个特定的提交的标签 约定以及如何将提交绑定到文件树,并且可选 到父提交。我们去创建一个无父对象的提交 使用git管道的现有存储库:
所以我们摆脱了索引中的所有文件......
$ git rm -rf .
...从tarball中提取目录和文件,将其添加到 索引......
$ git add .
...并创建了一个树对象......
$ git write-tree
(git-write-tree
告诉我们创建的树对象的sha1sum。)
然后,我们提交了树,没有指定父提交......
$ echo "Imported project foo" | git commit-tree $TREE
(git-commit-tree
告诉我们创建的提交对象的sha1sum。)
...并创建了一个指向我们新创建的新分支 提交。
$ git update-ref refs/heads/other-branch $COMMIT
最后,我们返回master
分支继续在那里工作。
$ git checkout -f master
这似乎按计划进行。但这显然不是那种 我建议刚开始使用的程序 使用git,温和地说。 是否有更简单的方法来创建 新的分支与发生的一切完全无关 到目前为止在存储库中?
答案 0 :(得分:470)
有一项新功能(自V1.7.2起)使这项任务比任何其他答案都高一些。
git checkout
现在支持 --orphan
选项。来自man page:
git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]
创建一个名为的新孤儿分支 &lt; new_branch&gt;,从 &LT; start_point&GT;并切换到它。该 第一次在这个新分支上提交 将没有父母,它将是 完全是新历史的根源 与所有其他人断开连接 分支和提交。
这不是完全提问者想要的,因为它填充了<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'
我没有指定<start_point>
,因为它默认为HEAD,我们并不关心。这个序列与Artem's answer中的命令序列基本相同,只是没有使用可怕的管道命令。
答案 1 :(得分:31)
git symbolic-ref HEAD refs/heads/newbranch
rm .git/index
git clean -fdx
<do work>
git add your files
git commit -m 'Initial commit'
答案 2 :(得分: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
然后从中获取
$ 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 / unrelated
答案 3 :(得分:12)
Github有一个名为Project Pages的功能,您可以在项目中创建一个特定的命名分支,以提供由Github提供的文件。他们的指示如下:
$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx
从那里你有一个空的存储库,然后你可以将你的新内容添加到。
答案 4 :(得分:8)
当前选择的答案是正确的,我只是巧合地添加......
这实际上就是github.com允许用户通过名为gh-pages
的孤立分支为他们的回购创建Github页面的方式。
这里给出并解释了漂亮的步骤:
https://help.github.com/articles/creating-project-pages-manually
基本上用于设置它的git命令如下:
git checkout --orphan gh-pages
(在您的回购中创建一个名为gh-pages的无父分支)git rm -rf .
(从分支工作树中删除所有文件)rm '.gitignore'
(即使是gitignore)请注意,您还可以在{2.}}上成为Github用于构建网站的“项目网站”的来源。
希望这有帮助!
答案 5 :(得分:3)
有时我只是想在项目中立即创建空分支然后开始工作,我将只执行以下命令:
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"
答案 6 :(得分:3)
在最新的Git版本(至少为2.27)中,可以使用switch
命令完全实现这一点:
git switch --orphan <new-branch>
答案 7 :(得分:0)
在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
答案 8 :(得分:0)
如果您的现有内容已经提交,那么您现在(Git 2.18 Q2 2018)可以将其提取到自己的新孤儿分支中,因为实现了&#34; git rebase -i --root
&#34;已更新使用
序列机器更多。
那个音序器现在是allowing to transplant the whole topology of commit graph elsewhere。
commit 8fa6eea见commit 9c85a1c,commit ebddf39,commit 21d0764,commit d87d48b,commit ba97aea,Johannes Schindelin (dscho
)(2018年5月3日) 。
(由Junio C Hamano -- gitster
--合并于commit c5aa4bc,2018年5月30日)
sequencer:允许引入新的root提交
在设计的新
--rebase-merges
模式的上下文中 特别是允许更改现有的分支拓扑 自由地,用户可能希望将提交提取为完全新鲜的 以新创建的根提交开始的分支。现在可以通过插入命令
reset [new root]
来实现pick
想要成为root提交的提交。例如:
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]
不是(一部分)有效的引用名称:两个开头括号 以及空间在参考名称中是非法的。
答案 9 :(得分:0)
创建一个单独的存储库对我来说很有效。不必担心
gh-pages
此方法在以下位置提及: