你现在应该已经有了一个仓库,在工作过程中会对项目做一些修改,比如添加代码、修复错误等等,你将不定时的将这些更改 提交
(commit)到代码仓库。
术语 提交
是将 暂存区
内容放入 版本库
。这个过程涉及到 Git 的一些基本概念,需要在这里说明。我在《TortoiseGit 入门指南02》中解释术语 工作区
(workspace)、暂存区
(Stage)、版本库
(Repository)时说过:
这是 Git 的基本概念之一,你可以忽略这部分内容,但是理解这些基本概念有助于理解 Git 的工作原理,从而更游刃有余的使用版本控制。
这里,我仍然持这个观点。所以当出现新的 Git 基本概念时,让我们先来了解这些重要的概念含义。
工作区
中的每一个文件都不外乎两种状态:未跟踪
(untracked)或 已跟踪
(tracked)。已跟踪的文件是指那些被纳入了版本控制的文件,简而言之,已跟踪的文件就是 Git 已经知道的文件。工作区中除已跟踪文件外的其它所有文件都属于未跟踪文件,它们既不存在于版本库的记录中,也没有被放入 暂存区
。
对于 已跟踪
文件,它们的状态可以是 已修改
(modified)、已暂存
(staged)、未修改
(unmodified)三种之一。
在编辑文件时,Git会将它们识别为 已修改
,因为自上次提交(commit)以来它们已经被改动(changed)。暂存
已修改的文件,然后 提交
所有 已暂存
的更改,使这些文件再次变为 已跟踪
且 未修改
状态。文件状态的转换流程为:
需要特别说明的是,当使用 TortoiseGit 软件时,软件屏蔽了“暂存”这个概念,在 TortoiseGit 软件中“提交”,相当于图示中的“暂存 + 提交”。
版本控制能不能发挥最大作用,取决于恰当的提交以及提交时写下的描述信息。
- 每当完成了一个新功能、修复了一个错误、重构一个模块或者调整格式时,都应该
提交
(commit)一次代码,以便 Git 记录这次修改。 - 每次提交,
提交信息
都应该清晰、准确。关于提交信息格式,可以参考我的博文《Git提交信息格式》。
提交需要程序员手动操作完成,提交信息需要程序员组织与填写,所以可以这么说,程序员决定了版本控制软件能起多大作用。
提交
有了前面的知识做铺垫,使用 TortoiseGit 软件提交修改就很容易了。
选择要提交的文件和/或文件夹,鼠标右键:TortoiseGit - Commit->master
,将弹出“提交对话框”。
提交对话框会显示每个更改的文件,包括已修改、已删除和未跟踪的文件。如果不希望提交某个文件,只需要取消选中该文件。
默认提交对话框仅列出所选文件或目录及其子目录文件。如果要列出项目的所有文件,只需单击 Show Whole Project
复选框。
在提交对话框中双击任何已修改的文件,会启动差异比较程序以显示最近的修改。也可以拖拽文件到其它文本编辑器或IDE程序,以查看文件详情。比如 lwip 协议栈某次提交的差异:
底部显示窗中的列可以自定义:在标题行右键单击,弹出右键菜单选择要显示的列,比如可以显示“Last Modified”(最后修改时间)、“Size”(文件大小)等。这些列宽也可以手动改变,这些自定义选项具有记忆功能,下次启动还可以看到相同的标题。单击每一列的标题可以对文件和目录排序。
选中一个文件,右击鼠标可以调出上下文菜单,提供了更多选项。
-
Compare with base
:与基础版本比较(与最近一次提交做对比),双击该文件也能实现相同效果。 -
Show changes as unified diff
:以统一差异(unified diff)方式显示更改。 -
Revert...
:将文件恢复或者将文件内容恢复成最后一次提交时的状态(注意这可能丢失当前工作)。 -
Skip worktree
:跳过工作树。指示 Git 停止跟踪指定文件。比如数据库配置文件,这个配置文件很复杂,远程仓库必须保留一份默认的版本,以便新克隆的项目能包含这个配置文件。一旦克隆到本地,就会修改这个配置文件。因为大家本地数据库配置都不同,导致每个人的数据库配置文件也不同。所以不能将这个文件提交(push)到服务器,否则别人拉取(pull)的时候会把本地的配置搞坏。这种情况如何处理?
这个时候可以将文件标记为
skip worktree
,之后无论你是否修改此文件,Git 都会将它视为未修改。测试:
将一个修改过的文件
Note.txt
标记为Skip worktree
,文件Note.txt
叠加的图标由已修改状态改为正常状态,提交列表中没有文件Note.txt
。将工程推送到远程仓库,查看远程仓库中的文件Note.txt
,发现本地修改并没有推送到远程仓库。从远程仓库拉取工程,本地仓库中的文件Note.txt
没有改变,修改的内容仍然存在。 -
Assume Unchanged
:将文件标记为假定未修改。为什么要将一个文件假定未修改?
当检查一组文件是否被修改的开销很大时,比如对一些体积庞大的文件进行修改,但每次保存Git都要计算文件的变化并更新工作区,这在硬盘慢的时候延时卡顿非常明显。这个时候可以将文件标记为假定未修改。一旦标记为假定未修改,Git 会假定索引中此部分相关文件于工作副本内不作更改。当远程仓库中该文件更改后,此标记自动失效。
所以将文件标记为假定未修改一般用于:
- 当你修改一个巨大的文件时,首先将其标记为假定未修改,让 Git 忽略你对文件做的修改。
- 当工作告一段落时,取消假定未修改标记,于是 Git 只需要做一次更新计算。
- 提交、推送
-
Restore after commit
:提交后恢复文件。比如我在一个文件中修改了多处代码,然后我发现这些修改属于两个不同的特性,我想分开提交;又比如我在一个文件中修改了多处代码,这些修改的一部分解决了一个紧急BUG,需要马上提交,但是其它修改因为没有完成所以不能提交。类似这些应用场景可以使用下面方法解决:
右击提交对话框中的该文件,在弹出菜单中选择
Restore after commit
,TortoiseGit 会自动创建一个文件副本。这时就可以从提交对话框中将该文件拖到编辑器中,或者双击该文件打开TortoiseGitMerge
工具,将不需要提交的代码去除掉,保存后提交文件。等到文件提交完毕,TortoiseGit 会自动将之前保存的副本替换掉提交的文件,就好像在提交前删除的代码又自动回来了一样。
-
Show log
:调出提交日志对话框。 -
Blame
:将打开 TortoiseGitBlame 程序,显示文件的每一行的作者、最后修改的版本和其它信息。 -
Export selection to...
:将选中的文件导出到指定位置,文件名与原来相同并保留目录结构。 -
View revision in alternative editor
:用替代的编辑器(默认notepad2)打开选中的文件 -
Open
:使用系统默认编辑器打开选中文件 -
Open with...
:将弹出打开方式
对话框,自己选择应用程序打开选中的文件 -
Explore to
:打开文件所在目录 -
Move to changelist
:移动到变更清单。1 变更清单
如果提交的文件有很多,在提交对话框中这些文件都会混合在一起,可以使用变更清单(change lists)功能为文件分组,更容易看清要提交的文件。
右击提交对话框中的文件,在弹出菜单中选择
Move to changelist
,将文件添加到变更列表或者新建一个变更列表。比如可以将.txt
、.xml
、.md
格式文件添加到Docs
分组中。2 从提交列表中忽略指定文件
如果不想每次都提交某个已更改文件,可以右击提交对话框中的该文件,在弹出菜单中选择
Move to changelist - ignore-on-commit
,将这个文件加入到 “ignore-on-commit” 分组中,然后这个文件会自动取消选中。等到你认为可以提交该文件时,可以在提交对话框中手动选中它。
读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)