git使用相关踩坑记录

git使用相关踩坑记录

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 构建并发布到了测试环境,此时发现提交的代码存在重大的逻辑问题,需要快速进行回滚

参考了这一资料:

https://stackoverflow.com/questions/6481575/undo-a-merge-by-pull-request

使用下面的命令:

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 添加到登录凭证中。

Comment