Git和GitHub版本控制学习笔记
Posted 棉花糖灬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git和GitHub版本控制学习笔记相关的知识,希望对你有一定的参考价值。
一、版本控制的功能
1. 协同修改
- 多人并行不悖的修改服务器端的同一个文件
2. 数据备份
- 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态
3. 版本管理
- 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约空间,提高运行效率,Git采用了文件系统快照的方式。
4. 权限管理
-
对团队中参与开发的人员进行权限控制
-
对团队外的开发者贡献的代码进行审核——Git独有
5. 历史记录
-
查看修改人、修改时间、修改内容、日志信息
-
将本地文件恢复到某一个历史状态
6. 分支管理
- 允许开发团队在工作过程中多条生产线同时推荐任务,进一步提高效率
二、Git简介
1. Git优势
-
大部分操作在本地完成,不需要联网
-
完整性保证
-
尽可能添加数据而不是删除和修改数据
-
分支操作非常快捷流场
-
与Linux命令全面兼容
2. Git的安装
下载安装包在本地直接安装即可,具体教程可自行百度
3. Git目录结构
-
工作区:写代码的地方
-
暂存区:临时存储代码的地方
-
本地库:存储历史版本的地方
4. 代码托管中心
- 任务:维护远程库
- 局域网下:GitLab服务器
- 外网下:GitHub、码云等
5. 本地库和远程库
(1) 团队内部协作
(2) 跨团队协作
三、Git命令操作
1. 本地库初始化
-
git init
:切换到要创建的目录后,使用该命令初始化本地库,生成一个隐藏的.git
文件夹
2. 设置签名
-
签名形式
- 用户名:如zuzhiang
- Email地址:如zuzhiang@126.com
-
作用:区分不同开发人员的身份
-
辨析:这里设置的签名和登录远程库(代码托管中心)的帐号、密码没有任何关系
-
项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name 用户名
git config user.email 邮箱地址
- 设置的签名保存在
./.git/config
文件内
-
系统用户级别:登录当前操作系统的用户范围内有效
git config --global user.name 用户名
git config --global user.email 邮箱地址
- 设置的签名保存在
~/.gitconfig
文件内
-
级别优先级:就近原则,项目级别优先于系统用户级别,两者至少要设置一个,一般只需要设置系统用户级别的就足够了
3. 基本操作
(1) 状态查看
git status
:查看状态,当前分支、提交情况、待提交情况
(2) 添加
git add 文件名
:将文件添加到暂存区
(3) 提交
git commit 文件名
:将文件从暂存区提交到本地库,此时需要进入vim编辑器添加本次提交的备注信息git commit -a 文件名
:将文件添加到暂存区并提交到本地库git commit -m "日志信息" 文件名
:添加本次提交的备注信息并提交到本地库
(4) 查看历史记录
-
git log
:查看历史提交记录,包括提交的哈希值、作者、日期、具体改了哪等信息 -
git log --pretty=oneline
:每个提交在一行内显示,只显示提交的哈希值和具体改了哪 -
git log --oneline
:每个提交在一行内显示,只显示提交的哈希值的一部分和具体改了哪。只能显示当前版本之前的版本 -
git reflog
:在git log --oneline
的基础上添加了HEAD指针移动多少步可以到达每个历史版本的信息,显示为HEAD@{步数}
,推荐使用
(5) 暂存区文件的删除
git rm --cached 文件名
:从暂存区移除文件
(6) 前进和后退版本
-
本质:git有一个HEAD指针指向当前的历史版本,可以通过移动HEAD指针来改变版本
-
基于索引值操作:
git reset --hard 索引值
,索引值即提交的哈希值(一部分也可),推荐使用 -
使用^符号:
git reset --hard HEAD^
,只能后退,异或符号有几个后退几次 -
使用~符号:
git reset --hard HEAD~n
,后退n步
(7) reset命令的3个参数对比
-
soft
:仅仅在本地库移动HEAD指针 -
mixed
:在本地库移动HEAD指针,并且重置暂存区 -
hard
:在本地库移动HEAD指针,重置暂存区,重置工作区
(8) 本地库文件的删除和恢复
-
git commit -m "日志信息" 文件名
:对已经删除的文件进行提交操作即可 -
git reset --hard 索引号
:可以回退到删除之前的版本,该文件就会恢复
(9) 比较文件差异
-
git diff 文件名
:比较文件与暂存区对应文件的不同,删除的行用红色表示,且前面有减号-
,增加内容的行用绿色表示,且前面有加号+
-
git diff HEAD 文件名
:比较文件与本地库HEAD指针指向的文件的不同,还可以用HEAD^
或HEAD~n
指定要比较的版本 -
git diff
不指定文件名时,比较所有文件
4. 分支管理
(1) 分支
-
在版本控制过程中,通过多条线同时推进多个功能
(2) 分支的优点
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除即可
(3) 分支操作
-
创建分支:
git branch 分支名
,从主分支复制一份 -
查看分支:
git branch -v
-
切换分支:
git checkout 分支名
-
合并分支
- 切换到被合并的分支上,比如把hot_fix合并到master分支,则要切换到master分支
- 把指定分支合并到当前分支
git merge 分支名
-
删除分支:
git branch --delete 分支名
-
解决合并冲突:合并分之后产生冲突,比如从创建分支之后,旧分支和新分支都对文件做了修改,然后要把新分支合并到旧分支上,其解决办法为:
-
编辑文件,删除特殊符号
-
把文件修改到满意的程度,保存退出
-
git add 文件名
-
git commit -m "日志信息"
,注意这里不能带文件名
-
(4) 原理
在创建新分支时只需要创建一个指向当前分支的指针即可,而切换分支或版本时,只需要更改HEAD指针指向的内容即可。
分支的创建
分支的切换
四、GitHub
1. 准备工作
-
首先初始化本地库
-
将文件推送到本地库
-
注册GitHub帐号
-
git remote add 远程库别名 https://github.com/zuzhiang/ACM.git
:添加远程库,并指定其别名 -
git remote -v
:查看远程库的情况
2. 团队开发人员的克隆和推送操作
-
开发人员在自己的电脑上进入项目目录(此时为空)
-
git clone https://github.com/zuzhiang/ACM.git
:将远程库克隆到本地,除了把远程库下载到本地,还会创建origin远程地址别名,且初始化本地库 -
开发人员在本地修改文件后,先推送到本地库
-
远程库所有者在对应仓库的
Settings -> Colloborators
中对github用户进行邀请加入开发团队 -
git push 远程库别名 远程库分支
:开发人员把修改后的文件推送到远程库
3. 团队开发人员的拉取操作
(1) 先fetch再merge
-
git fetch 远程库别名 远程库分支
:将远程库的分支拉取下来,但不会更改本地工作区的文件 -
git checkout 远程库别名/远程库分支
:切换到拉取下来的分支,查看刚刚下载的远程库的内容 -
git checkout master
:切换回本地库 -
git merge 远程库别名/远程库分支
:把远程库合并到本地库
(2) 直接pull
git pull 远程库别名 远程库分支
:拉取远程库并合并到本地库- pull = fetch + merge
4. 解决冲突
当不是基于github远程库的最新版所做的修改时会产生冲突。协作开发时冲突的解决,和分支产生冲突时解决方法类似
- 编辑文件,删除特殊符号
- 把文件修改到满意的程度,保存退出
git add 文件名
git commit -m "日志信息"
,注意这里不能带文件名git push 远程库别名 远程库分支
5. 跨团队协作
-
其他团队要协助本团队开发,首先其他团队要fork本团队对应的仓库,作为自己的远程库
-
其他团队将fork后的远程库clone到本地进行修改,并推送到远程库
-
其他团队在github对应仓库的
Pull requests -> New pull request
中创建一个pull request -
本团队仓库所有者在github对应仓库的
Pull requests
中可以看到相应的pull request -
本团队仓库所有者对代码进行审核
-
审核没问题后,点
Merge pullrequest
合并代码 -
本团队仓库所有者将合并后的远程库拉取到本地
6. 其他
-
如果本地不能记住密码,可以使用SSH的方式记住密码
-
GitFlow工作流举例
以上是关于Git和GitHub版本控制学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
git与github的使用Git最新教程通俗易懂学习——狂神说视频笔记