git使用经验记录
在日常使用git作为版本控制系统的过程中,可能会出现各种各样奇怪的问题,各种较为复杂的使用状况,在此进行一下记录。
权限不足
场景:
记录于2024年4月7日,首次出现于2024年1月29日
某个私有版本控制系统中,如 GitLab, Gitea 等,有些仓库我们可能并没有权限访问,此时如果我们想引入代码,就会出现错误。我们可以联系仓库管理员为我们添加权限,但是添加权限后,我们可能仍然未能正常拉取对应代码。
我们以 private.code/admin/project
作为文章中示例的仓库,在联系管理员为我们添加权限后,我们正常拉取代码的情况如下:
> go get private.code/admin/project.git
go: module private.code/admin/project.git: git ls-remote -q origin in /path/to/go/pkg/mod/cache/vcs/${hash}: exit status 128:
fatal: unable to connect to private.code:
private.code[0: 127.0.0.1]: errno=Connection refused
此时我们需要执行下面的命令主动刷新一下 git 的权限信息:
git ls-remote private.code/admin/project
即:
git ls-remote ${repo_path}
然后再正常执行 go get
指令即可。
取消 commit
场景:
记录于2024年7月9日,出现了很多次
在开发过程中,觉得开发完成了,解决了一些问题,遂提交了一次 commit,但是后续开发中发现还需要增加或者修改一些实现,如果此时没有将本地的 commit 提交到远端,便可以尝试将 commit 取消掉,然后重新提交,以让 git 树干净一点
使用下面的命令即可:
git reset --soft HEAD~1
一些解释:
git reset
:这是一个用于回滚到某个特定提交的命令。--soft
:这个选项表示只回滚 commit 对象,而保留工作目录和暂存区的更改。这意味着你的代码改动仍然在,但 commit 被取消了。HEAD~1
:表示回滚到上一个 commit。
回滚 merge request
场景:
记录与2024年7月30日,首次出现于2024年7月25日
在开发过程中,多个 commit 提交到了测试分支,进行了 CI 构建并发布到了测试环境,此时发现提交的代码存在重大的逻辑问题,需要快速进行回滚
参考了这一资料:
使用下面的命令:
git log --merge --oneline # 列出 git 的 merge 信息和其 commit id,需要记下需要回退到的 commit id
git revert -m 1 ${commit_id}
一些解释:
这个命令将创建一个新的提交,反转合并提交 ${commit_id}
所做的更改,并保留 Git 历史记录的完整性。
何时使用
合并错误: 当你发现某个合并有问题并且需要撤销合并时。
回滚特性: 当你需要临时或永久回滚一个已经合并的特性分支时。
注意事项
由于
git revert
是通过创建新的提交来反转更改的,它不会完全删除历史记录。这意味着你可以保留所有的更改记录,同时撤销特定的更改。使用
-m
选项时要小心,确保你选择了正确的父提交,否则可能会导致意外的结果。
Linux 下使用私有包
场景:
记录于2024年8月21日,首次出现于2024年8月21日
表面看起来很像是 「权限不足」中的现象,但是按照其步骤尝试解决,依旧是这一情况,但其实是 linux 下 git 的一些配置问题。
适用范围
在拉取私有包时,配置了下面的内容:
git config --global url."https://oauth2:xxxxxx@your.domain/yyyyy".insteadOf "https://your.domain/yyyyy"
go get
命令实际上是使用 git clone
进行下载同步的,而某些 Linux 下并不支持这一 oauth2
类型的口令/协议,所以需要特殊注意。
解决方法
改为使用 ssh
进行连接,而不是 oauth2
,需要对 git
进行配置,我的方法是在 ~/.gitconfig
文件中添加:
[url "ssh://git@your.domain:port/"]
insteadOf = https://your.domain/
然后再在 GitLab
一类的私有仓库中,将自己的 SSH Key
添加到登录凭证中。