Git commit 提交暂存区的修改
git commit命令捕获当前项目在暂存区更改的快照。提交的快照可以被认为是项目的“安全”版本。除非你明确要求,Git 永远不会改变这些版本。
在执行git commit
之前,git add 命令用于将项目中的更改提交到“暂存区”。git commit 和 git add两个命令是两个最常用的命令。
Git commit 和 Svn commit
git commit
与 svn commit
虽然名称相同,都是用来提交更改的。但是二者是有本质的区别的。Svn 是集中式应用程序模型 ,Git 是分布式应用程序模型 。
在 SVN 中,commit 会将更改从本地 SVN 客户端推送到远程集中共享的 SVN 仓库。在 Git 中,仓库是分布式的,快照提交到本地仓库,这完全不需要与其他 Git 仓库交互。Git 的提交稍后可以推送到任意远程仓库。
工作原理
Git可以被看作是一个时间轴管理实用程序。提交是Git项目时间表的核心构建块单元。提交可以被认为是Git项目时间表上的快照或里程碑。提交是使用git commit命令创建的,用于捕获项目在该时间点的状态。Git快照始终提交到本地仓库。这与SVN有着本质的不同,SVN将工作副本提交到中央仓库。相反,Git不会强迫我们在准备好之前与中央仓库进行交互。正如暂存区是工作目录和项目历史记录之间的缓冲区一样,每个开发人员的本地仓库也是他们的项目和中央仓库之间的缓冲区。
这改变了 Git 用户的基本开发模式。Git 开发人员无需进行更改并将其直接提交到中央仓库,而是在其本地仓库中累积提交。与 SVN 风格的协作相比,这有许多优点:
- 它可以更轻松地将功能拆分为原子提交,将相关提交组合在一起。
- 在将更改发布到中央仓库之前清理本地历史记录。
- 它还允许开发人员在隔离的环境中工作,互相之间不受影响
快照 而不是 文件差异
除了 SVN 和 Git 之间的实际区别之外,它们的底层实现也遵循完全不同的设计理念。SVN 跟踪文件的差异,而 Git 的版本控制模型基于快照。例如,SVN 提交包含与添加到仓库的原始文件相比的差异。而Git 会在每次提交中记录每个文件的全部内容。
这使得许多 Git 操作比 SVN 快得多,因为文件的特定版本不必从再比较其差异,然后根据差异将内容再“组装”成文件——每个文件的完整修订版可以立即从 Git 的内部数据库中获得。
Git 的快照模型对其版本控制模型的几乎每个方面都有深远的影响,影响从分支和合并工具到协作工作流的方方面面。
常用选项
$ git commit
提交暂存区的快照。这将启动一个文本编辑器,提示您输入提交消息。输入消息后,保存文件并关闭编辑器以创建实际提交。
我这配置的默认是使用的 Vim 编辑器。
我们还可以直接在git commit 命令后面使用选项 -m
来指定要输入的消息,从而不用再开启一个编辑器。
$ git commit -m "这里输入的是本次提交的信息"
我们知道, git commit 是提交暂存区里的修订版本。也就是说每次在调用git commit 之前,我们都必须先使用git add
命令将修改的内容添加到暂存区。下面我们可以使用 -a
选项就能省略git add命令了。
$ git commit -a
-a 选项就可以直接将修改的内容直接添加到暂存区然后提交。但是这里仅仅是对已经存在的文件进行修改。而对于新创建的文件,则必须先使用
git add
命令将其加入暂存区
$ git commit -am "这里输入的是本次提交的信息"
将-a
和-m
选项一起使用时高级用户快捷命令。这种组合会立即创建所有暂存更改的提交并附加提交消息。
$ git commit --amend
修改最后一次提交的消息。注意这并不会创建一个新的提交。
示例
下面的示例假设已经编辑了在当前分支上的文件hello.txt中的一些内容,并准备将其提交到项目历史记录中。首先,我们需要使用git add
将文件暂存,然后可以提交暂存快照。
红色表示当前修改的文件,此次修改还为加入暂存区
$ git add hello.txt
此命令将添加hello.txt
到 Git 暂存区。我们可以使用git status命令检查此操作的结果。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: hello.txt
绿色输出暂存区里修改之后的文件:hello.txt 表示hello.txt将在下次提交时保存。
$ git commit
这将打开一个文本编辑器(可通过 git config 命令自定义),要求提供提交日志消息以及正在提交的内容列表:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
# modified: hello.txt
Git 不要求提交信息遵循任何特定的格式约束,但规范格式是在第一行用少于 50 个字符总结整个提交的内容,留一个空行,然后详细说明更改的内容。例如:
修改hello.txt 文件 修改的内容是将 Hello Jiyik 改为了 Hello 迹忆客 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Changes to be committed: # modified: hello.txt
如何更新/修改提交信息
继续修改上例中的 hello.txt文件。让我们进一步更新hello.txt。修改之后,在提交暂存区之前我们先看一下当前仓库中的提交记录(使用 git log 命令)
$ git add hello.txt
$ git commit --amend
打开编辑器,修改提交信息,保存退出编辑器之后,本次提交修改成功。我们再次使用 git log 命令查看当前的提交记录
我们可以看到并没有新增提交记录,其实就是相当于将当前的修改追加到上一次的提交记录中。
git commit
命令是GIT中的核心主要功能之一。需要事先使用git add命令来将更改添加到暂存区,作为下一次提交的内容。然后git commit用于创建沿 Git 项目历史时间线的分阶段更改的快照。