Git&GitHub使用指南
Git在本地进行版本控制
1.版本控制工具 具备的功能
-
协同修改
多人 并行不悖 的修改服务器端的同一个文件。
-
数据备份
不仅保存目录和文档的当前状态,还能够保存每一个提交过的历史状态。
-
版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约储存空间,提高运行效率。这方面SVN采用的是增量式管理的方法,而Git采取了文件系统快照的方式。(省空间)
-
权限控制
对团队中参与开发的人员进行权限控制。
对团队外的,开发者贡献的代码进行审核——Git独有。
-
历史记录
查看修改人、修改时间、修改内容、日志信息。
将本地文件恢复到某一个历史状态。
-
分支管理
允许开发团队在工作过程中,多条生产线同时推进任务,进一步 提高效率。
2.版本控制简介
版本控制:
工程设计领域中,使用版本控制管理工程蓝图的设计过程。
在IT开发过程中,也可以使用版本控制思想,管理代码的版本迭代。
版本控制工具:
集中式版本控制工具:
CVS、SVN、VSS···
每个开发人员是客户端,文件和版本信息存在服务器上。
缺点:服务器没了,历史数据都没了。单点故障
分布式版本控制工具:
Git、Mercurial、Bazaar、Darcs···
在本地就有完整的历史,避免了单点故障。本地库之间可以互相传输文件(一般还是用远程库)
3.Git简史
Git官网
Git优势
-
大部分操作在本地完成,不需要联网
-
完整性保证(每一次提交数据,会给一个hash值)
-
尽可能添加数据而不是删除或者修改数据。(每次提交会保存新的数据,不会删除旧的数据)
-
分支操作非常快捷流畅(对不同快照的不同的指针)
-
与Linux命令全面兼容(Vim编辑器)
Git的本地结构
Git和代码托管中心
代码托管中心的任务:维护远程库
-
局域网环境下
GitLab服务器
-
外网环境下
GitHub(代码托管中心)
码云
本地库和远程库(交互方式)
团队内部协作
跨团队协作
4.Git命令行操作
本地库初始化(在git bash里操作)
-
先创建一个工作区,然后进去 cd Git-workspaces
-
ll 查看当前目录下所有文件(不包含隐藏文件)
ls -lA 查看当前目录下所有文件(包含隐藏文件)
ls -lA | less
-
创建一个目录,(创建一个新的项目)mkdir 项目名字
-
git init:初始化目录
(会创建出 .git目录,. 表示的是隐藏的)
目录中存放的是本地库相关的子目录和文件,不要删除也不要随便修改。
(信息保存的位置是 config 这里)
设置签名
形式:
用户名,email地址
作用:
区分不同开发人员的身份
辨析:
这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系
命令:
项目级别、仓库级别:仅在当前本地库范围内有效(有需求,就设置这个)
-
git config user.name
-
git config user.email
(保存在 ./.git/config 里面)
系统用户级别:登录当前操作系统的用户范围(一般只设置这个就足够了)
-
git config –global user.name
-
git config –global user.email
(保存在 ~/.gitconfig 里面)
级别优先级: 项目级别 > 系统用户级别
二者都有时,采用项目级别的签名;只有系统用户级别,就以系统用户级别的签名为 准;二者都没有是不允许的。
5.添加提交以及查看状态
查看状态(暂存区)
git status:查看所在分支、工作区、暂存区 的状态。(按照这个顺序)
vim good.txt(创建一个新文件,用vim编辑器)
添加到暂存区
git add [file name]:将工作区【新建、修改】的文件 加载到,暂存区(安全一些,不会丢失了)
git convert LF to CRLF 当checking out text file
convert CRLF to LF 当committing text files
git rm --cache <file>
用这个,去unstage。(从暂存区中移出)
工作区的文件添加到暂存区是可以退回来的,新建文件必须add之后再commit,但是修改之后的文件可以直接commit(不能修改了)。
从暂存区里提交
git commit:提交文件到 本地库 (要输入注释,commit message)
git commit -m “My second commit,modify good.txt” [file name](直接提交,不用进vim)
cat file:查看文件
vim编辑器
:set nu,这个命令在最下方输入,可以显示行数
i ,进入编辑
esc + : + wq ,退出
1 file changed(一个文件修改了),3 insertions(+)一共有几行
6.版本穿梭测试的准备工作
git log:查看历史版本信息(head指针,表示当前版本)
查看历史记录的不同方式
git log:全部信息都显示,如果最下面出现 :,说明可以用空格键去翻页。(翻页比较麻烦)
多屏显示控制方式:
-
空格向下翻页
-
b向上翻页
-
q退出
git log –pretty=oneline:每条日志只显示一行,简洁一些。会显示全部的哈希值。
git log --oneline:哈希值只显示一部分,更简洁一些。
git reflog:Head@{ 移动到当前版本,需要的步数 },
前进后退历史版本操作的本质
先查看当前文件的内容cat [file name]
基于索引值操作(推荐)
git reset --hard [哈希值(一部分也可以)]
文件内容就变成了 当前哈希值 所指定的版本。(选中就复制了,不用复制粘贴)
使用^符号(只能后退)
git reset --hard HEAD^(后退一步)多少个 ^ 就退多少步。
tail -n 数字 [file name] 会显示后面几行的东西是什么
使用~符号(只能后退)
git reset --hard HEAD~3(后退3步,退几步写多少数字)
7.reset命令的三个参数对比
–soft:不会碰 index file(暂存区)和 working tree(工作区),仅仅在本地库移动HEAD指针。
–mixed:在本地库移动HEAD指针,也会重置暂存区
–hard:在本地库移动HEAD指针,重置暂存区,重置工作区
8.永久删除文件后找回
rm [file name] 删除文件
ll 查看所有文件
git status(可以看到有个文件被删除了)
git add filename(提交到暂存区)
git commit -m “delete filename” [file name](提交到本地库,一直都会有记录)
git status (此时什么也没有)
git reset --hard HEAD^ (回到上一个版本,就可以找到原来删除的文件)
添加到暂存区的删除文件找回
如果在当前版本里,在暂存区删除了一个文件,
可以直接git reset --hard HEAD(再回到之前的状态)在本地库移动指针,暂存区里就会刷新,即可找回。
删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库。
操作:git reset --hard [指针位置],
指针位置:历史记录或当前位置。
删除操作提交到本地库,指针位置指向历史记录,即可找回。
删除操作尚未提交到本地库,指针位置使用HEAD,即可找回。
比较文件差异
修改一个文件之后,
- git diff [filename],将工作区的文件和暂存区比较。(若修改之后add,再diff,就没有变化)
-表示删除的行
+表示新增加的行
-
git diff [本地库中历史版本] [filename],将工作区的文件和本地库历史记录进行比较。
git diff HEAD^ [filename],和上一个版本进行比较。
-
git diff 不带文件名,可以比较当前工作区里所有的文件。
9.分支管理(git比svn好)
在版本控制过程中,使用多条线同时推进多个任务。
master 主干,(一般开发是新建一个自己的本地分支,开发完合并到主分支)
分支彼此独立,不想要了可以直接删除。(多个功能同时开发,节省时间)
hot_fix:热修复,服务器不停止的。(一般都是热修复)
cold_fix:冷修复,服务器停止了。
好处
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支可以直接删除,重新开始即可。
分支操作
查看当前分支
git branch -v :查看目前分支
创建分支
git branch [分支名]
git branch hot_fix:创建一个hot_fix分支
切换分支
git checkout [分支名]:切换分支
合并分支
第一步:切换到接受修改的分支(被合并,增加新内容)上
第二步:执行执行merge命令
例如:
git checkout master[分支名]
git branch -v
git merge hot_fix[有新内容分支名](合并hot_fix,到master上了)
解决冲突(由人解决)
为什么会产生冲突:两个分支都可以修改,但是两个分支正好修改的位置一样,他就不知道改合并谁了。(git不会产生额外的文件,SVN会)
每一个分支修改后,要add和commit,不然分支会同步。
auto merge失败过后,会让你手动修改 conflicts 然后再 commit 结果
(MERGING)用vim打开看看
HEAD后面是当前分支的内容,===后面是另外一个分支的内容。
然后git status,git add,git status(modified),然后↓
merge的时候git commit -m “My second commit,modify good.txt” 不能带文件名。
总结
冲突解决:
- 编辑文件,删除特殊符号
- 把文件修改到满意的程度,保存退出
- git add [文件名]
- git commit -m “日志信息”(PS:此时commit不能带具体的文件名)
10.Git基本原理
哈希算法
11.Git保存版本的机制
集中式版本控制工具的文件管理机制(SVN,节约存储空间)
Git的文件管理机制(重复文件会保留一个指针)
Git文件管理机制细节(“提交对象”)
12.Git分支管理的本质是 创建和移动指针
文件版本管理,是个链条。
创建分支,是创建新的指针
切换分支,只是切换指针
GitHub(远程库)
本地库和远程库交互方式
团队内部协作
跨团队协作
测试远程交互,初始化新的本地库
先创建一个新的文件夹
git init
git add filename
git commit -m “test github” filename
在本地创建 远程库地址 别名
git remote -v:查看别名
git remote add [远程库地址别名] [github给的地址]
1.推送
git push [本地设置的远程库别名] [想要推送的分支]
2.克隆( 用另一个目录 )
git clone [远程地址]
效果:
- 完整的把远程库下载到本地
- 创建 原来设置的 远程地址别名
- 初始化本地库
3.邀请加入团队
Settings > Collaborators > 添加邀请人账号,复制链接
4.远程库修改的拉取
fetch + merge = pull
a.pull 拆开使用
git fetch [远程库地址别名] [远程分支名]
(只是抓取远程库的内容,但是并没有更改本地库文件,原始的内容)
git checkout [远程库别名/分支名]:切换到远程库的分支
git checkout [分支名]:切换回本地的分支
好处
操作复杂时,可以先暂时对 本地文件 不做合并,看好具体事项时候,再merge。
git merge [远程库地址别名/远程分支名]
b.直接使用
git pull [远程库地址别名] [远程分支名](不太会产生冲突)
5.协同开发时冲突的解决
要点:
-
如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取。
-
拉取下来后如果进入冲突状态,则按照 “分支冲突解决” 操作即可。
6.跨团队协作(fork、pull request、merge)
以别的账号,在仓库右上角点Fork。
本地修改,然后推送到远程库。
(我们)Pull request(可以对话聊天)
(我们做pull request)
(对方)审核代码后,merge pull request合并代码。(填写合并信息,日志)
confirm merge
(对方)将远程库修改,拉到本地。git pull 远程库别名 远程库分支
7.SSH登录
8.一些命令
git log:查看历史记录
git reflog:查看历史记录的版本号id
git checkout – XX:把XX文件在工作区的修改全部撤销
git rm XX:删除XX文件
使用时遇到的问题
怎样上传文件夹(github不能有空文件夹)
推送拒绝
github上看不见图片,更改DNS
解决方案
域名查找到真实ip
(对方)审核代码后,merge pull request合并代码。(填写合并信息,日志)
confirm merge
(对方)将远程库修改,拉到本地。git pull 远程库别名 远程库分支
参考尚硅谷b站视频