在帮助朋友解决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的人的一种程序,温和地说.有没有更简单的方法来创建一个与目前存储库中发生的所有内容完全无关的新分支?
我有一个包含多个存储库的目录,它看起来像这样:
folder
|- repo1
| |- .git
| |- File1.txt
|- repo2
| |- .git
| |- File2.txt
|- repo3
| |- .git
| |- File3
Run Code Online (Sandbox Code Playgroud)
我想将它们组合成单个git存储库,我按照这些说明进行了操作.
在这些指令之后,我有以下结构:
folder
|- .git
|- repo1
| |- File1.txt
|- repo2
| |- File2.txt
|- repo3
| |- File3
Run Code Online (Sandbox Code Playgroud)
这很棒.但是现在我有主分支(来自repo1)和历史上的两个孤儿分支:
* Merge repo3
|\
| * Add third file
* Merge repo2
|\
| * Add second file
* Add first file
Run Code Online (Sandbox Code Playgroud)
我想得到的是这样的
* Merge repo 3
* Add third file …Run Code Online (Sandbox Code Playgroud)