跳到主要内容

2 篇博文 含有标签「git」

查看所有标签

· 阅读需 5 分钟

记录一次代码回滚导致的加班

2020年5月9日下午五点。 滕某人本来今天高高兴兴,心想着又是可以下早班的一天,只要把这些小改动发上线就OK了,还不是轻轻松松。可是一顿操作之后把代码提审通过,发到预发环境一看,???怎么改的东西有的生效了有的没生效,会不会是代码提得不对,嗯,一定是这样,再提一遍。gitlab上一看,呐尼,no commit,可是本地代码和线上代码的确是不一样呀,怎么会no commit呢?一番冥思苦想后,脑海中浮现了两个小时前的场景。

时间回溯到2020年5月9日下午三点。 打开gitlab,source branch填上我的分支,target branch填上今天的hotfix分支(这里其实没有点上,默认master了),回车,指定代码审核人,OK,走你!!!五分钟后,回gitlab一看,嗯,审核通过了,可是。。。,怎么有种奇怪的赶脚,艹了,我怎么把代码直接提到master上去了,他(指审核人)竟然还给我通过了,这么盲目信任我的吗,可是我好菜的。。。我这次的改动依赖后端,可千万不能发线上,得赶紧把master代码回滚一下, -那个谁,刚刚提的merge request,提错分支了,你赶紧把master回滚一下。 -xxxxxx(祖安语),好了,我给你revert一下。 作为一个平时只会push操作的git菜鸟,面对revert这样的陌生词汇,一脸蒙蔽的点了一下头,又忙起了手上的活,之后又提了做了一些改动,提了几个commit。

OK,事情的经过回溯完毕,问过大佬后,原因明了了:master代码回滚是通过revert方式的,从而导致我之后提交的时候显示no commit,为什么呢。

revert操作,中文意思是反转,顾名思义,是将之前有问题的commit操作的逆操作,作为一个新的commit,提交了上去,比如之前我加了一行有问题的代码,通过revert,我相当于又进行了一次提交,提交的内容是删除了那行有问题的代码,从而达到恢复代码的目的。可是,在revert操作下, 有问题的那个commit和revert的commit都是保留在了commit记录中的,git分支都是向前走而非回退,导致了之后我想把代码提上去,是提不上去的,因为那个commit之前已经提过了(在回滚的时候那个commit是有问题的commit,可是之后走正常流程了,该commit就是正常的commit了,可是git无法判断有没有问题),因此显示的是no commit。

当时的解决方法是对那个revert的commit,我再revert一次,从而抵消了revert带来的影响。

从发现问题,到找原因,到解决问题,再到重新发预发,确认,再发线上,确认,时间也不知不觉地到了晚上八点,哎,都八点了,直接等到九点打车吧(公司九点后打车免费)--又被996了 --其实互联网人的996,就是能力不行导致的瞎折腾,还是得学习进步呀 -- END

· 阅读需 7 分钟

初始准备工作

mkdir learngit 创建 learngit 文件夹
cd learngit 进入 learngit 文件夹
pwd 显示当前目录

基本操作

git init git 仓库初始化,把目录变成 git 可以管理的仓库

git add readme.txt 将当前目录下的 readme.txt 加入到 git 仓库的暂存区
git commit -m "wrote a readme file" 将暂存区的 readme.txt 提交到分支上

git status 查看状态

git diff HEAD -- readme.txt 查看版本库和工作区里面最新版本的区别

.gitignore 用于 git 忽略某些文件和文件夹的配置文件

git log 显示从最近到最远的提交日志

git log --pretty=oneline git log 的美观版本,过滤掉许多信息,更简洁

版本回退

git reset --hard HEAD^ 回退到上一个版本
git reset --hard "HEAD^" 在 windows 中需要加入双引号
git reset --hard HEAD"^" 在 windows 中的另一种写法
git reset --hard "HEAD^^" 回退到上上个版本
git reset --hard HEAD~1 回退到上一个版本,将数字 1 改为 n 就是回退到前 n 个版本 git reset --hard commit 的版本号 回退到制定版本,参数为该版本的版本号

git reflog 显示每一次命令,版本回退的版本号也可以从中查看

文件恢复与删除

git checkout -- readme.txt 让 readme.txt 回到最近一次 git commit 或者 git add 时的状态,也就是把工作区中的文件恢复成版本库中的文件

git rm test.txt 将本地的和版本库中的 test.txt 文件都删除,想要恢复就得先将操作过的其他文件转移,再进行版本回退,之后再将其他文件转移回来
如果只是本地的文件被删除了,可以 git checkout -- file 恢复
git commit -m "remove test.txt" 再更新一下分支

github 仓库使用

ssh-keygen -t rsa -C "[email protected]" 创建 SSH Key,创建后在用户主目录下的.ssh 目录中会有 id_rsa 和 id_rsa.pub 两个文件,其中 id_rsa.pub 是公钥,id_rsa 是私钥

git remote add origin git@server-name:path/repo-name.git 将本地 git 和 GitHub 上的仓库关联

git push -u origin master 将本地 git 提交到 GitHub 仓库的 master 分支,-u 在第一次推送 master 分支的所有内容时要使用

git push origin master 不是第一次就用这个

git clone 用于从远程库克隆

git 分支操作

git checkout -b dev 创建并切换到 dev 分支,效果等同于下面两个命令

git checkout -b dev origin/dev 创建远程 origin 的 dev 分支到本地

git branch dev 创建 dev 分支 git checkout dev 切换到 dev 分支

git branch 查看有哪些分支和当前所处的分支

git 分支合并

git checkout master 切换到 master 分支 git merge dev 当当前分支在 master 下时,(master 分支未改动,dev 分支已经改动),将 master 分支和 dev 分支合并
git branch -d dev 之后删除 dev 分支

创建一个分支,之后分别在 master 和分支上修改 readme.txt,之后合并 master 和分支会产生冲突, 此时需要把冲突后的文件手动解决冲突,修改文件后 add commit,冲突就解决了,之后就可以删除分支了

git log --graph --pretty=oneline --abbrev-commit 比较图像化地显示分支历史

git 工作区备份操作

git stash 将当前的工作区备份存档

git stash list 显示当前分支的工作区存档

git stash apply 恢复最近一次的工作区存档
git stash apply stash@{0} 若经过多次存档,恢复指定的工作区存档

git stash drop 删除最近一次的工作区存档

git stash pop 恢复并删除最近一次的工作区存档,等同于 apply+drop

git branch -D dev 强行删除 dev 分支

###git 远程库操作 git remote 查看远程库信息

git remote -v 查看详细的远程库信息

git remote rm origin 把本地与 origin 远程库的关联取消

git 自定义

git config --global color.ui true 美化

git add -f App.class 将被.ginignore 忽略的文件强制添加到 Git

git check-ignore -v App.class 检查定位导致 App.class 添加到 Git 失败的规则

.gitignore. windows 上这样就能创建.gitignore 文件

git config --global alias.st status 为 git 命令取别名
git config --global alias.last 'log -1' 也可以用引号把一句命令引起来,为它取个别名

git branch --set-upstream branch-name origin/branch-name 创建本地分支与远程分支的链接关系

git 标签操作

git tag 查看所有标签

git tag v1.0 为最新提交的 commit 打上标签

git tag v1.0 commit 的版本号 为指定的 commit 打上标签

git show v1.0 查看标签信息

git tag -a v1.0 -m "version 1.0 released" 3435334 创建带有说明的标签

git tag -s v1.0 -m "version 1.0 released" 3435334 gpg 配置成功前提下用私钥签名一个标签

git tag -d v1.0 删除标签

git push origin v1.0 推送某个标签到远程

git push origin --tags 一次性推送所有尚未推送到远程的本地标签

git tag -d v1.0 如果标签已经推送到远程,要删除该标签先删除本地标签
git push origin :refs/tags/v1.0 再把远程标签删除

参考于https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000