在不损坏任何东西的情况下测试新东西的最佳方法



我使用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_develbranch_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,以便在不使用comitstash的情况下保持不同分支的开发。它允许在自己的工作目录中独立签出分支。例子:

git worktree add ../project-branch_1 branch_1

然而,worktree命令已经在Git 2.5中引入,并且仍然被认为是实验性的:

多重签出一般还处于试验阶段,并支持For子模块是不完整的。不建议制作多个超级项目的签出。

除了需要手动删除工作目录外,我从来没有遇到过它的问题,即使是子模块。其他链接:我用git-worktree做什么?

最新更新