Git 学习笔记
在开始任何命令之前,先上一张图,下面的所有的命令都是围绕这张图展开的
常用命令
初始化本地库
git init
会生成一个.git结尾的隐藏文件
查看工作区文件的状态
git status
红色表示新增或者被修改的文件, 绿色表示被管理(添加进缓存区)的文件,git status
命令查看不到被上传到本地库的文件
在这里再拓展一个命令: git checkout --file
可以撤销在工作空间对这个文件的修改
将文件添加进缓存区
git add .
git add [文件名]
把项目移除出缓存区
git -rm --cached [名称]
提交到本地库
git commit -m '描述信息'
查看历史提交
git log
git reflog
回退到上一个版本
假设我们的版本迭代顺序是: 版本1 -> 版本2 -->版本3
- 先从版本3 回退到版本2
git log // 目的是找到历史版本的md5 tag值
git reset --hard [md5格式的tag值]
// HEAD表示当前版本
// ^ 表示上一个版本, 100个^表示 : 第前100个版本
git reset --hard HEAD^
- 再从2回退到版本3
git reflog // 目的是找到历史版本的md5 tag值
git reset --hard [md5格式的tag值]
找回已经删除的文件
找回已经删除的文件是有前提的,什么前提呢? 前提是: 这个被删除的文件曾经被上传到过本地库
第一种情况:, 我们在本地将文件删除了,并且这次更改的操作被commit到本地库,那么我们回退一下版本不就把文件找回来了?
第二种情况:, 我们在本地删除了这个文件,但是我们还没有将这次操作commit提交到本地库, 于是我们使用下面的命令,目的是,重新检出文件
git reset --hard [指针HEAD的hash值]
分支
分支的目的是隔离不同的环境
指针的概念: 比如说在master是已经上线了的主分支,它里面存在1000个文件,还有第二个叫dev的开发分支,在这个所有的新功能的拓展都在这个用来开发的分支上编写,假设又新增了100个文件,其实这个叫dev的分支器中真正保存的是自己新增的100个文件,其他的1000个文件通过指针的方式指向master分支
查看当前的分支
git branch
创建分支
git branch [分支名]
git checkout -b [分支名]
删除分支
git branch -d [分支名]
合并分支
git merge [分支名]
如何紧急修复bug
如上图: 采用分支的特点,可以灵活的解决线上的bug, 为什么非的新开辟一个临时分支呢? 因为如果想让dev分支去修改bug是一个得不偿失的行为,很可能这时dev分支的开发人员已经写了很多天的新代码了, 让dev去修复bug,就的先让dev将本地的未写完的代码提交到本地库,然后从master分支上拉取代码到本地,这样诚然可以修改bug,但是修改完了后怎么提交呢? 没法提交啊,新代码往哪里放?
综上:,需要新开辟一个临时分支,临时分支,让临时分支去修改bug,然后让master去merge这个临时分支, bug修复后,临时分支可以剔除
本地的当前项目存在多个分支的话,做了个改动后得先提交到本地库才能再切换分支
产生冲突时报错
在merge时,难免出现代码冲突, 向下面这样报错
$ git merge dev
Auto-merging index2.html
CONFLICT (content): Merge conflict in index2.html
Automatic merge failed; fix conflicts and then commit the result.
这时需要我们手动去解决,然后重新 add到缓冲区, 再commit到本地库 ,git会我们生成类似下面这样的字符串
hello one git
9 <<<<<<<<<<<HEAD
10 hello two git edit by hot_fix
11 ===========
12 hello two git edit by master
13 >>>>>>>>>>> master
14 hello three git
github
配置免密登录
- URL方式
默认的原始地址:
git remote add origin https://github.com/zhuchangwu/CIOC.git
git push -u origin master
修改:
git remote add origin https://用户名:密码@github.com/zhuchangwu/CIOC.git
git push -u origin master
- SSH
执行 ssh-keygen 命令: 在本地生成公钥个私钥
默认会生成在 ~/.ssh目录下面
id_rsa.pub 是公钥
id_rsa 是私钥
我们需要做的就是拷贝公钥的内容配置进github中,再从github中获取到下面的信息,回到本地库进行认证
git remote add origin git@github.com:zhuchangwu/CIOC.git
git push -u origin master
从github上克隆项目
git clone [ssh地址]
项目被克隆到本地后,如果这个项目存在多个分支,我们同样可以使用git checkout [分支名]
切换到不同的分支下面
新建仓库
在github上新创建仓库后,她会给我们一些提示信息,比如说,如何初始化本地库,如何将本地库和远程库管理起来,如何往远程库推送代码,如下图
上面有一行命令是git remote add origin git#githubXXX.git
,什么意思呢? 这其实是给后面那一长串地址取别名叫 origin, 从这以后命令中,origin==后面那一长串
往github上推送代码
将本地库中的代码推送上去
git push -u origin master
git push origin master // -u可以省写
从github上面拉取代码
拉取到工作区
git pull origin master
从github拉取的本地库
git fetch origin 分支
实用的rebase
(变基)
- 实用情景1: 小王为了开发在线聊天功能,前前后后往本地库里面提交了10次,为了方面别人查看,于是小王使用下面的命令合并提交记录
// 从最新的commit记录往下数,合并n条记录(包含n)
git rebase -i HEAD~n
// 从最新的commit记录往下合并,直到md5为指定值的那条commit(包含这条commit)
git rebase -i md5值
- 目的是将下面的存在分支的提交记录,整合成没有分支的提交记录
整合前
整合后
git checkout dev
git rebase master
git checkout master
git merge dev
// 查看
git log --graph
- 情景三: 当本地库对A功能新添加了一些代码,但是在开始新的开发前需要从远程的github中拉取一些其他人新增的关于A功能的代码时,两者合并不仅仅会产生冲突,还存在分支, 使用rebase解决
git fetch origin dev
git rebase origin/dev
配置文件
git中存在三个配置文件: 优先级: 当前项目的配置文件优先级最高,最次是系统的配置文件
第一个: 位于 项目/.git/config
它里面的配置信息仅对当前项目有效,比如我们前面给ssh串取别名叫origin,就是对当前项目有效
git config --local user.name 'XXX'
git config --local user.email 'XXX'
第二个: 位于 用户目录/.gitconfig
git config --global user.name 'XXX'
git config --global user.email 'XXX'
第三个: 系统的配置文件
linux: /etc/.gitconf
acer : C:\Users\acer\.gitconf
git的忽略文件
凡是和.git目录在同一级目录下面的文件都会被git检测并管理起来,被管理起来就意味着这些文件终究会被推送到远程库,但是有一些数据文件被推送出去会产生安全性的问题,如果我们不想让这些文件被git管理就可以使用git的忽略文件
创建.gitignore结尾的文件,git会读取这里面的文件,并且会忽略这里面配置的文件
.gitignore
files/
*.txt
github搜索 gitignore有惊喜
最后再附上一张总结图:
到这里本文又行将结束了,总体的节奏还是挺欢快挺带劲的,我是bloger-赐我白日梦,如果有错误欢迎指出,也欢迎您点赞支持...