每天一个摸鱼小技巧之「高效使用Git」


theme: juejin

本文正在参加「金石计划 . 瓜分6万现金大奖」

使用Git版本管理的项目在提交代码的时候自然免不了遇到一些问题,遇到问题的解决方式有两种:

  • 1.尽量避开,选择绕过,采用其他方式
  • 2.迎面而上,积极解决

不同的态度导致解决问题方式的不同,结果是一样的,但是第二种方式相对而言总会学到一些什么,进步更快,但解决问题花费的时间却更长一些。程序员来讲,尤其是初级,最好还是要克服一下畏难心理,因为你遇到的问题越多,说明你成长的机会越多。

今天就记录下我在代码提交过程中遇到的一些问题,一是好记性不如烂笔头,记下来以供日后遇到相似问题时能提供个解决思路,二来也是想跟大家交流分享一下,如果有其他比较经常遇到的Git问题,也可以评论区讨论。

1. 切换分支报错: refname 'xxx' is ambigous

image.png

出现这类错误的原因有很多,比如标签和分支名相同或者分支名称与某次提交中的SHA1前缀相同,用git show-ref <branch_name>命令查看带有<branch_name>的分支引用:

image.png
可以看到refs/headsrefs/tags后的名称都是dev/v1.1,分支名和标签相同,所以在切分支的时候Git识别不出来是要切分支还是标签,因此报错。解决方式也不难,可以通过重命名标签来解决:

git tag new_tag old_tag

git tag -d old_tag

git push origin new_tag :<old_tag_path/old_tag>

为了保证其他同事也移除了这个tag,需要通知他们运行剪枝命令:

git pull --prune --tags

也可以通过在前面加上前缀来解决问题,比如要切到分支上:

git checkout heads/[ref-name]

而如果是分支名和某次提交的commit_id的前缀相同,那么应该尽量避免这种情况,分支前面加个功能前缀更好,比如hotfix/<branch_name>

2.git reset还是git revert

两种都是回退commit的方式,用哪种更好呢?其实搞明白它俩的作用,再结合自己的需求,就不会有这个困扰了:

  • git revert是有记录的回退,执行之后会多出一条commit记录,告知其他人这里有回退操作
  • git reset是无记录的操作,会直接将之前的commit删掉,如果没有--hard标记,就不会删掉修改代码,另外如果之前代码已经推送到远端分支,reset之后需要强推git push -f

3.剪枝

在开发功能的时候由于团队协作或临时修复bug,可能会在远端建立多个分支,比如feat/1.1hotfix/1.0等,完成开发之后通过操作将远程仓库中的分支删除了,但本地仍存在多余的远端分支(remotes/origin开头),如果不删除,代码仍然可能提交到这样一个实际上不存在了的远端分支上,怎么办呢?git fetch --prune可以解决这个问题。运行一下这个命令,不存在的远端分支快照就会被清理掉。

如果需要在每一次git fetchgit pull命令之后都进行剪枝,那么可以将剪枝标记--prune设置为全局有效:

git config --global fetch.prune true

4.git clone小技巧

在克隆项目时,如果我们只关心某个分支,则只需要克隆这个分支即可,比如master分支。

git clone -b master --single-branch [仓库地址]

好处有二:一是减少克隆时间,而是本地分支清楚明确,没有大量多余的origin/xxx分支

暂时就这么多,后续再更新吧~

本文正在参加「金石计划 . 瓜分6万现金大奖」

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容