想要了解git add,commit原理的可以参考下面文章,非常有用,强烈推荐。
Git 原理入门
学习Git时候,多用 -h或者--help查看用法。
add
git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
[--chmod=(+|-)x] [--] [<pathspec>…]
git add file(s)
git add . 添加文件下所以文件
git add tes_*.txt 正则表达式添加文件
git add 文件1 文件2 一次添加多个文件
- [--dry-run | -n]
文件不会添加到暂存区,作用只是展示该文件是否存在或者将被忽略,显示作用而已。 - [--force | -f]
强制添加(除了被忽略的文件),比如使用git add 添加所以文件或者单个文件时,文件(非忽略文件)可能添加不成功。 -
[--intent-to-add | -N]
仅记录稍后将要添加的路径。路径的条目放在索引中,没有内容。解释有点抽象,下面通过实例来看看有什么不同。
用git add 添加test.txt文件 和 git add -N添加testN.txt文件,然后git status
屏幕快照 2019-05-06 下午6.20.17.png
官网说在 git diff 和 git commit -a很有用,那差别到底是怎么样的呢?
git diff
不用"-N"参数,在使用git diff是不会打印任何东西的,但是用了“-N”会打印最近文件修改,添加的内容,可以自己试一试。
git commit -a
这个到没有发现什么大的作用,用这个命令,不管用没有用“-N”添加的文件都能够被提交。
知识拓展
-
执行git add添加某个文件后,怎么从暂存区移除
git rm xxx:删除工作目录和暂存区域的文件(两个地方文件一样) git rm -f xxx:如果工作目录和暂存区域的文件不一样,Git会有提示,可以暴力删除,两个区域都删 git rm --cached xxx:只删除暂存区的文件
-
在merge,rebase代码时出现冲突文件,解决冲突后,用git add命令消除文件的冲突状态。
status
git status [<options>…] [--] [<pathspec>…]
显示索引文件与当前HEAD提交之间存在差异的路径,工作树与索引文件之间存在差异的路径,以及工作树中未由Git跟踪的路径。
- [--branch | -b]
显示分支和跟踪信息。 - [--show-stash]
显示当前储藏区的条目数(用 git stash list可以查看)
diff
git diff [<options>] [<commit>] [--] [<path>…]
git diff [<options>] --cached [<commit>] [--] [<path>…]
git diff [<options>] <commit> <commit> [--] [<path>…]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path>
显示工作树与索引或树之间的更改,索引与树之间的更改,两个树之间的更改,两个blob对象之间的更改或磁盘上两个文件之间的更改。
说白就是展示前后文件的不同,只是选择的哪里的文件进行比较不同而已。
git diff [<options>] [--] [<path>…]
此表单用于查看您对索引所做的更改(下一次提交的暂存区域)。换句话说,差异是你可以告诉Git进一步添加到索引。
意思就是文件相对于暂存区的文件有什么不同,比如我们添加了一个test.txt文件,然后我修改了该文件,现在执行git diff test.txt就会展示修改后的文件与暂存区里的文件差异。
git diff [<options>] --no-index [--] <path> <path>
此表单用于比较文件系统上给定的两个路径。在由Git控制的工作树中运行命令时,可以省略--no-index选项,并且至少有一个路径指向工作树外部,或者在Git控制的工作树外运行命令时。
即指定两个文件路径比较不同。
git diff [<options>] --cached [<commit>] [--] [<path>…]
此表单用于查看您为下一次提交相对于命名的<commit>而进行的更改。通常,您希望与最新提交进行比较,因此如果您不提供<commit>,则默认为HEAD。如果HEAD不存在(例如未出现的分支)并且未给出<commit>,则显示所有分阶段的更改。 --staged是--cached的同义词。
文件被add后放入暂存区,通过commit提交,“下一次提交”其实就是指“暂存区”最近添加的文件,因为这些文件成为下一次提交的内容。<commit>指定某次提交的id(通过git log可以获取),和这次提交的文件进行比较。
git diff [<options>] <commit> [--] [<path>…]
此表单用于查看工作树中相对于命名<commit>的更改。您可以使用HEAD将其与最新提交进行比较,或使用分支名称与其他分支的提示进行比较。
这里没有--cached,指定是工作树下指定文件和<commit>比较,不管该文件是否add过,可以认为就是指定文件的最新状态。
git diff [<options>] <commit> <commit> [--] [<path>…]
这是为了查看两个任意<commit>之间的变化。
git diff [<options>] <commit>..<commit> [--] [<path>…]
这与之前的表格同义。如果省略了一侧的<commit>,它将具有与使用HEAD相同的效果。
即查看第一个<commit>(不包含)到第二<commit>(包含)的更改。
git diff [<options>] <commit>...<commit> [--] [<path>…]
此表单用于查看包含第二个<commit>的分支上的更改,从<commit>的共同祖先开始。 “git diff A ... B”相当于“git diff $(git merge-base A B)B”。您可以省略<commit>中的任何一个,它与使用HEAD具有相同的效果。
即从两个<commit>的共同祖先到第二个<commit> (包含)的更改,这里的...不代表中间有多个<commit>,这里就两个<commit>。
git diff [<options>] <blob> <blob>
此表单用于查看两个blob对象的原始内容之间的差异。
- 什么是blob
blob组件是在代码提交到Stage区域后,git会会创建一个blob组件存储到objects文件夹中。不明白的,百度吧。
通过命令git hash-object 文件名查询文件的hash码,这个hash码就是我们的blob组件的名称。
git commit
-
--reset-author
更新作者信息为当前提交者 -
--author=<author>
覆盖提交作者 -
[--template=<file> | -t <file>]
编辑提交消息时,使用给定文件中的内容启动编辑器。 commit.template配置变量通常用于向命令隐式提供此选项。希望引导参与者提供有关在消息中以什么顺序写入内容的一些提示的项目可以使用此机制。如果用户在不编辑消息的情况下退出编辑器,则中止提交。比如新建文件new.template,然后在文件安装提交规范写入内容,在提交的时候使用-t指定,git commit -t new.template <提交文件1>,这是会打开提交信息编辑界面,顶部就可以看到有new.template规范内容。
-
[--signoff | -s]
在提交日志消息的末尾由提交者添加逐行签名 -
[--no-verify | -n]
此选项绕过pre-commit和commit-msg挂钩。git提供了hook机制,在你commit之前可以挂一个钩子,然后执行自己的操作,当然git提供了很多类似的hook功能。在.git/hooks目录下有很多文件,具体怎么用,参考git hooks相关文章。 -
[--allow-empt]
通常记录与其唯一父提交具有完全相同的树的提交是错误的,并且该命令阻止您进行此类提交。此选项绕过安全性,主要供外部SCM接口脚本使用。
意思在没有任何更改的情况下,执行了提交,这时候不会在进行提交流程。
-
[--allow-empty-message]
允许在提交时,不填入提交信息 -
[--cleanup=<mode>]
此选项确定在提交之前应如何清除提供的提交消息,mode请查看官方文档。 -
[--edit | -e]
从带有-F的文件,带有-m的命令行和带有-C的提交对象获取的消息通常用作未修改的提交日志消息。此选项允许您进一步编辑从这些来源获取的消息。比如:git commit -e -m <提交信息> <提交文件>,这时候还是会
-
[--no-edit]
使用选定的提交信息而不启动编辑器。例如,git commit --amend --no-edit修改
提交而不更改其提交信息。 -
[--amend]
git commit --amend可以修订最后一次commit的功能,会改变提交的SHA-1值使用这项技术的时候你必须小心,因为修正会改变提交的SHA-1值。这个很像是一次非常小的rebase——不要在你最近一次提交被推送后还去修正它。
解释:当提交已经push到远程仓库,这时通过--amend修改信息,注意,不是在最后一次提交上新添加一条提交,而是修改最后一次提交,所以,一旦修改,之前的最后一次提交在远程仓库还存在,而在本地却不存在了,所以,这时候,你通过git pull拉取远程仓库代码时,会提示合并,但是事实上,我们并不需要合并,当然,更改后,可以git push -f 覆盖远程仓库。
更多参考:Git 工具 - 重写历史
- 修改最后一次commit提交信息:
首先看一下提交历史:git log --oneline
修改信息:git commit --amend -m "c3"
如果不用-m,这会把你带入文本编辑器,里面包含了你最近一次提交说明,供你修改。当你保存并退出编辑器,这个编辑器会写入一个新的提交,里面包含了那个说明,并且让它成为你的新的最近一次提交。 - 修改最后一次提交,添加文件:
添加文件:git add ant.txt
提交:git commit --amend --no-edit
这样就可以在最后一次提交中追加一个新的文件。
--no-edit表示最后一次提交信息"c3"没必要修改,保持原样即可
push到远程仓库:git push -f
- 修改最后一次commit提交信息:
reset
撤销,重置
- git reset [<mode>] [<commit>]
此表单将当前分支头(HEAD)重置到<commit>提交,并根据<mode>更新索引(将其重置到<commit>树)和工作树中。如果省略<mode>,则默认为--mixed。 <mode>必须是以下之一:- --soft
Git重置HEAD到另外一个commit,但也到此为止。如果你指定--soft参数,Git仅仅将头指针指向<commit>处,而不会做其它变化。这意味着index,working copy都不会做任何变化,所有的在original HEAD和你重置到的那个commit之间的所有变更集都放在stage(index)区域中。 - --hard
重置索引和工作树。自<commit>以来对工作树中跟踪文件的任何更改都将被丢弃。 - --mixed
重置索引但不重置工作树(即,保留更改的文件但未标记为提交)并报告尚未更新的内容。这是默认操作。
如果指定了-N,则删除的路径将标记为意向添加(“intent-to-add”) - --merge
重置索引并更新工作树中<commit>和HEAD之间不同的文件,但保留索引和工作树之间不同的文件(即具有尚未添加的更改)。如果<commit>和索引之间不同的文件具有未分阶段的更改,则重置将中止。 - --keep
重置索引条目并更新工作树中<commit>和HEAD之间不同的文件。如果<commit>和HEAD之间不同的文件具有本地更改,则重置将中止。
- --soft
rm
从索引中删除文件,或从工作树和索引中删除文件
上面已经讲解
mv
移动或重命名文件,目录或符号链接。
网友评论