git实操:从学校到真正生产环境

从学校的知识到实际生产中遇到问题

以前在学校里教的知识,是没有讲版本控制的。因为就你一个人开发一些简单的应用,都用不着版本控制。
而开始出来实习以后,真正的生产环境里面,是要求有严格的版本控制的。
目前用的最多的是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了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值