假设我有以下git仓库:
root\
AAA\
BBB\
CCC\
我需要为这些目录中的每个目录设置3个不同的分支+一个主分支才能拥有它们。我做的事情:
git init
git remote add origin <my_repo_ssh_address>
git checkout -b AAA
git add AAA
git commit -m "Created AAA branch"
git push origin AAA
现在我的仓库中有AAA
个分支,其中有一个AAA
个文件夹。然后我想要BBB
分支:
git checkout -b BBB
git add BBB
git commit -m "Created BBB branch"
git push origin BBB
如果我这样做,那么我有两个分支AAA
和BBB
但是在BBB
分支中我有两个目录AAA
和BBB
,但是我想(实际上我需要)只有BBB
目录。我究竟做错了什么?有没有办法让它发挥作用?
答案 0 :(得分:2)
git checkout -b
命令的完整规范是git checkout -b <branch> [<start point>]
。起点是可选的,并使用当前分支作为默认值。
因为您首先要创建分支AAA
并对其进行投放,所以当您创建AAA
时,我假设BBB
仍然是您当前的分支。在您提交新文件后,这将导致以下提交图:
----- -----
| 1 |----------------| 2 |
----- -----
^ ^
AAA BBB
如您所见,分支AAA
中的更改包含在分支BBB
中。
要拥有完全独立的分支,可以使用--orphan
选项。 --orphan
选项将创建没有历史记录的分支。执行git checkout --orphan BBB
将创建一个名为BBB
的新分支,但不包括当前分支AAA
中的文件。在您提交新文件后,它将生成以下提交图:
-----
| 1 |
-----
^
AAA
-----
| 2 |
-----
^
BBB
AAA
的文件仍然在您的工作目录中,因此您必须从磁盘中删除它们。不用担心,AAA
中的文件存储在git中,您可以通过执行AAA
切换回git checkout AAA
分支,随时取回它们。
虽然存在使用未连接分支的用例,但通常您希望分支在历史记录中具有单个原点。如果您的目标是对多个目录进行源代码控制,建议您拥有多个git存储库,每个存储库都有其提交历史记录和分支。
答案 1 :(得分:1)
每个人似乎都专注于使用孤儿分支来解决这个问题;这是一个选项,虽然可能没有必要,并且,根据您的声明要求,它将导致您另一个小问题。不过,一旦我对此进行了解释,我将提及:你声明的要求可能会给你带来更大的问题,因为这不是git中的分支。
让我们开始吧。
所以你开始使用一个空的存储库,第一次提交到AAA
分支,其中包含一个AAA/
目录。
因为这是您的第一次提交,所以您无法返回“在添加AAA
文件夹之前”创建BBB
分支和{{1} } 目录。因此人们建议使用孤儿分支,这样你就可以回到没有历史了。这会有效,但是你提到你想要一个包含所有三个子目录的BBB/
分支。
嗯,这就是将要发生的事情:你将创建一些提交。
master
然后你会想要创建主分支。也许你会说
A1 -- A2 -- A3 <--(AAA)
B1 -- B2 <--(BBB)
并且您会收到错误,因为git checkout AAA
git checkout -b master
git merge BBB
与BBB
(现在为AAA
)没有共同的历史记录。解决起来并不是非常困难(master
有一个git merge
选项),但是你可以通过以不同方式启动存储库来提前计划并从一开始就避免它。
--allow-unrelated-histories
第一次提交会创建没有内容的git init
git commit --allow-empty
git checkout -b AAA
mkdir AAA
touch AAA/some-file
git add .
git commit
git checkout master
git checkout -b BBB
mkdir BBB
touch BBB/some-file
git add .
git commit
分支。然后从那里创建每个特定于目录的分支。所以你创建了一些提交
master
然后填充O <--(master)
|\
| A1 -- A2 -- A3 <--(AAA)
\
B1 -- B2 <--(BBB)
内容
master
获取
git checkout master
git merge AAA
git merge BBB
这有点简单。当有理由拥有它们时,多根回购很好,但它们并不常见,如果你不习惯这种情况,有时候某些命令的输出可能会让人感到困惑。
无论如何,这种方法不会随意单独O -------------- M1 ------- M2 <--(master)
|\ / /
| A1 -- A2 -- A3 <--(AAA) /
\ /
B1 ----------------- B2 <--(BBB)
或AAA
作为BBB
的起点;这又不是真的重要,但我觉得有点不那么难看。
master
中),那么最直接的解决方案就是有三个回购(master
, AAA
,BBB
)而不是三个分支,然后可能有一个主仓库,将这3个作为子模块处理。