8

在 SourceTree 上,我有一个名为“develop”的分支。我使用 SourceTree Git Flow 从“开发”分支创建新功能。我对功能分支进行了更改,然后完成了功能,更改返回到我的“开发”分支。

然后我将这些更改推送到遥控器。

现在,这就是我想要做的。我必须同时处理两个 JIRA 任务。所以我从“develop”分支创建了两个特性分支:“develop/feature1”和“develop/feature2”。在 SourceTree 上选择时,我可以通过双击它们来切换功能。然后我可以检查两个功能分支的工作副本,但我注意到我添加到一个的文件也已添加到另一个。

我的问题是:

  1. 当我将文件添加到一个功能的工作副本时,为什么它们会出现在另一个功能的工作副本中?

  2. 如果它们不能相互隔离更改,那么拥有功能分支有什么意义?

4

2 回答 2

10

git即使您在当前分支中有未提交的更改,也允许您切换分支。这些文件保持未提交,如果需要,您可以在另一个分支中提交它们。当你意识到你已经完成feature/feature1了应该在feature/feature2.

提交更改后,它们不再在分支之间切换。然后,您可以合并或挑选分支之间的更改。

请注意,git如果您在要切换到的分支中有未提交的更改导致合并冲突,并且可能即使您的更改之一在您想要的分支中已更改并提交的文件中,则不允许您切换分支切换到。在这种情况下,您需要先提交、还原或存储您的更改。

如果git不允许您切换分支,并且您尝试通过在切换分支之前存储更改来解决该问题,则应确保将 pop 存储在原始分支中。如果您在feature/feature1, stash 更改,然后切换到feature/feature2并 stash pop 那里,您丢失存在于feature/feature2但不存在于feature/feature1. 这很难检测。

于 2013-08-10T22:42:38.053 回答
3

git 不会跟踪新文件和更改,直到您执行git add. 这意味着 git 没有此数据的副本,因此如果它在您签出不同的分支时恢复您的更改,之后将无法恢复它们。

您可以查看哪些文件被索引修改取消跟踪的列表git status

解决此问题的唯一方法是使用 git 跟踪您的更改,或者通过添加和提交它们(稍后可以使用 a 撤消git reset),或者使用git stash -u1存储它们(稍后可以使用 a 撤消git stash pop)。

git 以这种方式工作的优势在于,您可以处理任何您想做的事情,而无需考虑分支。当需要提交时,您可以简单地签出相关分支并添加您想要的文件git add,或者只添加您想要的文件部分git add -p


1:-u是 的简写--include-untracked,包括新创建的文件但不包括被忽略的文件

于 2013-08-12T18:34:50.187 回答