#12 Git 命令

2021-08-04

看到有篇文章说是 git “新增”了 switch 和 restore 两个命令,仔细一看,原来就是 2019 年就引入了的两个命令,不过我确实没有用过。

这里重新整理一下现在 git 的命令。

git version
git version 2.30.2

apt list --installed | grep ^git
git-doc/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装]
git-extras/hirsute,hirsute,now 6.1.0-1 all [已安装]
git-flow/hirsute,hirsute,now 1.12.3-1 all [已安装]
git-man/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装,自动]
git-svn/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装]
git/hirsute,now 1:2.30.2-1ubuntu1 amd64 [已安装]
gitg/hirsute,now 3.32.1-1 amd64 [已安装]
gitk/hirsute,hirsute,now 1:2.30.2-1ubuntu1 all [已安装]

#11 使用 git push --force-with-lease 替代 git push --force

2021-07-05

今天注意到了 git push 的一个参数 --force-with-lease,可以在 Remote 有更新的时候不执行强推。
我之前考虑过会有这样的情况发生:我准备强推之前,会做最后一次拉代码检查,无误之后 force push。但是这个检查和 push 之间有一个时间差,会不会在这期间有别的小可爱提交了代码呢?
这种情况是完全可能存在的,就像是线程安全问题,只是团队的规模消减了我对这种情况的担心。
但是 --force-with-lease 参数可以彻底化解我的这种担忧,我决定以后就改用这个参数了。

#9 在 Git 历史记录中搜索

2020-06-12

搜索提交信息

git log --grep=fix: --oneline --after='2018-07-01' --author=catroll

搜索历史文件

git grep -C3 sign_position $(git rev-list --all)

搜索 diff 内容

git log -G'前置'
git log -G'前置' -p | grep '前置' -C5
git log -G'前置' --oneline --name-status

-S<string> --pickaxe-regex-G<regex> 作用相近,
不过 -S 只会列出搜索内容增删的相关信息,也就是所在行修改了,但是搜索内容没有变化的会忽略

#5 Git 补丁包

2018-08-01
  • git diff 对应 diff 命令
  • git apply 对应 patch 命令
git diff v1.2.1 v1.2.2 > v1.2.1_v1.2.2.patch

git apply --check v1.2.1_v1.2.2.patch

git apply -v --whitespace=warn v1.2.1_v1.2.2.patch

有部分文档中说 git applypatch 在一些细节上实现不一致,需要留意。但我轻量级使用,没有遇到过什么问题。

#3 使用 git-daemon

2017-03-15

有时需要临时分享一个仓库给朋友,我们可以用 SSH 协议:

git clone ssh://catroll@192.168.64.234/home/catroll/Projects/catroll/lego

其实 git-daemon 是一个更好的方法。

#2 Git: matches more than one

2016-09-01
$ git push origin v1.1.2 --delete
error: 目标引用规格 v1.1.2 匹配超过一个
error: 无法推送一些引用到 'gitee.com:catroll/markjour'

$ git push origin v1.1.2 --delete
error: dst refspec v1.1.2 matches more than one
error: failed to push some refs to 'gitee.com:catroll/markjour'

解决办法:

# 如果要删除的是分支
git push origin refs/heads/v1.0.32 --delete
To gitee.com:catroll/markjour
 - [deleted]         v1.0.32

# 如果要删除的是 Tag
git push origin refs/tags/v1.0.32 --delete

#1 Git: 远程引用不存在

2016-01-31

删除远程分支时报错:

git push --delete origin new
error: 无法删除 'new':远程引用不存在
error: 无法推送一些引用到 'gitee.com:catroll/django-admin'

如果是英文环境就是报:

git push --delete origin new
error: unable to delete 'new': remote ref does not exist
error: failed to push some refs to 'gitee.com:catroll/django-admin'

一般是这个分支已经被别人删除了。

Solution

git branch -d -r origin/new