概述

GIT是一个软件,他可以帮助我们对文档进行版本管理。所以它就是一个版本管理工具

可以在任何时间点,将文档的状态作为更新记录保存起来,也可以在任何时间点,将更新记录恢复回来。

GIT与SVN的区别

SVN

SVN是集中式的版本管理工具

1、如果你想用SVN,就必须先装一台SVN服务器,再给每一个开发机上装上一个SVN客户端。 2、如果要提交代码,就直接把代码提交到SVN服务器上, 3、如果要下载代码, 也是从SVN服务器上把代码下载到本地。 4、每一个客户机都是直接和SVN服务器进行交互的。代码是由SVN服务器来统一管理的

GIT

GIT是分布式版本控制系统

版本控制系统其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。 版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词”ok”。 而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。 需要注意下:Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的。

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可

因为Git跟踪并管理的是修改,而非文件。
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

分布式就是没有中央服务器。在每一个开发人员的电脑上都有一个完整的版本库。
如果想提交代码,是无需连接到中央服务器的。
在每一个开发人员的电脑上都有一个本地仓库,开发人员就可以利用这个本地仓库来实现代码的管理。
我们可以在本地把代码加到版本库中去,然后就可以添加文件,修改文件,查看文件历史等。

如果我们在开发一个人项目的时候,这个项目只有一个开发人员,他不需要和别人进行协作,我们就只需要本地仓库就可以了。

多人协作的时候,需要交换代码。需要交换代码,就需要有一个远程仓库,
远程仓库和本地仓库中的内容其实的一模一样的,就是把本地仓库复制一份放到远程仓库。
如果别人想把远程仓库中的代码拉到本地,那就把远程仓库中的代码再复制一份到他的本地就可以了。

GIT工作流程

1、从远程仓库中克隆GIT资源作为本地仓库;
2、从本地仓库中checkout代码然后进行代码修改
3、在提交前先将代码提交到暂存区;
4、提交修改,提交到本地仓库。本地仓库中保存修改的各个历史版本;
5、在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。

图片.png

GIT - 图2

Git的安装

下载地址: https://git-scm.com/download

安装完成后,在桌面鼠标右键,选择Git Bash here ,然后输入 git --version,可以查看当前安装的版本号,能查到的话,说明就是安装成功了。

Git工作区

工作区域有四个

  • 远程仓库 托管代码的服务器,服务器安全存放数据的位置,里面存放着提交到所有版本的数据。
  • 本地仓库(版本库) 本地安全存放数据的位置,里面存放着你提交的所有版本的数据。其中HEAD指向最新放入仓库的版本
  • 暂存区 临时存放项目文件的改动情况。最后统一提交到仓库。

    1. 事实上它只是一个文件,保存即将提交到文件列表信息
  • 工作区 存放项目文件的地方。可以进行添加、编辑、修改文件等动作。如果把工作区的文件全部提交到仓库,然后又没有对工作区做任何修改,那么工作区就是“干净”的 —> 即工作区没有任何文件了。

文件的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。

  • Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过git add 状态变为Staged。

  • Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处,如果它被修改,而变为Modified。 如果使用git rm移出版本库,则成为Untracked文件

  • Modified:文件已修改,仅仅是修改, 并没有进行其他的操作。这个文件也有两个去处:

通过git add可进入暂存staged状态,使用git checkout则丢弃修改过,返回到unmodify状态,这个git checkout 即从库中取出文件,覆盖当前修改

  • Staged: 暂存状态。 执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态.。执行git reset HEAD filename取消暂存,文件状态为Modified

Git基本操作

1、安装完成后,首先,选择一个合适的地方,创建一个文件夹,右键选择Git Bash Here,进入git命令窗口。

pwd命令用于显示当前目录。—>就是可以查看当前文件夹的路径 为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

2、在命令行窗口先初始化Git。

git init 初始化git,会在当前文件夹下边生成一个隐藏的.git文件夹。
.git就是本地版本库。包含.git的目录就是工作目录(包含.git文件夹的文件夹就是工作目录)。 .git文件夹是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

如果要向本地仓库中添加一个文件的话,这个文件必须放在工作目录下边。工作目录就是工作区

3、初始完之后,接着设置用户名和用户邮箱(全局配置,配一次就行了)

设置用户名 git config --global user.name '用户名';

设置用户邮箱 git config --global user.name '邮箱';

4、查看当前的文件/文件夹,在工作区/暂存区的状态 git status

在工作区的文件,显示是红色,在暂存区的文件,显示是绿色

5、把文件/文件夹提交到暂存区。 git add 文件名 `

提交完成后,可以再执行一下git status 命令,会发现文件/文件夹名字变成了绿色,说明文件已经到了暂存区了。在本地的文件,名字都是红色的 git add .可以直接把所有文件都提交到暂存区

6、把暂存区的文件提交到本地仓库。 git commit -m "描述信息"

git commit只负责把暂存区的修改提交

7、修改本地仓库文件

(1)如果修改了存在仓库中的文件,然后再执行 git status 命令,会出现
image.png

(2)所以需要重新提交,继续 git add 文件名;提交到暂存区;

(3)把文件从暂存区再次提交到本地仓库,git commit -m "描述信息"
**

我们要不断的对文件进行修改,不断的提交到修改到版本库中。 所以每当你觉得文件修改到一定程度的时候,就可以将文件重新提交到版本库中,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作

8、查看每次的修改提交操作中,都修改了什么内容 git log

git log命令显示从最近到最远的提交日志 它的返回信息中有一个版本号 git log --pretty=oneline 可以更好的查看返回信息

9、版本回退 git reset --hard HEAD^

通过 git log 操作后,我们可以看到每一次提交文件的版本号 在Git中,用HEAD表示当前版本,上一个版本就是 ` HEAD^ ` ,上上一个版本就是 ` HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成**HEAD~100 `**。

好了,知道了要回退到哪个版本号,就去执行操作吧。git reset --hard HEAD^

10、删除文件。git rm 文件名 -f

(1)用 `** rm 文件名** `,删除本地的文件

(2)此时,Git知道你删除了文件,因此再执行 ` **git status** ` 命令时,会立刻告诉你哪些文件被删除了;

(3)这个时候,你有两个选择,一是确实要从版本库中删除该文件
那就用 ****** git rm 文件名**** ,把文件从Git中删除,
并且再执行
git commit -m "描述信息"** 命令,来提交操作;
这样一个流程结束,才算是把一个文件夹删掉了。

(4)第二个选择是,你误删了。而此时暂存区中还存有这个文件,
那么用 git checkout 文件名 可以轻松的从暂存区再把这个文件给恢复回来

11、在当前文件夹下git创建一个新文件 的命令 touch 文件名;

12、查看当前目录下的文件 ls 或者dir可以

13、撤销修改 这个不太懂

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout — file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

14、拉取文件 git checkout 文件名

就是假如我有个a.txt文件,里边有内容aaaa,然后我将她存入暂存区。 之后又在本地修改了它的内容为bbb,再然后我觉得我修改错了,不应该修改,想恢复原样,那么我就去暂存区找到这个文件,把它重新拉到本地,覆盖掉我之前修改的bbbb内容(如果暂存区没有这个文件,就去本地仓库找)。 这一步就是用 git checkout 操作执行的。git checkout 文件名 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

15、贮藏文件 git stash


16、重新回退贮藏文件 git stash pop

Git分支操作

查看分支 git branch

创建新分支 git branch 新的分支名

一般情况下分支的名称的命名,必须有意义 可以使用开发者自己的名字或者以当前开发的功能作为分支名

切换分支 git checkout 分支名

要切换的分支名,必须是当前git里边有的分支名 这个命令可以用来切换文件,又可以用来切换分支,就很迷 可以用新增语句git switch 分支名。效果是等价的,只不是便于区分

合并分支 git merge 子分支名称

如果想要合并子分支 首先你必须在主分支 eg:在master分支上执行git merge dev,将dev分支合并到master上

删除分支 git branch -d 子分支名称

想要删除整个子分支,不能再当前的子分支上边,可以在其他任意一个分支上


git和github

github是一个全球性质的线上代码托管平台 github就是一个远程仓库。远程仓库就是实现了代码的集中化管理。所有的开发者都会把自己的代码提交到远程仓库,实现代码共享及备份

列出已经存在的远程分支

git remote

列出已经存在的远程分支详细信息

git remote -v

关联远程到本地仓库

` git remote add 名字 https://github.com/man188/yuedu.git `

将本地仓库推送到远程服务器

git push -u origin master
**

加载远程仓库代码到本地(克隆仓库)

git clone 远程仓库地址

注意: 一般情况下远程仓库地址我们都是用https 而很少使用ssh

将远程仓库的信息同步到本地仓库

git pull

从本地向远端推送新的分支

git push --set-upstream origin 新的分支名

注意: 在推送分支之前需要执行 git branch 新的分支名

删除远端分支

git push origin --delete 分支名

注意:

1、如果创建了本地分支 需要将本地分支推送到远程分支 推送前需要在本地分支上边 2、如果删除远程的分支 需要在其他分支上边使用我们的命令删除远程的分支 3、当删除远程分支的时候 同名的本地分支并不会被删除 你需要单独删除掉本地的同名分支

gitFlow

涉及到5个分支

  • master

    项目初始化创建master分支

  • develop

    项目初始化之后从master分支生成一个develop分支

  • feature

    开发新功能 从develop生成的一个分支 本类型的分支可以有多个 开发完成之后 合并到develop上边 本分支结束

  • release

    准备发布 从develop生成的新分支 开始测试 修复测试当中的bug

  • hotfix

    发布版本发现bug 从master分支生成一个hotfix 修复你所发现的发布版本中的bug 合并到master分支 本分支结束

git配置ssh密钥

为什么要配置密钥

如果不设置 ssh 公钥每次提交代码就要输入你的帐号密码。如果不需要密码那不是谁都可以往你的代码仓库推代码了?设置了公钥之后你的机器和 github 通信的时候 github 可以通过公钥识别出你是可信赖用户,这样就不需要每次 git 和 github 通信的时候都要输入密码了。

配置步骤

大概需要三个步骤:
一、本地生成密钥对;
二、设置github上的公钥;
三、修改git的remote url为git协议。