虽然我理解git索引在通过暂存许多较小的haks进行复杂的合并时很有用,但我不明白为什么非合并应该或者需要通过索引。考虑下面的例子。
我在一个项目上工作并在许多文件中进行更改。有些我打算提交,有些可能只是在调试期间临时使用(例如跟踪语句)。功能完成后,我需要进行提交。现在,让我们假设我没有进行所有必要的更改并且提交被破坏而犯了错误。除非我在某处检查分阶段的更改并重新编译并重新测试(在我看来不是很有效的方法),我甚至不知道这个问题,并且必须稍后重写该提交。
这让我想到,也许我应该只编译和测试分阶段的内容,如果它等于工作副本本身会更容易。然而,未跟踪文件的问题仍然存在。
如何使用索引来确保分阶段更改是好的?
答案 0 :(得分:3)
除非我在某处检查分阶段的更改并重新编译并重新测试(在我看来不是很有效的方法)
这非常有成效。它被称为"continuous integration testing"或CI。这被认为是最佳实践。这些天可以免费找到CI服务器,包括用于Windows测试的TravisCI,GitLab CI和AppVeyor。
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
并合理地确定这是正确的。