Git手册 - 一些有用的命令

2021-05-05
git
约 1381 字 预计阅读 3 分钟

一些零散的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合并

image-20210522120533578

如果使用cherry-pick

image-20210522120548922

可以看到结果和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还在

1
git cherry-pick --quit

6. 远程仓库

1
2
3
4
5
6
# 列出
$ git remote -v
# 增加
$ git remote add origin https://git.yourgitrepo.com/repo
# 删除
$ git remote remove origin
TAG: git scm
文章作者 : Cocding