git add
git add命令将工作目录中的更改添加到暂存区。它告诉Git你想在下一个提交中包含特定文件的更新。但是,git add并不会以任何重大的方式影响仓库 - 在运行git commit 之前,实际上并不会记录更改。
这些命令,您还结合需要git status命令查看工作目录和暂存区的状态。
用法
git add <file>
为下一次提交暂存
git add <directory>
对下一次提交暂存
git add -p
开始交互式登台会话,让您选择要添加需要暂存到下一个提交的文件哪些部分。这将提供一系列修改块,并提示您进行命令。使用y暂存这个修改块,使用n来忽略该块,使用s将其拆分成较小的块,e手动编辑该块,然后q退出。
讨论
命令git add和git commit命令组成了基本的Git工作流程。这些是每个Git用户需要了解的两个命令,不管他们的团队合作模式如何。它们是将项目的版本记录到仓库历史记录中的方法。
开发项目基本围绕编辑/暂存/提交模式。首先,在工作目录中编辑文件。当您准备保存项目当前状态的副本时,您可以使用git add暂存更改。在您对暂存的快照感到满意之后,您就可以使用git commit将其提交到项目历史记录中。
git add命令不应该被混淆svn add,svn add将文件添加到仓库。相反,git add在修改的更抽象的层面上工作。这意味着git add每次更改文件时都需要调用,而svn add只需要为每个文件调用一次。这可能听起来是冗余的,但是这个工作流使得项目的组织变得更加容易。
暂存区
暂存区是Git更独特的功能之一,如果您有来自SVN(甚至Mercurial)背景,可能需要一些时间才能将其理解。可以将其视为工作目录和项目历史记录之间的缓冲区。
不提交自上次提交以来所做的所有更改,您可以在提交到项目历史记录之前,选择相关的更改暂存到高度聚焦的快照中。这意味着您可以对不相关的文件进行各种编辑,然后返回并将其分解为逻辑提交,再将相关更改添加到暂存区中并逐个提交。与任何版本控制系统一样,重要的是创建原子提交,以便轻松地跟踪错误并恢复更改,同时对项目的其余部分影响最小。
示例
当您开始一个新项目时,git add具有与svn import相同的功能。要创建当前目录的初始提交,请使用以下两个命令:
git add .
git commit
一旦你的项目运行正常,可以通过将路径传递给git add:
git add hello.py
git commit
上述命令也可用于记录对现有文件的更改。再次强调,Git并不区分新文件中的暂存更改与已经添加到仓库的文件的更改。
git提交
git commit命令将暂存的快照提交到项目历史记录。提交的快照可以被认为是项目的“安全”版本 - 除非你明确地要求,否则Git永远不会改变它们。结合git add,这是最重要的Git命令之一。
虽然他们共享相同的名字,但这个命令并不是什么svn commit。快照将致力于本地仓库,并且这绝对不需要与其他Git仓库进行交互。
用法
git commit
提交暂存快照。这将启动一个文本编辑器,提示您提交提交消息。输入消息后,保存文件并关闭编辑器以创建实际提交。
git commit -m "<message>"
提交暂存快照,而不是启动文本编辑器,
git commit -a
提交工作目录中所有更改的快照。这仅包括对跟踪文件的修改(git add在历史记录中的某个时刻添加的文件)。
讨论
快照一直是在本地仓库。这与SVN基本不同,其中工作副本被提交到中央仓库。相比之下,Git不会强制您在准备好之前与中央仓库进行交互。正如暂存区是工作目录和项目历史记录之间的缓冲区一样,每个开发人员的本地仓库都是它们的贡献和中央仓库之间的缓冲区。
这改变了Git用户的基本开发模式。Git开发者不用改变,直接将其直接交给中央仓库,而是有机会在本地仓库中累积提交。与SVN风格的协作相比,它具有许多优点:它可以将功能分解为原子提交,将相关的提交分组在一起,并在发布到中央仓库之前清理本地历史记录。它还使开发人员在孤立的环境中工作,推迟合并,直到它们处于方便的时候。
快照,而不是差异
除了SVN和Git之间的实际区别之外,它们的基本实现也遵循完全不同的设计理念。而SVN跟踪文件的差异,Git的版本控制模型基于快照。例如,SVN提交包含与添加到仓库的原始文件相比较的diff。另一方面,Git 在每个提交中记录每个文件的全部内容。
这使得许多Git操作比SVN快得多,因为特定版本的文件不需要从其diffs“组装” - 每个文件的完整版本可以立即从Git的内部数据库获得。
Git的快照模型对其版本控制模型的几乎每个方面都有深远的影响,影响了从分支和合并工具到协作工作流程的所有内容。
示例
以下示例假设您已在一个文件中编辑了一些内容,hello.py并准备将其提交给项目历史记录。首先,您需要对文件进行git add暂存,然后可以提交暂存快照。
git add hello.py
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:
# (use "git reset HEAD <file>..." to unstage)
#
#modified: hello.py
Git不需要提交消息来遵循任何特定的格式化约束,但是规范格式是以不超过50个字符的方式总结第一行上的整个提交,留下空行,然后详细说明已更改的内容。例如:
Change the message displayed by hello.py
- Update the sayHello() function to output the user's name
- Change the sayGoodbye() function to a friendlier message
请注意,许多开发人员也喜欢在其提交消息中使用现在时态。这使得它们更像是在仓库中的操作,这使得许多历史重写操作更加直观。