0%

git 技巧

整理一些git常用的命令和一些骚操作~

git log

查看提交历史,默认不包含任何参数,或按照提交时间列出所有的更新,最新的排在上面。

查看提交的差异(diff)

可以用-p选项来展开每次提交的内容差异,用-2显示最近的两条更新:

1
git log -p -2

还可以使用—stat来简要显示增改的行数统计:

1
git log -p --stat

精简显示log

--pretty=<format>可以以给定的格式打印提交的日志。其中<format>可以是:

  • oneline
  • short
  • mediu
  • full
  • raw

查看某个文件的改动

可以在git log后面直接跟上文件名,来查看针对这个文件的改动(当前分支),加上-p显示具体改动:

1
git log -p file

如果该文件不在当前目录,需要先切换到目录的文件夹。

搜索

搜索git记录里面author包含zhang

1
git log --author zhang

搜索git记录提交说明message里面包含table的提交:

1
git log --grep table

只要满足任意条件即可显示出来:

1
git log --author zhang --grep table

同时满足两者才可显示:

1
git log --author zhang --grep table --all-match

查看文件的改动

  • git log --name-status 查看每次修改的文件列表,并显示状态
  • git log --name-only 查看每次修改的文件列表
  • git log --stat 查看每次修改文件的列表,以及文件修改行数的统计。

git blame

git log可以查看当前所有的改动,后面加上文件参数可以查看对于这个文件的所有改动,那么我们想看一个文件的某一行的改动的话怎么看?

可以使用git blame

git blame可以显示一个文件的每一行的最后一次改动的作者和提交hash。然后我们可以根据hash去查看对应的更改。

重要的参数有:

  • -L <start, end> 比如,想查询某个文件的122行到133行的记录,可以:git blame -L 122,133 login.page.ts
  • -t 显示原始时间戳,即不格式化时间,可以节省横向空间。
  • -S 使用resv-file中的修订,而不是调用git-rev-list,更简化的输出。
  • -color-lines 提交的记录的元数据不同的话就颜色不同区分

git branch

git branch如果不加参数,直接执行,输出本地所有分支。当前所在的分支前会加上*号来标记。

git branch -v 加上 -v参数,可以查看各个分支最后一个提交对象的信息。

git branch --merged 加上--merged参数,可以查看哪些分支已被合并入当前分支

git branch --no-merged 加上--no-merged参数,可以查看哪些分支还没有合并进当前分支

筛选本地分支

我们可以通过grep参数筛选分支名:

1
git branch | grep 'hotfix'

上面通过grep参数筛选分支里面包含hotfix字符串的分支,并显示。

可以加上grep -v 'name'的方式,来反向排除:

1
git branch | grep -v 'hotfix'

上面可以展示除过包含’hotfix’字符串的分支。

其实| grep这种用法并不是git的,而是linux中的标准输入输出的管道操作符。grep的选项常用的还有:

  • -i 忽略字符串大小写的差别
  • -v 反转查找
  • -x 只显示全符合的列

批量删除本地分支

有时候本地分支太多了,太乱,需要删除,但不可能一个个删除,那样也太繁琐了,我们怎么批量删除本地分支?

结合上面的过滤分支,我们可以使用linux管道xargs组合起来实现我们的想法。

xargs命令是给命令传递参数的一个管道,也是组合多个命令的一个工具。思路分两步:

  1. 通过git branch | grep获得要删除的分支名称
  2. 将分支名称通过| xargs传递给git branch -D进行删除

具体实现:

  1. 切换到不用删除的分支(比如master:git checkout master)
  2. 删除
    1. 运行:git branch | grep -v 'master' | xargs branch -d(删除本地已提交的分支)
    2. 全部舍弃本地分支: git branch | grep -v 'master' | xargs branch -D

这样,除过master分支之外,其他分支都被删除了。

本地分支跟踪远程分支

在本地创建分支,然后推送到远程,然后拉取的时候,会说本地分支没有跟踪远程分支,需要建立下连接:

1
git branch --set-upstream-to=origin/<branch> you-local-branch

省去这一步,可以在推送远程分支的时候直接加上跟踪当前分支的参数:

1
git push --set-upstream origin you-local-branch

这样,既把本地分支推送到了远程,同时也将本地分支跟踪了远程分支。

查看某个提交属于哪个分支

有时候代码合并之后,忘记了需要去追踪这个提交在哪个分支上存在

1
git branch --contains commitID

git show

对于一次提交来讲,它展示日志消息和文本差异。

1
git show d28737d250651514d629ba8e4e240530505c98dc

remote 远程库的操作

查看远程url

1
git remote show origin

显示远程库的源地址, 例如:

1
2
3
4
5
6
7
8
9
10
11
╰─$ git remote show origin 
* remote origin
Fetch URL: http://xxxxxxxxx.git
Push URL: http://xxxxxxxxx.git
HEAD branch: master
Remote branches:
master tracked
Local branches configured for 'git pull':
master merges with remote master
Local refs configured for 'git push':
master pushes to master (up to date)

可以列出当前库的远程url,以及本地分支和远程跟踪分支的状态。

或者可以直接简单的查看远程url:

1
git remote -v

输出:

1
2
3
╰─$ git remote -v
origin http://xxxxxxxxx.git (fetch)
origin http://xxxxxxxxx.git (push)

修剪远程已删除的分支

prune的意思是清理、修剪。有时候我们在远程上删除某些分支,但是在本地工程里,例如使用git checkout的时候还是会看到远程已删除的分支。

1
git remote prune

查看远程库里已经删除的分支:

1
git remote prune origin --dry-run

注:后面带着参数dry-run是为了只列出,不删除

如果要列出并删除,那么不带dry-run参数即可:

1
git remote prune origin

修改远程的url

1
git remote set-url origin new-url

比如我们的git是用ssh拉取的,但是ssh太慢了,需要换成http的,那我们只需要:

1
git remote set-url origin http://xxxxxxxxx.git

然后查看换了的url:

1
git remote -v

git tag

打tag

可以方便快速的打tag:

1
git tag v1.0.0

也可以带上描述信息:

1
git tag -a v1.0.0 -m '测试打tag'

将本地tag推送远程:

1
git push origin v1.0.0

删除tag

有时候tag打错了,需要删除:

1
git tag -d v1.0.0

同时也要删除远程的tag:

1
git push origin --delete v1.0.1

获得最近打的tag

获得sit上的最后一个tag:

1
git describe --tags `git rev-list --tags --grep prod --max-count=1`