从Git 2.5开始,.git
直接支持此工作流程。 有关详细信息,请参见VonC对这个问题的回答。
如果您出于任何原因不喜欢.git
,那么我在下面的回答就足够了。
Git旨在允许您在磁盘上的单个文件夹中工作。 这是一个单一的存储库,其中包含您关心的所有分支。†您签出当时要处理的任何分支。
在Git存储库中,一次只能签出一个分支。 如果您签出第二个分支,则磁盘上的文件将被删除并替换为第二个分支中的文件。
如果您具有以下分支:
BRANCH-A BRANCH-B
alpha.txt alpha.txt
bravo.txt
charlie.txt charlie.txt
delta.txt
当您在分支A上并且签出分支B时,将删除.git
,并将echo.txt
添加到您的工作目录中。
但是,除非您提供echo.txt
参数,否则.git
不会覆盖您对文件所做的更改。 如果您对alpha.txt
进行更改,然后尝试切换到分支B,则会收到一条消息,警告您所做的更改将丢失并中止结帐。
例外是未跟踪的文件。 如果您已经签出了分支A,并且创建了一个名为.git
的新文件,那么当您签出分支B时,Git将不会触摸该文件。 这样,您可以决定要针对分支B提交echo.txt
,而不必经历以下麻烦:(1)将文件移到存储库之外;(2)检出正确的分支;以及(3)将文件移回 进入回购。
脚注
†实际上,Git不会强迫您使用单个工作目录。 如果需要,没有什么可以阻止您在磁盘上为要处理的每个分支创建不同的路径。
/home/me/project
+-- branch-a/
+-- branch-b/
+-- ...
这些路径中的每一个都是其自己的Git存储库(每个路径内部都有一个.git
文件夹),并且您可以在存储库之间推送和拉取提交。
cd ~/project ## Go to my projects directory
git clone branch-a branch-b ## Create a new branch-b
cd branch-b
... work work work ...
git commit -a -m "Made some changes on branch-b"
git pull origin ## Fetch and merge the changes from branch-a
git push origin ## Push my changes back to branch-a
如果不使用命名分支,这就是某些人使用Mercurial的方式:他们将存储库克隆到磁盘上每个所需分支的新目录中,然后在它们之间推送和提取更改集。