Git分支始终添加来自其他分支的文件

Git分支始终添加来自其他分支的文件,git,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

假设我有以下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
BBB
,但在
BBB
分支中,我有两个目录
AAA
BBB
,但我希望(实际上我需要)只有
BBB
目录。我做错了什么?有没有办法让它工作?

git checkout-b命令的完整规范是
git checkout-b[]
。起点是可选的,并使用当前分支作为默认值

因为您首先创建分支
AAA
并提交它,所以我假设在创建
BBB
时,
AAA
仍然是您当前的分支。提交新文件后,这将产生以下提交图:

-----                -----
| 1 |----------------| 2 | 
-----                -----
  ^                    ^
 AAA                  BBB
-----
| 1 |
-----
  ^ 
 AAA

-----
| 2 |
-----
  ^ 
 BBB
如您所见,分支
AAA
中的更改包含在分支
BBB

如何创建独立的分支 要拥有完全独立的分支,可以使用
--orphan
选项。
--orphan
选项将创建一个没有历史记录的分支。执行
git checkout--orphan BBB
将创建一个名为
BBB
的新分支,而不包括当前分支
AAA
中的文件。提交新文件后,将生成以下提交图:

-----                -----
| 1 |----------------| 2 | 
-----                -----
  ^                    ^
 AAA                  BBB
-----
| 1 |
-----
  ^ 
 AAA

-----
| 2 |
-----
  ^ 
 BBB
但是
AAA
的文件仍将在您的工作目录中,因此您必须将其从磁盘中删除。别担心,
AAA
中的文件存储在git中,您可以通过执行
git checkout AAA
切换回
AAA
分支随时取回它们

为什么要分开未连接的分支?
尽管存在具有未连接分支的用例,但通常您希望分支在历史中具有单个原点。如果您的目标是对多个目录进行源代码控制,建议您拥有多个git存储库,每个存储库都有其提交历史记录和分支。

git checkout-b命令的完整规范是
git checkout-b[]
。起点是可选的,并使用当前分支作为默认值

因为您首先创建分支
AAA
并提交它,所以我假设在创建
BBB
时,
AAA
仍然是您当前的分支。提交新文件后,这将产生以下提交图:

-----                -----
| 1 |----------------| 2 | 
-----                -----
  ^                    ^
 AAA                  BBB
-----
| 1 |
-----
  ^ 
 AAA

-----
| 2 |
-----
  ^ 
 BBB
如您所见,分支
AAA
中的更改包含在分支
BBB

如何创建独立的分支 要拥有完全独立的分支,可以使用
--orphan
选项。
--orphan
选项将创建一个没有历史记录的分支。执行
git checkout--orphan BBB
将创建一个名为
BBB
的新分支,而不包括当前分支
AAA
中的文件。提交新文件后,将生成以下提交图:

-----                -----
| 1 |----------------| 2 | 
-----                -----
  ^                    ^
 AAA                  BBB
-----
| 1 |
-----
  ^ 
 AAA

-----
| 2 |
-----
  ^ 
 BBB
但是
AAA
的文件仍将在您的工作目录中,因此您必须将其从磁盘中删除。别担心,
AAA
中的文件存储在git中,您可以通过执行
git checkout AAA
切换回
AAA
分支随时取回它们

为什么要分开未连接的分支?
尽管存在具有未连接分支的用例,但通常您希望分支在历史中具有单个原点。如果您的目标是对多个目录进行源代码控制,建议您拥有多个git存储库,每个存储库都有其提交历史和分支。

每个人似乎都专注于使用孤立分支来解决这个问题;这是一个选项,虽然可能不是必需的,而且,考虑到您声明的需求,它会给您带来另一个小问题。不过,在我整理完这些之后,我将要提到:您声明的需求可能会给您带来更大的问题,因为这不是git中分支的用途

让我们开始吧

因此,您从一个空存储库开始,第一次提交的是
AAA
分支,其中有一个
AAA/
目录

因为这是您的第一次提交,所以您不能返回到“添加
AAA
文件夹之前”创建
BBB
分支和
BBB/
目录。因此,人们建议使用一个孤儿分支,这样你就可以回到完全没有历史的状态。这是可行的,但是您提到您需要一个包含所有三个子目录的
master
分支

好吧,接下来会发生什么:您将创建一些提交

A1 -- A2 -- A3 <--(AAA)

B1 -- B2 <--(BBB)
您将得到一个错误,因为
BBB
AAA
没有共同的历史记录(现在是
master
)。解决这个问题并不十分困难(
git merge
有一个
--允许不相关的历史记录
选项),但是您可以提前计划,并通过以不同的方式启动存储库从一开始就避免它

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)
得到

O -------------- M1 ------- M2 <--(master)
|\              /          /
| A1 -- A2 -- A3 <--(AAA) /
 \                       /
  B1 ----------------- B2 <--(BBB)

O-------M1-------M2每个人似乎都专注于使用孤立分支来解决这个问题;这是一个选项,虽然可能不是必需的,而且,考虑到您声明的需求,它会给您带来另一个小问题。不过,在我整理完这些之后,我将要提到:您声明的需求可能会给您带来更大的问题,因为这不是git中分支的用途

让我们开始吧

因此,您从一个空存储库开始,第一次提交是使用