2016-09-27 62 views
1

虽然我知道git索引如果在通过分段很多较小的区块进行复杂合并时很有用,我不明白为什么非合并应该或需要通过索引。考虑下面的例子。如何使用git索引来测试更改是否有效?

我在一个项目上工作,并在许多文件中进行更改。有些我打算提交,有些可能只是在调试过程中临时使用(例如跟踪语句)。功能完成后,我需要进行提交。现在,让我们假设我没有执行所有必要的更改而犯了错误,并且提交被破坏。除非我在某个地方结账,然后重新编译和重新测试(我认为这不是一个高效的方法),否则我甚至不知道这个问题,并且稍后必须重写该提交。

它使我认为,也许我应该编译和测试只有分段内容,如果这将等于工作副本本身,它会更容易。但未跟踪文件的问题仍然存在。

应该如何使用索引来确保阶段性变化是好的?

+0

您可以使用'git stash'删除所有临时工作(使用'git stash apply'进行恢复)。留下未跟踪文件的问题,但是... – knittl

+0

@knittl查看'git stash save -u'。 – Schwern

回答

3

除非我签上演变化的地方,并重新编译和重新测试(不太富有成效的做法在我看来)

这是非常有成效的。它被称为"continuous integration testing"或CI。这被认为是最佳做法。 CI服务器可以免费找到这些日子,包括TravisCI,GitLab CIAppVeyor用于Windows测试。

CI确保代码的干净副本在干净的环境中进行测试。这会产生你提到的那些问题,忘记提交一些东西,以及其他许多问题。它还避免了基于特定开发机器的任何假设,如您忘记声明的任何依赖关系。

CI可以运行用户可能遇到的操作系统,编译器和依赖关系的各种组合。它还使得捐助和接受捐款变得更加容易,因为CI服务器确保这些捐款经过测试。

而且,也许最重要的是,它确保测试运行。人们有时会忘记,或者变得懒惰。


我在一个项目上工作,并在许多文件中的更改。有些我打算提交,有些可能只是在调试过程中临时使用(例如跟踪语句)。

你想要它,以便当你运行git status什么它说要上演。那么就没有必要仔细检查git status来找出什么是和不要上演。这大大减少了丢失东西的机会(或者意外提交了某些东西)。

$ git status 
On branch master 
Your branch is up-to-date with 'origin/master'. 
nothing to commit, working tree clean 

首先是要明智地使用.gitignore忽略不属于被提交的任何文件。这包括构建工件和本地配置文件。

其次是避免习惯性地从承诺提交手写的调试语句。它真的是很容易意外提交它们,其他开发人员不会从中受益。相反,使用调试标志并将它们放入。根据需要翻转调试标志。


这使我想到,也许我应该编译和测试只上演的内容,它会更容易些,如果这样做等于工作副本本身。但未跟踪文件的问题仍然存在。

这是一个好主意。你可以通过stashing your changes来完成。存储是存储正在进行的工作的一个小小的地方,有点像保存补丁文件。基本的工作流程是...

# Save all changes except what is staged 
$ git stash save -ku 

...do your testing on the staged change... 

# If it worked, commit the change. 
$ git commit 

# Restore your unstaged changes and untracked files. 
$ git stash pop 

-k说保持任何已经上演。 -u表示存储未跟踪的文件。


一般来说,任何需要所有人都小心的过程将会失败。持续集成意味着您不能忘记运行测试,或在特定环境中运行测试。保持你的工作目录清洁意味着人们不必仔细检查要登台或不登台,他们可以习惯性地把所有东西都展示出来。人们可以拨打git add .git commit -a,并合理确定它是正确的。

相关问题