教程 > Git 教程 > Git 仓库操作 阅读:1387

Git commit 提交暂存区的修改

git commit命令捕获当前项目在暂存区更改的快照。提交的快照可以被认为是项目的“安全”版本。除非你明确要求,Git 永远不会改变这些版本。

在执行git commit 之前,git add 命令用于将项目中的更改提交到“暂存区”。git commit 和 git add两个命令是两个最常用的命令。

Git commit 和 Svn commit

git commitsvn 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 会在每次提交中记录每个文件的全部内容。

Svn记录文件差异
Svn记录文件差异

这使得许多 Git 操作比 SVN 快得多,因为文件的特定版本不必从再比较其差异,然后根据差异将内容再“组装”成文件——每个文件的完整修订版可以立即从 Git 的内部数据库中获得。

Git 记录整个文件快照
Git 记录整个文件快照

Git 的快照模型对其版本控制模型的几乎每个方面都有深远的影响,影响从分支和合并工具到协作工作流的方方面面。

常用选项

$ git commit

提交暂存区的快照。这将启动一个文本编辑器,提示您输入提交消息。输入消息后,保存文件并关闭编辑器以创建实际提交。

git commit命令

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 status 查看当前仓库状态

红色表示当前修改的文件,此次修改还为加入暂存区

$ 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

Git add 之后查看仓库状态

绿色输出暂存区里修改之后的文件: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 Log查看提交记录

$ git add hello.txt
$ git commit --amend

打开编辑器,修改提交信息,保存退出编辑器之后,本次提交修改成功。我们再次使用 git log 命令查看当前的提交记录

Git 修改提交信息之后的提交记录

我们可以看到并没有新增提交记录,其实就是相当于将当前的修改追加到上一次的提交记录中。

git commit命令是GIT中的核心主要功能之一。需要事先使用git add命令来将更改添加到暂存区,作为下一次提交的内容。然后git commit用于创建沿 Git 项目历史时间线的分阶段更改的快照。

查看笔记

扫码一下
查看教程更方便