Git常用命令
Git操作- git diff vs git log
- git pull vs git fetch
- git rebase
- git revert
- git reset vs git checkout vs git revert
- ^ 和 ~
- alias
1 git diff vs git log
-
git diff master..test
比较master与test差异 -
git log master..test
查看test中尚未并入master的提交 -
git diff master…test
比较master与test共有分支与test分支的差异 -
git log master…test
查看只被master或test中某一个包含的差异性提交,加上--left-right可显示包含方 -
git diff支持目录提交差异,git log支持文件提交差异
git diff HEAD -- ./dir 比较dir目录与HEAD提交的差异
git log file 查看file提交历史 -
git diff --stat
统计所有改动 -
git log --stat
统计提交改动
2 git pull vs git fetch
-
git fetch
下载远程分支,然后更新本地FETCH_HEAD文件
git fetch : git fetch origin -
git pull
下载远程分支,然后合并至当前HEAD
git pull = git fetch + git merge FETCH_HEAD
多用git fetch,少用git pull
3 git rebase
- 线性提交 与git merge功能类似
git merge
:新的提交将分支的提交历史连在一起,生成merge提交
git rebase
:重写提交历史,把整个分支移动到待合并分支后 - 压缩提交
删除不必要的提交
线性提交
-
merget提交
-
rebase提交
- 一个实例
-
merge
merge -
rebase
rebase
压缩提交
git rebase 使用
使用git rebase:一个干净的、线性的提交历史
-
git rebase <branch>
以<branch>为基,重写当前提交历史 [可以加上 -i] -
git merge-base <branch1> <branch2>
返回基提交ID -
git rebase –i HEAD~3
重写当前HEAD最新3次提交历史 -
git pull –rebase
通过变基来整合远程分支
注意:
rebase会重写提交历史,不要在公共的分支上使用
4 git revert
-
git revert
生成一个新的提交,撤销一个已经存在提交的所有修改
git revert对于merge commit的提交:git revert –m 1[2] <commit>
-m i :需要保留的父节点是第i父提交
-
git revert需要注意的问题
合并曾经被revert的提交,会保留revert的信息,从而导致部分提交无法应用到新的分支,解决这个最好的方式是撤消还原原始的合并
撤销还原
5 git reset vs git checkout vs git revert
提交层面
-
git reset
reset将分支的末端指向另一个提交,移除当前提交 -
git checkout
checkout移动HEAD指向某个引用 -
git revert
重新生成一个提交增加到当前的commit
git reset --soft –mixed --hard
git reset作用域文件层面
-
git reset
将缓存区同步至指定的提交,不影响工作目录 -
git checkout
将工作目录同步至指定的提交,不影响提交 -
git revert
无文件层面操作
总结
命令 | 作用域 | 常用情景 |
---|---|---|
git reset | 提交层面 | 在私有分支上舍弃一些没有提交的更改 |
git reset | 文件层面 | 将文件从缓存区中移除 |
git checkout | 提交层面 | 切换分支或查看旧版本 |
git checkout | 文件层面 | 舍弃工作目录中的更改 |
git revert | 提交层面 | 在公共分支上回滚更改 |
git revert | 文件层面 | (然而并没有) |
6 ^ 和 ~
- 相当于父提交,有多个父提交时,加上数字表示第几个父提交,相当于^1
- ~n相当于连续的n个^
一个例子
HEAD^
:4927HEAD^2
:063fHEAD^3
:4f9c
HEAD~
:4927HEAD~2
:1c73
7 alias
- st=
status
co=checkout
br=branch
ci=commit
- mg=
merge
md=commit --amend
dt=difftool
mt=mergetool
- last=
log -1 HEAD
cf=config
line=log --oneline
visual=!gitk
- ls=
log --pretty=format:\"%C(yellow)%h %C(blue)%ad %C(red)%d %C(reset)%s %C(green)[%cn]\" --decorate --date=short
- hist =
log --pretty=format:\"%C(yellow)%h %C(red)%d %C(reset)%s %C(green)[%an] %C(blue)%ad\" --topo-order --graph --date=short
- lg=
log --color --graph --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset" --abbrev-commit
- ld =
log --pretty=format:"%C(yellow)%h\\ C(green)%ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short --graph
网友评论