我使用Git有一段时间了(虽然不是专家),这个问题从来没有出现在我的脑海中,但现在正在出现。
假设我有一个包含三个分支和master
的存储库:
- branch_1
- branch_1_devel
- branch_1_devel_test
我不使用master
,所以branch_1
变成和行为像master
。通常,我应该在branch_1_devel
做新的开发,然后当它们准备好时,我将这些更改合并到branch_1
。
现在我想测试一个新的功能,所以我创建了一个新的分支branch_1_devel_test
。签入该分支后,我在名为file1
的文件中做了更改。
在branch_1_devel
中需要做一些更优先级的事情,所以我需要签出该分支并编辑相同的file1
。所有这些都完成后,我已经添加了文件,提交了更改,然后合并到branch_1
。
然后我回到branch_1_devel_test
,因为我想继续测试我离开file1
的地方。
- 如果我从
branch_1_devel
拉的变化将是file1
进入冲突?意思是我将失去之前的更改? - 当我签入另一个分支时,我需要提交在
branch_1_devel_test
所做的更改吗?意思是,如果我尝试在一个新的分支中签出而不提交当前分支中的更改,将会出现问题?
所有这一切背后的整个想法是:我想测试一些东西,但我不想将更改推到branch_1_devel
或branch_1
。
更新
这是我做的一个小测试,用来理解Git的行为。
$ git branch
master
branch_1
* branch_1_devel
$ git checkout -b branch_1_devel_test
Switched to a new branch 'branch1_devel_test'
$ git branch
master
branch_1
branch_1_devel
* branch_1_devel_test
现在我在branch_1_devel_test
所以我已经创建了一个新的空文件
$ git status
# On branch branch_1_devel_test
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# application/controllers/AdminconsoledemoController.php
#
nothing added to commit but untracked files present (use "git add" to track)
切换回branch_1_devel
$ git checkout branch_1_devel
Switched to branch 'branch_1_devel'
$ git status
# On branch branch_1_devel
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# application/controllers/AdminconsoledemoController.php
#
nothing added to commit but untracked files present (use "git add" to track)
为什么在branch_1_devel_test
创建的文件在branch_1_devel
被跟踪?这正是我试图避免的原因,因为我需要在branch_1_devel
如果我理解正确的话…如果您在branch_1_devel_test
中创建了一个文件而没有提交它,它将独立于分支(它不会成为repo的一部分)。这意味着当您切换回branch_1_devel
时,该文件仍将作为未跟踪的文件存在。如果你在branch_1_devel_test
中提交文件,该文件将成为repo的一部分,当你更改分支时,该文件将消失。
如果您想避免文件到处乱放,您可以使用stash
机制。事实上,我不确定你能不能藏匿未追踪的文件。无论如何,您尝试做的事情看起来很奇怪:如果您创建了一个值得保存的文件,您应该提交它。如果这样,在将来,你不再需要它,你可以删除它(当然,如果它是一个大文件的事情是不同的…)
您可以使用git worktree
,以便在不使用comit
或stash
的情况下保持不同分支的开发。它允许在自己的工作目录中独立签出分支。例子:
git worktree add ../project-branch_1 branch_1
然而,worktree
命令已经在Git 2.5中引入,并且仍然被认为是实验性的:
多重签出一般还处于试验阶段,并支持For子模块是不完整的。不建议制作多个超级项目的签出。
除了需要手动删除工作目录外,我从来没有遇到过它的问题,即使是子模块。其他链接:我用git-worktree做什么?