一. 什么是Git

Git官网地址https://git-scm.com/

Git源码https://github.com/git/git/

1.1 Git简介

  • Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
  • Git 是李纳斯·托沃兹( Linus Torvalds )为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
  • Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

1.2 Git的优点

  • 大部分操作在本地完成,不需要联网
  • 速度快、灵活
  • 尽可能添加数据而不是删除或修改数据
  • 分支操作非常快捷流畅
  • 与 Linux命令全面兼容

二. Git和Svn的区别

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

三. Git下载与安装

3.1 下载Git

Git管网下载https://git-scm.com/downloads


执行exe文件

一直点next

桌面鼠标右击,出现

Git Bash:Unix与Linux风格的命令行,使用最多,推荐最多
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令

四. Git结构

工作区:就是你在电脑里能看到的目录(写的代码存在工作区)。
暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件 (.git/index)中,所以我们把暂存区有时也叫作索引(index).(计划要提交的文件)
版本库:(本地库)工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

五. Git和代码托管中心

5.1 代码托管中心

代码托管中心的任务:维护远程库
局域网环境下:

  • GitLab服务器

外网环境下:

5.2 本地库与远程库

团队内部协作和跨团队协作

5.3 团队内部协作流程

5.4 跨团队协作

六. Git命令行

6.1 创建本地库

右键进入git bash here

1
2
3
4
5
6
mkdir blog  创建文件   
cd blog 进入blog
ll -A 查看隐藏的.git文件内容
git init 初始化一个 Git 仓库
ll .git/ 表示查看.git 下的文件列表显示
cat .git/config 查看.git/config 内容

注意:.git目录是存放本地库相关的目录和文件,不要对其进行修改和操作

6.2 设置签名

6.2.1 签名概述

  1. 签名的作用:用于标识不同的开发人员
  2. 项目级别(仓库):仅在当前本地库范围有效
  3. 系统级别:登录当前操作系统的用户范围
  4. 级别优先级:就近原则:项目级别优先级大于系统(用户)级别签名

注意:签名级别必须要设置,如果都不设置,GIT可能会导致命令出差。无法辨别

6.2.2 签名命令

项目级别(仓库):仅在当前本地库范围有效

1
2
3
git config user.name zysheep
git config user.email zysheep@163.com
cat .git/config 查看设置结果

系统级别:登录当前操作系统的用户范围

1
2
3
4
5
git config –global user.name zysheep
git config –global user.email zysheep@163.com
cd ~ 家目录
ll –A | grep –i git 查看叫git的文件名称
cat .gitconfig 查看文件内容

在实际开发过程中,通常只需要设置系统级别即可。如果有特殊需要,再设置项目级别。

6.3 常用命令

1
2
3
4
5
6
7
8
9
git tatus  用于显示工作目录和暂存区的状态
git add xxx.txt 将工作区写入暂存区
git rm 命令用于从工作区和索引中删除文件。
git commit -m '备注信息' 将暂存区提交到本地库
git checkout 切换分支或恢复工作树文件
git log 显示提交日志信息
git log –-pretty=oneline 更优雅的显示(查看历史记录)
Git log --oneline
git reflog //用于显示需要回退的步骤HEAD

6.4 永久删除后找回

git rm 命令用于从工作区和索引中删除文件。

  1. 工作区创建文件,通过命令提交到本地库
1
2
3
Vim d1.txt  
git add d1.txt
git commit –m ‘上传到本地库d1.txt’ d1.txt
  1. 执行命令进行删除:
1
2
git rm d1.txt 工作区删除后,提交到本地库
git commit –m ‘删除d1.txt’ d1.txt
  1. 通过日志git reflog 找回
1
2
$ git reset --hard 15d5002
ll查看即可

注意: git只要在本地库发生操作,都会进行版本记录。

6.5 文件比较

gid diff 将工作区中的文件和暂存区进行比较

1
2
vim git.txt    修改内容
git diff git.txt 用于显示提交和工作树等之间的更改

gid diff 暂存区中的文件和本地库进行比较

1
2
3
4
git add git.txt 将git.txt 工作区添加到暂存区 
git diff HEAD git.txt HEAD代表本地库最新版本指针
git diff 不加文件名
git checkout 文件名 退回修改

七. 本地库和远程库的交互

7.1 初始化本地库与远程库建立连接

  1. git remote -v查看当前所有远程地址别名

  1. git remote add [别名][远程地址]


  1. 推送 git push [别名] [分支名]

出现以上错误,是因为目录中没有文件,空目录是不能提交上去的。

我们在目录中添加一个文件,使用git add加入到暂存区,git commit提交到本地库中。

可能要设置签名(设置全局签名吧,否则设置项目级别的前面,后面再创建本地仓库,又得重新设置),设置完成后,再git commit,最后再git push

这是因为github上的远程库与本地库版本不一致导致的。我们根据提示先pull,再push

1
2
git pull origin master
git push origin master

git pull 失败 ,提示:fatal: refusing to merge unrelated histories,这是因为两个根本不相干的 git 库, 一个是本地库, 一个是远端库, 然后本地要推送到远端, 远端觉得这个本地库跟自己不相干, 所以告知无法合并。有两种解决方法:

  • 第一种:从远端库拉下来代码, 本地要加入的代码放到远端库,然后提交上去,这相当于是一种更新;
  • 第二种:强制拉取git pull origin master --allow-unrelated-histories

总结: 创建远程仓库,本地仓库初始化后,使用git pull拉取,保持本地库与远程库版本一致。

7.2 克隆与远程库建立连接

1
git clone [远程地址]

克隆操作为我们做了这些事情:

  • 完整的把远程库下载到本地
  • 创建远程库地址别名:origin
  • 初始化本地库

如果已经找到远程库,推荐使用克隆来与远程库建立连接

7. 3 切换远程库

方式一:修改远程仓库地址

1
2
3
git remote  -v  #  查看远程仓库的地址

git remote set-url origin Url # 更换远程仓库地址,Url为新地址。

方式二:先删除远程仓库地址,然后再添加

1
2
git remote rm origin   # 删除现有远程仓库
git remote add origin url # 添加新远程仓库

八. 分支

8.1 分支概念

  1. 什么是分支?
    在版本控制过程中,使用多条线同时推进多个任务。


2. 分支的好处?

  • 同时并行推进多个功能开发,提高开发效率
  • 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任
    何影响。
  • 失败的分支删除重新开始即可

8.2 分支命令

  1. 创建分支
    1
    git branch develop
  2. 查看本地分支:
    1
    git branch

注: 名称前面加* 号的是当前的分支

  1. 查看远程分支:

加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话)

1
git branch -a
  1. 切换分支
    1
    git checkout branch_name
  2. 删除本地分支
    1
    git branch -d branch_name
  3. 删除远程分支
    1
    2
    git branch -r -d origin/branch-name  
    git push origin :branch-name
  4. 如果远程新建了一个分支,本地没有该分支。

可以利用 git checkout --track origin/branch_name ,这时本地会新建一个分支名叫 branch_name ,会自动跟踪远程的同名分支 branch_name。

1
git checkout --track origin/branch_name
  1. 如果本地新建了一个分支 branch_name,但是在远程没有。

这时候 pushpull 指令就无法确定该跟踪谁,一般来说我们都会使其跟踪远程同名分支,所以可以利用 git push --set-upstream origin branch_name ,这样就可以自动在远程创建一个 branch_name 分支,然后本地分支会 track 该分支。后面再对该分支使用 push 和 pull 就自动同步。

1
git push --set-upstream origin branch_name
  1. 合并分支到master上
    首先切换到master分支上
    1
    git  checkout master
    如果是多人开发的话 需要把远程master上的代码pull下来
    1
    git pull origin master
    然后我们把dev分支的代码合并到master上
    1
    git  merge dev
    然后查看状态
    1
    git status

示例 :合并分支

  1. 在分支hot_fix 上修改git.txt文件,并提交到本地库
  2. 需要合并分支。让master上的git.txt同步

切换到接受修改的分支上master(将hot_fix内容同步到master

1
git checkout master   //切换到接受修改的分支上

执行merge命令,git merge命令用于将两个或两个以上的开发历史加入(合并)一起。

1
git merge hot_fix   //hot_fix 被合并的分支名称

##7.3 合并分支(冲突)解决

问题:将两个分支内的文件分别进行修改.(且改变的是同一位置)进行合并。

1、查看分支信息:

1
git branch -v

2、在master下修改某行文件内容。然后进行提交。

1
2
3
vim git.txt  
git add git.txt
git commit –m ‘master 提交’ git.txt


3、查看分支信息

1
git branch -v


4、在hot_fix下修改某行(master)同行文件内容。然后进行提交

1
2
3
4
git checkout hot_fix
vim git.txt
git add git.txt
git commit –m ‘hot_fix提交’ git.txt


查看版本信息:

合并:

1
2
3
git merge master  //在hot_fix中向master中合并代码

Automatic merge failed; fix conflicts and then commit the result.(自动合并失败;修复冲突,然后提交结果。)


查看文件(冲突的):
cat git.txt

处理冲突:

  • 由人为沟通解决。
  • 进行文件编辑

修改文件:

1
2
3
vim git.txt   // (将冲突的符号清除。进行修改内容)
git add git.txt
git commit –m ‘冲突已修复’//不需要带文件名称

![][18]