基本快照
add
add命令用于使用在工作树中找到的当前内容来更新索引,其为下一次提交(commit
)准备阶段性的内容。通常将现有路径的当前内容作为一个整体添加,但通过一些选项,它也可以用于添加只应用了部分工作树文件更改的内容,或者删除工作树中不再存在的路径。
git status
命令可用于获取一个摘要,其中哪些文件有更改,将在下次提交时暂存。
默认情况下,git add
命令不会添加被忽略的文件。如果在命令行中显式地指定了任何被忽略的文件,git add
将失败,并显示一列被忽略的文件。git add
命令可以使用-f (force)
选项添加被忽略的文件。
选项:
<pathspec>…
:要添加的文件。其规则很简单,主要是通配符*
和?
可以匹配目录分隔符。例如:Documentation/*.jpg
将匹配Documentation
子树中的所有.jpg
文件,包括Documentation/chapter_1/figure_1.jpg
。-f
:允许添加被忽略的文件。
通常用法:
1 | git add . |
用来将所有以改变的文件都更新索引。
status
该命令展示当前索引文件和当前HEAD提交的不同,工作树与索引文件存在差异的路径,以及工作树中未被Git跟踪的路径。
参数
-s
:以短格式化来给出输出。-l
:以长格式来给出输出。-b; --branch
:给出分支和追踪信息(可以以短格式)。-v
:除了已更改的文件的名称外,还显示要提交的暂存文本的更改。--ignored [=<mode>]
:也显示被忽略的文件。mode
参数用于指定对被忽略文件的处理。它是可选的:默认traditional
。
通常用法
1 | git status |
查看当前的文件状态。
diff
该命令用于显示工作树和索引树之间的更改、索引和树之间的更改、两棵树之间的更改、合并导致的更改、两个blob对象之间的更改或磁盘上两个文件之间的更改。
git diff [<options>] [--] [<path>…]
用于查看相对于索引(下一次提交的暂存区域)所做的更改。您可以通过使用git-add
来逐步执行这些更改。
git diff [<options>] --no-index [--] <path> <path>
用于比较给定的文件系统上的两条路径。当运行命令在一个Git控制的工作树并且至少其中一个路径指向Git工作目录时,可以省略--no-index
。
git diff [<options>] --cached [--merge-base] [<commit>] [--] [<path>…]
用于查看下一个提交相对于其他一次<commit>的更改。如果不给出<commit>,则默认是HEAD位置。如果没有HEAD并且<commit>也没有给出,则显示了所有的staged
变化。--staged
与--cached
一样。
如果使用--merge-base
来替换<commit>
,则使用使用<commit>
和HEAD得合并基点(merge base)来和path
进行比较。而不是直接用<commmit>
比较。
git diff [<options>] [--merge-base] <commit> <commit> [--] [<path>…]
用来查看任意两个commit
之间的改变。
如果给出了--merge-base
选项,就是用两个commit
的合并基点(merge base)作为前测,与后面的commit
进行对比。
git diff [<options>] <commit> <commit>… <commit> [--] [<path>…]
用于查看合并提交的结果。列出的第一个<commit>
必须是merge本身;剩下的两个或更多的提交应该是它的父节点。生成所需修订集的一种方便的方法是使用^@
后缀。
commit
创建一个新的提交(commit),包含索引的当前内容和描述更改的给定日志消息。新的提交是HEAD的直接子节点,通常是当前分支的顶端,并且该分支被更新为指向它(除非没有分支与工作树相关联,在这种情况下,如git-checkout
中所述,HEAD被“分离”)。
要提交的内容可以通过以下几种方式指定:
- 通过使用
git-add
,在使用commit命令之前,递增地“添加”对索引的更改。 - 在使用commit命令之前,使用
git-rm
从工作树和索引中删除文件。 - 通过列出文件作为提交命令的参数(没有
--interactive
或--patch switch
),在这种情况下,提交将忽略索引中的更改,而是记录列出文件的当前内容(这必须是Git已经知道的); - 通过使用
-a
参数和commit命令自动“添加”所有已知文件(即所有已经在索引中列出的文件)的更改,并自动“rm”索引中已经从工作树中删除的文件,然后执行实际的提交;-可以省略add步骤(如果全部提交)。 - 通过使用
--interactive
或--patch
开关和commit
命令来逐个决定除了索引中的内容之外,哪些文件或块应该作为提交的一部分,然后再完成操作。
选项
-a;--all
:告诉命令自动处理已经被修改和删除的文件(也相当于自动add),但是没有告诉Git的新文件不受影响。-p;--patch
:使用交互式补丁选择接口来选择要提交的更改。-C <commit>; --reuse-message=<commit>
:获取一个现有的提交对象,并在创建提交时重用日志消息和作者信息(包括时间戳)。-c <commit>; --reedit-message=<commit>
:与-C
类似,但使用-C
会调用编辑器,以便用户可以进一步编辑提交消息。--reset-author
:当与-C/ -c/--amend
选项一起使用时,或者在发生冲突的选择之后提交时,声明结果提交的作者现在属于提交者。这也会更新作者的时间戳。--short
:使用短格式来输出。--long
:使用长格式来输出。--branch
:显示分支和跟踪信息。-F <file>; --file=<file>
:从给定的文件中获取提交消息。--author=<author>
:覆盖全局得提交作者。--date=<date>
:覆盖提交中使用的作者日期。-m <msg>; --message <msg>
:使用给定的<msg>
作为提交消息。如果给出了多个-m选项,它们的值将连接成单独的段落。注意:-m
与-c
、-c
、-F
互斥。-s; --signoff; --no-signoff
:在提交日志消息的末尾添加一个由提交者签名的拖尾。终止的意义取决于你所提交的项目。例如,它可以证明提交者有权在项目许可下提交作品,或者同意一些贡献者的代表,例如开发者原产地证书。参考您正在参与的项目的文档或领导,以理解在该项目中如何使用结束。- **
--allow-empty
**:允许提交与上一次commit
完全相同的文件内容,其他信息都可以修改,如<msg>
。 - **
--allow-empty-message
**:允许提交一次不包含<msg>
的commit
。 -e; --edit
:打开编辑器(系统设定的默认文本编辑器)来修改来自-F
或者-m
的消息。--no-edit
:默认,直接提交来自-F
或者-m
的消息。--amend
:直接替换上一次commit
记录(慎重),上一次的commit
信息都没了。
note
添加、删除或读取附加到对象的注释,而不接触对象本身。默认情况下,注释被保存到refs/notes/commits
中并从refs/notes/commits
中读取,但是这个默认值可以被覆盖。请参阅下面的选项、配置和环境部分。如果这个ref不存在,它将在第一次需要存储笔记时被静默创建。
注释的典型用法是补充提交消息,而不更改提交本身。可以通过git log
显示注释和原始的提交消息。为了区分这些注释和存储在提交对象中的消息,注释像消息一样被缩进,在一个未缩进的行notes (<refname>):
(或notes:
对于refs/notes/commits
)之后。
Notes
也可以通过使用--Notes
选项添加到使用git format-patch
准备的补丁中。这样的注释作为补丁注释添加在三个破折号分隔线之后。
子命令
list
:列出给定对象的notes对象。如果没有给出对象,则显示所有注释对象及其注释对象的列表(格式为<注释对象> <注释对象>
)。如果没有给出子命令,这是默认的子命令。add
:为给定对象添加notes
(默认为HEAD)。如果对象已经有注释则中止(使用-f
覆盖现有的注释)。但是,如果您是交互式地使用add(使用编辑器提供注释内容),那么现有的注释将在编辑器中打开而不是终止(就像编辑子命令)。copy
:复制第一个对象的notes
到第二个对象(默认是HEAD)。如果第二个对象已经有note或者第一个对象没有note,则终止。append
:向一个已经存在note的对象追加note(默认HEAD)。如果不存在就创建一个note。edit
:编辑给定对象的notes
(默认HEAD)。show
:展示给定对象的notes(默认HEAD)。merge
:合并给定的note引用到当前的note引用。这将尝试将给定notes ref
(称为remote
)所做的更改合并到当前notes ref
(称为local
),因为merge-base
(如果有的话)。remove
:移除给定对象的notes(默认HEAD)。当从命令行给出零个或一个对象时,这相当于向编辑子命令指定一个空的注释消息。get-ref
:打印当前的notes引用。这提供了一个简单的方法来检索当前的notes引用(可用于merger子命令)。
选项
-f; --force
:当向已经有notes的对象添加注释时,覆盖现有的notes(而不是中止)。-m <msg>; --message=<msg>
:使用给定的注释消息(而不是prompting
)。如果给出了多个-m
选项,它们的值将连接成单独的段落。以#开头的行和段落之间除了一行以外的空行将被删除。-F <file>; --file=<file>
:从给定的文件中获取笔记消息。以#开头的行和段落之间除了一行以外的空行将被删除。-C <object>; --reedit-message=<object>
:将给定的blob
对象(例如,另一个注释)作为注释消息。(使用git notes copy <object>
代替在对象之间复制notes。)-c <object>; --reedit-message=<object>
:与-C
类似,但使用-C
会调用编辑器,以便用户可以进一步编辑注释消息。--allow-empty
:允许存储一个空的笔记对象。默认的行为是自动删除空注释。--commit
:完成正在进行的git注释合并。被合并后会自动更新并提交。
restore
这里现列举出以下三个命令的区别:
reset
restore
revert
主要区别有
git-revert
:进行一个新提交(commit)来恢复其他提交所做的更改。git-restore
:从索引或其他提交中恢复工作树中的文件。这个命令不会更新你的分支。该命令还可以用于从另一个提交恢复索引中的文件。git-reset
:更新你的分支,移动分支的顶端,以便添加或删除分支提交。该操作将更改提交历史记录。
该命令可以从一个还原源中来还原指定工作树中的特定目录或文件。如果一个路径被跟踪,但是在恢复源中不存在,那么它将被删除以匹配源。
该命令还可以用于:
--staged
恢复索引中的内容,(即撤销上一次add操作)。--staged --worktree
恢复工作树和索引(即撤销add操作并恢复文件内容)。
默认情况下,如果给出--staged
,则从HEAD恢复内容,否则从索引恢复内容。使用--source
从不同的提交恢复。
选项
-s <tree>; --source=<tree>
:使用给定树中的内容恢复工作树文件。通常通过命名提交、分支或与之关联的标记来指定源树。如果没有指定,则从HEAD中恢复,否则从从给出的索引恢复。-p; --patch
:交互式地根据恢复源和恢复位置之间的差异选择块。-W; --worktree;; -S; --staged
:指定恢复位置。如果没有指定任何选项,默认情况下将恢复工作树。指定--staging
只会恢复索引。两个都指定则索引和文件都会被恢复。-q: --quiet
:静默,压制反馈信息。--progress
:默认信息,将会报告所有信息。-m; --merge
:当从索引中恢复工作树中的文件时,在未合并的路径中重新创建冲突的合并。--overlay; --no-overlay
:在overlay
模式下,该命令在恢复时永远不会删除文件。在no-overlay
模式下,不出现在--source
树中的跟踪文件将被删除,以使它们完全匹配<tree>
。默认为无覆盖模式。
reset
该命令用于重置当前的HEAD到指定的状态。
其有以下使用格式:
git reset [-q] [<tree-ish>] [--] <pathspec>…
;git reset [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]
这两种格式将重置所有匹配<pathspec>
的目录索引到他们在<tree-ish>
的状态。(它不影响工作树或当前分支。)
这就意味着git reset <pathspec>
与git add <pathspec>
是完全相反的操作。并且这条命令也是和git restore [--source=<tree-ish>] --staged <pathspec>...
是相等的。
运行git reset <pathspec>
命令更新索引项后,可以使用git-restore
命令查看工作树索引的内容。或者,使用git-restore
并使用--source
指定提交,您可以将提交中的路径内容一次性复制到索引和工作树中。
git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>…]
交互式地选择索引和<树状>之间的差异的块(默认为HEAD)。所选的块以相反的方式应用于索引。
这意味着,git reset -p
是与git add -p
相反的,也就是说,你可以使用它来选择性地重置大块数据。
git reset [<mode>] [<commit>]
这种格式将当前分支的HEAD重置为<head>
并且可能更新索引(将其重置为<commit>
的状态)和工作树。其工作模式依赖于<mode>
参数。默认为--mixed
。所有模式如下:
--soft
:完全不碰索引文件或工作树(但将头部重置为<commit>
,就像所有模式那样)。这使得所有你更改的文件都是Changes to be committed
,就像git状态显示的那样。--mixed
:重置索引,但不重置工作树(即,更改的文件保留,但不标记为提交(commit
)),并报告未更新的内容。这是默认操作。如果指定了-N
,删除的路径将被标记为意图添加。--hard
:重置索引和工作树。自<commit>
以来对工作树中跟踪文件的任何更改都将被丢弃。任何在恢复阶段没有被追踪,而当前阶段跟踪的文件或目录被简单地删除(慎用)。--merge
:重置索引并更新工作树中与<commit>
和HEAD不同的文件,但保留索引和工作树中与之不同的文件(即有更改但未添加(add)的文件)。如果一个文件在<commit>
和索引之间不一致,则会中止重置。换句话说,--merge
的作用类似于git read-tree -u -m <commit>
,但它会将未合并的索引项带向前。keep
:重置工作树中<commit>
和HEAD之间不一致的索引项,并更新文件。如果一个文件在<commit>
和HEAD之间有不同的本地更改,reset将被中止。--[no-]recurse-submodules
:当工作树被更新时,使用--recursive -submodules
也会根据父项目中记录的提交,递归地重置所有活动子模块的工作树,并在提交时将子模块的HEAD设置为分离。
选项
-q; --quiet;; --no-quiet
:静默/不静默(默认)。
rm
从索引中删除匹配pathspec
的文件,或者从工作树和索引中删除。git rm
不会从你的工作目录中删除文件。被删除的文件必须与分支的顶端相同,并且不能在索引中显示对其内容的更新,尽管可以使用-f
选项重写默认行为。当给出--cached
时,暂存的内容必须匹配分支的尖端或磁盘上的文件,从而允许仅从索引中删除文件。当使用 sparse-checkouts
模式时,git rm
将只删除稀疏签出模式中的路径。
选项:
<pathspec>…
:要被移除的文件。可以指定前置目录名(例如,dir
用于删除dir/file1
和dir/file2
)来删除目录中的所有文件,并递归地删除所有子目录,但这需要显式地指定-r选项。该命令只删除git
已知的路径。(也可以使用通配符*来移除)-f; --force
:强制性的移除(当被删除的文件不与分支的顶端相同时也可以被移除)(慎用)。-n; --dry-run
:不要实际删除任何文件。相反,只需显示它们是否存在于索引中,否则将被命令删除。-r
:当给出前导目录名时,允许递归删除。--cached
:此选项把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除--ignore-unmatch
:即使没有匹配的文件,也将以零状态退出。
mv
移动或重命名一个文件、目录或符号链接。
格式
1 | git mv [-v] [-f] [-n] [-k] <source> <destination> |
在第一种形式中,它将<source>
重命名为<destination>
,它必须存在并且是一个文件、符号链接或目录。
在第二种形式中,最后一个参数必须是一个已存在的目录;给定的源代码将被移动到这个目录中。
索引在成功完成后更新,但更改仍然必须提交。
选项
f; --force
:强制重命名或移动文件,即使目标存在。-k
:跳过移动或重命名操作,这将可能导致错误情况。当源文件既不存在也不受git控制时,或者除非指定-f
,否则它将覆盖现有文件时,就会发生错误。-v; --verbose
:在移动文件时报告文件的名称。