Git分支总是添加来自其他分支的文件

时间:2018-04-05 18:43:03

标签: git

假设我有以下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

如果我这样做,那么我有两个分支AAABBB但是在BBB分支中我有两个目录AAABBB,但是我想(实际上我需要)只有BBB目录。我究竟做错了什么?有没有办法让它发挥作用?

2 个答案:

答案 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中),那么最直接的解决方案就是有三个回购(masterAAABBB)而不是三个分支,然后可能有一个主仓库,将这3个作为子模块处理。