2023年4月4日
By: Chase
git使用学习
git log的filter
按照日期筛选
git log --after=2023.3.1 --before=2023.4.1
按照作者筛选
git log --author=chase
导出
git log >> ~/Desktop/git.log
格式化打印
列几个常见的format
参数:
'%s': subject // commit的标题和内容
'%an': author name
'%H': commit hash
'%ce': committer email
'%cn': committer name
'%aD': commit time
'%n': insert line
举例1:
git log --after="2023-08-20 00:00:00" --pretty=format:"%s" --author="chase"
举例2:
git log --pretty=format:"%s - %an%n%aD %n" --author="chase"
git rebase
常规用法
替代merge, 这样在查看git branch时, 始终会是一条分支.
比如常规的切分支合PR的开发流程:
// 切分支开发
git checkout -b dev
// 在dev上提交
git commit -m "xxx"
// 准备合并回master了
git fetch origin master
git rebase origin/master
git push origin dev
// 远端(github托管)直接提dev合并master的pr即可无冲突合并
甚至, 不切分支的开发:
// 在master上
git commit -m "xxx"
git fetch origin master
git rebase origin/master
git push origin master
rebase自身大法
如果新接触一个开发分支干个一段时间, 想要通过rebase合并代码, 冲突解决起来往往很痛苦, 比merge更胜, 因为merge只解决一次.
减轻rebase的痛苦, 可以先把开发分支的所有commit rebase成一个.
代码提交少的话, 数数ahead master分支多少条就可以, 代码提交很多的话, 可以:
git rev-list --left-right --count master...current-dev
=> 7 43
7
是behind master, 43
是ahead master. 也就是说自己的分支上新提交了43个commit.
以下举例合并以下1 2 3, 3个commit为一个
git log
=>
commit 8a9235d1bdf7f52d8a6e6a69902d78814bdaa1bd (HEAD -> master)
Author: chase <chase_si@163.com>
Date: Thu Apr 13 13:42:40 2023 +0800
3
commit d4352c36af8a34e47a539e1e8ef34f1ec859aebc
Author: chase <chase_si@163.com>
Date: Thu Apr 13 13:42:30 2023 +0800
2
commit 8f360179854d3cf966e50bf4df6ee8939012307d
Author: chase <chase_si@163.com>
Date: Thu Apr 13 13:42:16 2023 +0800
1
- rebase插入
git rebase -i HEAD~3
- 会出现下图, 利用vim编辑技能
i
进入insert模式- 将2 3变为s
- 按
esc
- 在下面的
:
输入x
回车保存即可 - 会再出现一遍需要vim操作编辑commit信息的框, 重复
3~6
把不需要的commit删除编辑即完成
rebase插入多条的相关vim操作
如果rebase自身的时候, 条数太多, 我们就希望可以多行操作. 这里是vim
操作, 可以:
- 将光标移到要插入相同内容的第一行第一个字符上,如上面代码中第二条的
pick
前 - 按下
ctrl+v
进入visual block
模式 - 按
j
或多次,将光标移动到要插入的最后一行 - 按下
I(大写i)
进入编辑模式 - 开始输入要插入的内容,如s
- 按
esc退出
(非常重要,不要忘记了),Vim会自动在这几行前面添加相同的内容,可能需要一些运行时间。
如果操作失误, u
是撤回.
删除branch
git branch -a // 查看所有
git branch -D [branch] // 删除local branch
// 拉取origin所有分支并 去除已经不存在的远程分支
git fetch origin
git remote prune origin
// 从branch -a里移除本地对[origin/untrack]分支的追踪
git branch -d -r origin/untrack