git学习笔记3-常用命令
commit
- 传统用法:先git add file再git commit -m “xxx”
- 快速提交当前所有文件的更改:git commit -am “xxx”会先add所有的更改然后提交
- 快速提交单个文件的更改:git commit file -m “xxx”只提交这个文件的更改
- 修改最后一次提交:git commit –amend -am “xxx”
- 提交频繁一点,每次提交包含的更改少一点
- 运行git commit,这时会打开Git中默认的编辑器(一般是vim),推荐像图5这样添加commit信息
其中第一行是简短的信息,第三行是详细的解释,标准就是第一行一目了然,第三行越详细越好。这样做的另一个好处是,Github默认是支持这种书写方式的,在Github的pull request里,默认显示第一行,第三行被折叠,非常方便。并且如果你的pull request只包含这一个commit的话,Github会默认将第一行作为标题,第三行作为内容
checkout
分支
- git checkout 分支名/commit hash
切换到相应的分支或commit,加上-b参数则会创建分支并切换过去 - checkout 不仅可以跟分支的名称,还可以放commit的hash
恢复文件到之前的某个状态(最新的commit)
- git checkout [分支名/commit hash/HEAD快捷方式] – 文件名
- 恢复指定分支的最新commit或指定commit或快捷方式指向的commit的文件到工作目录,若省略中间的参数,则
- 暂存区有内容且暂存区内容与工作目录不同,则恢复暂存区的状态到工作目录
- 暂存区无内容,则恢复HEAD(最新的commit)的状态到工作目录
- git checkout branch2 test.txt个(branch2的最新commit的状态被恢复到工作目录并添加到了暂存区)
- git checkout HEAD~3 test.txt(比当前的commit早3个commit)
- checkout source(从哪里恢复)和target(恢复到哪里去)
diff
git diff source target
- target相对于source的变化
- source和target可以是commit的hash/分支名/快捷方式
- 如果只给一个参数,则这个参数就是source,而默认的target是工作目录,如果工作目录clean的话,则target为当前所在分支的最新commit
- 如果一个参数都不给,默认的source是暂存目录,而target还是工作目录
- 如果想要使暂存目录作为target的话,需要使用–cached参数
reset
将HEAD状态的文件恢复到了暂存区,工作目录保持不变
git reset [commit hash/分支名/快捷方式] [文件名]
类似“git add的反操作”,直接将所在commit的文件状态恢复到暂存区域。省略commit则默认为HEAD,省略文件名默认为所有文件。只改变暂存目录,不改变工作目录,当前commit不变。
git reset –soft [commit hash/分支名/快捷方式]软恢复
将恢复前所在commit的文件状态恢复到暂存区,当前最新commit为参数中的commit。只改变暂存目录,不改变工作目录,当前commit改变。
git reset –hard [commit hash/分支名/快捷方式]硬恢复
强制将整个项目恢复为参数中的commit时的文件状态,清空暂存目录,工作目录clean。暂存目录和工作目录同时被改变,当前commit改变。
rebase
- 一般我们把别的分支合并到master时用merge,而把master合并到别的分支时会用到rebase
- git rebase 目标分支原理
其实是先将HEAD指向目标分支和当前分支的共同祖先commit节点,然后将当前分支上的commit一个一个的apply到目标分支上,apply完以后再将HEAD指向当前分支。 - rebase与merge的区别
把master分支合并到别的分支用rebase,把别的分支合并到master分支上用merge
rebase不会产生多余的commit,并且保持直线 - 交互模式
比如调整commit的顺序啊,合并一些commit啊,删除一些commit啊等等,通过-i参数可以实现,当然这个命令有些复杂,我们可以使用SourceTree的图形化界面更直观的使用它
merge
- 如果目标分支是当前分支的祖先commit节点,则merge什么也不会发生,因为当前分支已经是最新的了
- 如果当前分支是目标分支的祖先commit节点,这时会发生Fast-forward的merge,merge的结果是简单的移动HEAD指针
- 如果以上两种情况都不是的话,则其实是做的三方合并,除了这两个分支的最新commit以外,另外一个是这两个分支的共同祖先commit点。这种情况下如果没有冲突的话会自动生成一个merge的commit,如果有冲突则手动解决后还是会有一个merge的commit。
cherry-pick
git checkout -b branch3 1a222c3
git cherry-pick 0bda20e 1a04d5f
git checkout master
git reset --hard 1a222c3
查看历史 log
git reflog
这个命令会输出一个列表,包含HEAD发生的所有变化。
log
-p
-stat
git log –pretty=format:’%h was %an, %ar, message: %s’
git log –pretty=format:’%h : %s’ –graph
git log –pretty=format:’%h : %s’ –topo-order –graph
git log –pretty=format:’%h : %s’ –date-order –graph
–reverse’参数来逆向显示所有日志。
–pretty=oneline/short/format –graph
比较提交 Diff
git diff master..test
只显示两个分支间的差异
git diff master…test
找出‘master’,‘test’的共有 父分支和’test’分支之间的差异
diff
git diff
显示在当前的工作目录里的,没有 staged(添加到索引中),且在下次提交时 不会被提交的修改。
git diff –cached
显示你当前的索引和上次提交间的差异
下次提交时要提交的内容(staged,添加到索引中)
#### git diff HEAD
显示你工作目录与上次提交时之间的所有差别
git diff test
查看当前的工作目录与另外一个分支的差别
git diff HEAD – ./lib
显示你当前工作目录下的lib目录与上次提交之间的差别(或者更准确的 说是在当前分支)
git diff –stat
统计一下有哪些文件被改动,有多少行被改动