在没有任何损害的情况下在源中测试新内容的最佳方法

时间:2016-10-25 20:30:52

标签: git github

我和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

的原点提取任何内容之前提交更改

2 个答案:

答案 0 :(得分:1)

如果我理解正确...如果您在branch_1_devel_test中创建文件而未提交,则它将独立于分支(它不会是回购的一部分)。这意味着当您切换回branch_1_devel时,文件仍将作为未跟踪文件存在。如果您在branch_1_devel_test中提交文件,则该文件将成为回购的一部分,并且在您更改分支时将会消失。

如果您想避免放置文件,可以使用stash机制。实际上,我不确定你是否可以存储未经跟踪的文件。无论如何,你要做的事情看起来很奇怪:如果你创建一个值得保留的文件,你应该提交它。如果那时,将来你不再需要它了,你可以删除它(当然,如果它是一个大文件,那么事情会有所不同......)

答案 1 :(得分:1)

您可以使用git worktree,以便在没有comitstash的情况下将开发保留在不同的分支中。它允许独立地检查自己工作目录中的分支。例如:

git worktree add ../project-branch_1 branch_1

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

  

一般多次结账仍是实验性的,并且支持   子模块不完整。不建议制作多个   结帐超级项目。

即使使用子模块,我也从未遇到过问题,除非需要手动删除工作目录。其他链接:What would I use git-worktree for?github worktree notes