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

如上图: 采用分支的特点,可以灵活的解决线上的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值
  • 目的是将下面的存在分支的提交记录,整合成没有分支的提交记录

整合前

rebase前

整合后

rebase后

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-赐我白日梦,如果有错误欢迎指出,也欢迎您点赞支持...

posted @ 2019-10-27 21:54  赐我白日梦  阅读(430)  评论(0编辑  收藏  举报