Git分支始终添加来自其他分支的文件
假设我有以下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
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中分支的用途
让我们开始吧
因此,您从一个空存储库开始,第一次提交是使用