一些零散的git用法和命令,有的不需要单独建立文档,有的需要归档,在归档之前先放到此处
1. git ls-tree
文件树查看
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ git ls-tree HEAD
100644 blob 1e475ec201a4a7889920e0916c67b7db30963bcf LICENSE
100644 blob 9da872ff77c26f56af4c5adb8c696f5b2ba58b6b README.md
040000 tree bb6357d2460bdd241492dfcfce66d457b8417d56 plugin
040000 tree 16cb3ea9739826efba5c3439d09db7e9420847cc scripts
# 递归目录
$ git ls-tree -r HEAD
100644 blob 1e475ec201a4a7889920e0916c67b7db30963bcf LICENSE
100644 blob 9da872ff77c26f56af4c5adb8c696f5b2ba58b6b README.md
100644 blob 5c5ecb41938abb717a0f62dd2dff35335519c993 plugin/pi2md.vim
100644 blob 2adb32d2f179c9cdd08656853954e0bad6af2b32 scripts/picgo.js
100644 blob d79959e5dfcbc0148d1547b325fbbc7f41afe457 scripts/windowsclipboard.ps1
|
2. git cat-file
文件查看,配合ls-tree
使用
1
2
3
4
5
6
|
# 查看文件 参数为SHA, p为pretty,输出文件的完整内容
$ git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579
# 查看文件的类型
$ git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a
blob
|
3. 文件查看
1
2
3
4
5
6
7
8
|
# 查看文件的改动记录和diff信息
$ git log -p filename
# 查看文件的改动记录和diff摘要信息
$ git log --stat filename
#查看某次提交的文件改动信息
$ git show SHA-id filename
|
4. git rev-parse
是一个辅助工具,一般比较高级的git操作才会用到,一般用来验证有效性,获取SHA,
在以管道方式执行命令的时候会比较有用,不做深入研究,用到再查
参考: git-rev-parse
4.1. 查看git目录
1
2
3
|
$ git rev-parse --git-dir
# output
.git
|
4.2. 获取当前分支的完整名称
1
2
3
|
$ git rev-parse --abbrev-ref HEAD
# output
master
|
4.3. 验证是否是有效git对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ git rev-parse --verify HEAD
# output
f5341f93c930969def3370f202874f492afff1cf
$ git rev-parse --verify master
# output
f5341f93c930969def3370f202874f492afff1cf
$ git rev-parse --verify origin/master
# output
f5341f93c930969def3370f202874f492afff1cf
$ git rev-parse --verify README.md
# output
fatal: Needed a single revision
|
4.4. 显示对象的完整SHA
1
2
3
|
$ git rev-parse 5a382c9
# output
5a382c95394410bb716d92ee7418c8e3a17eb8c3
|
4.5. 显示工作目录的最顶层
1
2
3
|
$ git rev-parse --show-toplevel
# output
/home/coco/develop/workspace/dotfiles
|
4.6. 显示相对工作目录的路径
1
2
3
|
$ git rev-parse --show-prefix
# output
a/b/c
|
4.7. 显示相对工作目录的路径前缀
1
2
3
|
$ git rev-parse --show-prefix
# output
some_path/if_your_are_in_sub_dir
|
5. git cherry-pick
5.1. cherry-pick的原理和介绍
cherry-pick其实也是合并的一种途径,但是就像名字,是一种区间式的合并,简单点解释为将需要的拿过来
cherry-pick允许我们选择自己需要的commits(无论在哪里,在什么分支),放到当前的HEAD branch下
看下面的图
普通的merge合并

如果使用cherry-pick

可以看到结果和merge的区别,有点像rebase变成线性的了,但是顺序和rebase不一样,被选择的commit被放在了最后的位置
5.2. 什么情况下使用cherry-pick
尽可能不用, 因为会产生重复的提交,如果是可以rebase
或者merge
的情况,就不要用cherry-pick
,
每次cherry-pick
都会产生全新的commit(SHA是不一样的,但是内容一样),这样造成的结果就是,如果后面需要合并
那么就会产生重复的commit,这样就会使得commits变得混乱.
唯一有可能使用的情况,当一个不被认可(被废弃)的分支里有需要的commit,这时可以用cherry-pick
把可用的commit合并进来,
只有这种情况才需要使用cherry-pick
5.3. 使用方法
选择某个commit
1
2
3
|
$ git cherry-pick af02e0b
# 只放到工作区
$ git cherry-pick af02e0b --no-commit
|
选择多个commit
1
2
|
# A和B
$ git cherry-pick af02e0b 218hsa12
|
选择范围commit
1
2
3
4
|
# A到B
$ git cherry-pick A..B
# 不包含A
$ git cherry-pick A^..B
|
5.4. 发生冲突
一旦有冲突,和rebase一样,会停下来,解决完以后
1
|
git cherry-pick --continue
|
放弃,回到之前的样子
1
|
git cherry-pick --abort
|
退出cherry-pick,但是冲突和拿过来的commit还在
6. 远程仓库
1
2
3
4
5
6
|
# 列出
$ git remote -v
# 增加
$ git remote add origin https://git.yourgitrepo.com/repo
# 删除
$ git remote remove origin
|