3

我目前正在从事的项目使用 Git 和 Gitflow 工作流方法。我在使用 Gitflow 时遇到了一个绊脚石,我相信它源于 Git 的底层功能。问题在于功能分支。

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

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

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

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

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

4

3 回答 3

5

抱歉不行。由于 git 中分支的性质,当您切换分支时,您未提交的任何内容都会出现。如果您不想提交,也可以使用git stash暂时撤消您的更改。

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

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

于 2013-07-19T15:38:22.230 回答
4

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

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

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

当您在 git 中签出分支或标签时,这对项目来说是全局的。

如果您想拥有同一个项目的 2 个并发分支,则必须拥有该项目的 2 个单独的克隆,每个克隆都在其自己的分支中签出。

于 2013-07-19T15:38:08.123 回答
1

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
于 2017-01-13T23:34:42.497 回答