Git中的并行隔离功能分支

时间:2013-07-19 15:28:43

标签: git

我目前正在开展的项目使用Git和Gitflow Workflow方法。我已经遇到了Gitflow的绊脚石,我相信,它源于Git的底层功能。问题出在功能分支上。

使用Subversion我可以创建我们的存储库的两个分支,检查它们以在我的工作区中分离Eclipse项目并并行编辑它们。我可以相互隔离地编辑这两个项目中的文件。我对一个分支中的文件所做的更改不会反映在另一个分支中,反之亦然。

使用Git,我还可以在我的存储库克隆中创建两个功能分支。但是,每当我在一个分支中创建或编辑文件时,如果我在切换到第二个分支之前没有提交这些更改,那么这些更改也会出现在第二个分支中。同样,如果我然后在第二个分支中更改相同的文件,并再次切换到第一个文件,则该文件包含我到目前为止所做的所有更改,无论我在更改时使用了哪个分支。

更糟糕的是,如果我在第二个分支中添加并提交我的更改,则第二个分支中的文件现在将包含从第一个和第二个分支所做的所有更改,并且更改将从第一个分支中完全消失!

有没有办法让功能分支彼此隔离,以便文件和文件更改在提交之前不会反映在两个功能分支上?

我意识到我可以在切换到另一个分支之前简单地提交我的更改,或者为每个功能创建一个单独的存储库克隆。然而,这两种方法似乎都破坏了分支机构的目的。

3 个答案:

答案 0 :(得分:5)

不幸的是没有。由于git中分支的性质,当你切换分支时,任何你没有提交的东西都会出现。如果您不想提交,也可以使用git stash暂时撤消更改。

这是git的“功能”之一,您在一个地方进行开发,而不必在不同的地方拥有多个项目副本。您可以切换分支而不是更改目录或项目。

很抱歉,如果你想使用git,你只需要小心切换分支。或者将它们分成两个单独的回购。

答案 1 :(得分:4)

git中的分支与subversion或CVS中的分支含义不同。

这是我与同事最近的经历:她正在使用git存储库来管理她的项目。在此之前,她曾经与CVS合作。她创建了2个子目录,相应地命名为它们应该相关的分支。她的工作流程是结帐说branchA和cd到子目录A.然后当她想要处理功能B时,她检查了branchB和cd到子目录B.

对于那些不了解git工作方式以及有不良习惯的人来说,这通常是一种工作方式。

当你在git中签出分支或标签时,这是项目的 GLOBAL

如果你想拥有同一个项目的2个并发分支,你必须有2个独立的项目克隆,每个克隆都在自己的分支中检出。

答案 2 :(得分:0)

Git现在有这个功能:它被称为git worktree

它允许来自同一本地存储库(克隆)的多个工作目录。每个都可以在不同的分支上,它们的工作副本,暂存区域和状态都是独立的。

示例:

$> pwd
/home/user/my_project
$> git branch
* branch_a
$> git worktree ../my_project_branch_b branch_b
$> git branch
* branch_a
  branch_b
$> cd ../my_project_branch_b
$> git branch
  branch_a
* branch_b