git学习笔记3-常用命令

commit

  1. 传统用法:先git add file再git commit -m “xxx”
  2. 快速提交当前所有文件的更改:git commit -am “xxx”会先add所有的更改然后提交
  3. 快速提交单个文件的更改:git commit file -m “xxx”只提交这个文件的更改
  4. 修改最后一次提交:git commit –amend -am “xxx”
  5. 提交频繁一点,每次提交包含的更改少一点
  6. 运行git commit,这时会打开Git中默认的编辑器(一般是vim),推荐像图5这样添加commit信息
    其中第一行是简短的信息,第三行是详细的解释,标准就是第一行一目了然,第三行越详细越好。这样做的另一个好处是,Github默认是支持这种书写方式的,在Github的pull request里,默认显示第一行,第三行被折叠,非常方便。并且如果你的pull request只包含这一个commit的话,Github会默认将第一行作为标题,第三行作为内容

checkout

分支

  1. git checkout 分支名/commit hash
    切换到相应的分支或commit,加上-b参数则会创建分支并切换过去
  2. checkout 不仅可以跟分支的名称,还可以放commit的hash

恢复文件到之前的某个状态(最新的commit)

  1. 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)
  2. checkout source(从哪里恢复)和target(恢复到哪里去)

diff

git diff source target

  1. target相对于source的变化
  2. source和target可以是commit的hash/分支名/快捷方式
  3. 如果只给一个参数,则这个参数就是source,而默认的target是工作目录,如果工作目录clean的话,则target为当前所在分支的最新commit
  4. 如果一个参数都不给,默认的source是暂存目录,而target还是工作目录
  5. 如果想要使暂存目录作为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

  1. 如果目标分支是当前分支的祖先commit节点,则merge什么也不会发生,因为当前分支已经是最新的了
  2. 如果当前分支是目标分支的祖先commit节点,这时会发生Fast-forward的merge,merge的结果是简单的移动HEAD指针
  3. 如果以上两种情况都不是的话,则其实是做的三方合并,除了这两个分支的最新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

统计一下有哪些文件被改动,有多少行被改动

`