从学校的知识到实际生产中遇到问题
以前在学校里教的知识,是没有讲版本控制的。因为就你一个人开发一些简单的应用,都用不着版本控制。
而开始出来实习以后,真正的生产环境里面,是要求有严格的版本控制的。
目前用的最多的是git。
著名的GitHub,国内的Gitee,企业版的GitLab。
以前用git仅限于从GitHub上面clone代码。
我从一个菜鸡学生的角度,记录一下我学习git版本控制的过程。
初次接触git
第一次实习的时候,带我的大佬直接丢一份文档过来,你看看git吧,首先就得学这个,否则没法工作。
我按照文档安装了本地git,设置了SSH密钥,然后成功的clone代码下来了。没了…
这时候我对git的印象仅仅是一个代码仓库
开发中用vscode集成的git
实习工作首先是熟悉代码,然后去改别人的代码。这时候,接触到了用vscode里面集成的git的ui,鼠标点一点,就完成拉分支,修改,push到远程。然而我只是会用这一点点功能,对git还是没有深入了解。
体系的学习了git
git这么基础的东西为什么不好好学一下呢?于是我就花一上午摸鱼学了git
用的是廖雪峰老师的git教程:git教程
结合自己的一些体会和笔记
Git笔记
为什么要版本控制?
当然要版本控制,万一删错了什么东西,后悔了,怎么找回来?
还有就是万一小明瞎改我的代码,或者大佬帮我改了代码,哪个是小明瞎改的,哪个是大佬改的,如何区分?
Git是Linus大佬自己写的,用来放Linux的代码,以前是BitKeeper免费给Linux用的,但是有些开发者打算破解BitKeeper,结果被发现了,于是BitKeeper就不给Linux免费用了。
以前的版本控制软件不好用,然后免费的也不给用了,所以Linus自己用c手写了一个Git。看来以前是懒得写…
git是分布式的。以前的版本控制软件是集中式的,代码都存放在一台服务器上,联网才能用,而且要操作巨慢。
现在git在每台pc上都有代码库,只要找一台主机当远程仓库方便大家同步就行了,这样不联网也能用,而且速度快。
创建版本库,就是你电脑上的一个目录
找到一个目录,执行git init
git init
添加文件
git add file1.txt
git commit -m "update : xxxxx"
查看仓库状态
git status
查看提交记录
git log
版本回退:使用 git reset 命令
HEAD表示当前版本
HEAD^表示上个版本
HEAD^^表示上上个版本
HEAD~100表示上100个版本
git reset --hard HEAD^
可以通过 commit id 回到指定的版本
git reset --hard 1094a
查找 commit id
git reflog
工作区,版本库,暂存区的关系
工作区就是电脑里面能看到的目录
版本库是工作区里面有个隐藏目录.git
版本库里面有有一个stage的暂存区
第一步 git add 添加文件到暂存区
第二部 git commit 提交更改,包文件修改提交到当前分支
每次修改,如果不用 git add 到暂存区,那就不会加入到 commit 中
撤销修改
git checkout --file 可以丢弃工作区的修改
git checkout --readme.md
没有–file就变成切换到另一个分支去了
用git reset HEAD 可以撤销暂存区的修改,把文件丢回工作区
git reset HEAD readme.md
再用checkout来撤回工作区的修改就行了
git checkout --readme.md
分段提交代码(vscode里面)
选中某一段代码,右键可以选择提交这一部分
删除文件
在版本库里面删除文件,用 git rm 删掉,并且 git commit 一下
git rm readme.md
git commit -m "remove : readme.md"
如果是误删了,可以从暂存区里面捞回
git checkout --readme.md
添加远程库
git remote add origin git@github.com:Aisrakita/laya-game.git
推送本地库到远程仓库
git push -u origin master
用-u关联了本地分支和远程仓库master分支,推送只用push origin master就行了
git push origin master
克隆远程库
git clone git@github.com:Aisrakita/laya-game.git
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
分支管理
切换分支: checkout -b
git checkout -b dev
查看分支: git branch
git branch
合并分支
先切换回master分支,然后再merge要合并的分支
git checkout master
git merge dev
删除分支 -d delete
git branch -d dev
合并分支的时候,git会用fast forward模式
这种模式下,删除分支后,会丢失分支信息
要禁用fast forward模式,用 --no-ff 参数
git merge --no-ff -m "merge with no-ff" dev
合并会创造一个新的commit
合并后查看分支历史
git log
Bug分支
先临时存储工作区
git stash
列出存储列表
git stash list
弹出最新存储
git stash pop
可以多次 git stash,恢复的时候,先用git stash list 查看,恢复指定的stash,用命令
git stash apply stash@{0}
只复制指定的提交到当前分支
git cherry-pick <commit>
可以把bug提交的修改复制到当前的分支,避免重复劳动
开发一个新的feature,最好新开一个分支
如果要丢弃一个没有被合并过的分支,可以通过 git branch -D <name>
强行删除
git branch -D dev
跟之前的小写-d不一样,这里是大写-D
多人协作的时候,要查看远程库的信息,用git remote
git remote
更详细的信息用-v参数
git remote -v
注意:添加远程库的时候的命令是:
git remote add origin git@github.com:Aisrakita/Laya-game.git
从远程origin库拉取dev分支到本地,创建本地dev分支
git checkout -b dev origin/dev
做各种修改,然后push修改到远程
git push origin dev
push之前要先pull,先拉取最新修改,在本地解决冲突,然后再push
pull之前,要先设置本地dev分支与远程分支origin/dev的连接,否则提示no tracking information
git branch --set-upstream-to=origin/dev dev
rebase操作可以把本地未push的分支提交历史整理成直线
rebase的目的是使我们查看历史提交的变化时更容易,因为分叉的提交需要三方对比。、
为什么要打tag?因为commit号很不好找
发布一个版本的时候,通常在版本库打一个tag,这就唯一确定了打标签时刻的版本。
打tag
git tag v1.0.0
用git tag查看所有tag
git默认给最新提交打tag,如果要给历史提交的commit打tag,先git log 找到历史提交的commit id,然后打tag
git tag v0.9.0 f52c633
用show 来查看标签信息
git show v1.0.0
如果标签打错了,可以删除
git tag -d v1.0.0
创建的标签都存储在本地
要推送到远程,用
git push origin v1.0.0
跟push分支到远程的操作一样
一次性推送全部tag到远程
git push origin --tags
如果tag已经推送到远程,要删除先从本地删除
git tag -d v1.0.0
然后从远程删除
git push origin :refs/tags/v1.0.0
好了,我会git命令了,可以不用ui了,以后就用git命令装B了