简介

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

常见的版本控制工具

1.Git
Git是目前世界上最先进的分布式版本控制系统,使用Git和Gitlab搭建版本控制环境是现在互联网公司最流行的版本控制方式
简介: Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务。 Git易于学习,占用内存小,具有闪电般快速的性能。
Github地址:https://github.com/git/git
官方网站:https://git-scm.com/
官方文档:https://git-scm.com/docs
中文文档:https://git-scm.com/book/zh/v2
下载地址:https://git-scm.com/downloads

GIT安装与配置

windows安装

在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。
Git 各平台安装包下载地址为:http://git-scm.com/downloads

在 Windows 平台上安装 Git,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行:
安装包下载地址:https://gitforwindows.org/
官网慢,可以用国内的镜像:https://npm.taobao.org/mirrors/git-for-windows/

安装过程就是一直下一步。
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
在开始菜单里找到”Git”->”Git Bash”,会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
我们可以在CMD中使用git命令。
GIT在安装好之后,windows的右键菜单会有两个选项:
image.png
Git GUI会打开一个可视化的界面,可以可视化操作。
Git Bash会打开命令窗口,我们可以通过命令操作git。这里的命令就是Linux的命令
image.png

Git 配置

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings$USER。
此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

查看git的配置:

  1. git config -list
云@Cherry MINGW64 /d/workspaces/gitres/gitcode
$ git config -l
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master

实际上所有的配置都是存储在一个文件中的:
在安装目录的etc下D:\dev\Git\etc\gitconfig

编辑 git 配置文件:

$ git config -e            # 针对当前仓库
$ git config -e --global   # 针对系统上所有仓库

用户信息

配置个人的用户名称和电子邮件地址:

$ git config --global user.name "Cherry"
$ git config --global user.email "1572273446@qq.com"

如果去掉 —global 参数只对当前仓库有效。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 —global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
其实我们配置的名称和邮箱,其实是在一个配置文件中的,这个配置文件在系统用户目录下:
C:\Users\Administrator.gitconfig


Git 工作流程

一般工作流程如下:

  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

下图展示了 Git 的工作流程:
image.png

Git 工作区、暂存区和版本库

先来理解下 Git 工作区、暂存区和版本库概念:

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

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
image.png

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
  • 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
  • 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
  • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  • 当执行 git rm —cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行 git checkout . 或者 git checkout — 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
  • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。


    Git 创建仓库

    git init

    Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。
    在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
    使用方法
    使用当前目录作为Git仓库,我们只需使它初始化。(没有指定目录就是当前目录)
    git init
    
    该命令执行完后会在当前目录生成一个 .git 目录。

使用我们指定目录作为Git仓库。(指定的目录)

git init newrepo

初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交

$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'

以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。
image.png

git clone

使用 git clone 从现有 Git 仓库中拷贝项目。
参数说明:

  • repo:Git 仓库。
  • directory:本地目录。

克隆仓库的命令格式为:

git clone <repo>

如果需要克隆到指定的目录,可以使用以下命令格式:

git clone <repo> <directory>

克隆我自己的仓库:找到对应的地址
image.png
要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:

$ git clone git@gitee.com:win-dk/wig-demo.git

行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:

$ git clone git@gitee.com:win-dk/wig-demo.git mygrit


Git 基本操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。
本章将对有关创建与提交你的项目快照的命令作介绍。
Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull
image.png
说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库 | 命令 | 说明 | | —- | —- | | git add | 添加文件到仓库 | | git status | 查看仓库当前的状态,显示有变更的文件。 | | git diff | 比较文件的不同,即暂存区和工作区的差异。 | | git commit | 提交暂存区到本地仓库。 | | git reset | 回退版本。 | | git rm | 删除工作区文件。 | | git mv | 移动或重命名工作区文件。 |

提交日志

命令 说明
git log 查看历史提交记录
git blame <file> 以列表形式查看指定文件的历史修改记录

远程操作

命令 说明
git remote 远程仓库操作
git fetch 从远程获取代码库
git pull 下载远程代码并合并
git push 上传远程代码并合并

image.png

Git 分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。
创建分支命令:

git branch (branchname) #创建分支
git branch                          #查看分支列表
git checkout (branchname)  #切换分支命令
git merge demotest            #合并分支  - 将分支合并到master。(可能会有版本冲突)

切换分支之后,在分支中修改的程序,不会影响master中的程序

删除分支

git branch -d (branchname)

例如我们要删除 testing 分支:

$ git branch
    * master
          demotest
$ git branch -d demotest
    Deleted branch demotest (was 85fc7e7).
$ git branch
    * master

分支合并

CONFLICT (content): Merge conflict in Git.java Automatic merge failed; fix conflicts and then commit the result.

发生冲突,打开文件:
image.png

Administrator@PC-20170705JCHA MINGW64 /d/jerry/gitres/gitcode (master|MERGING)
$ git add Git.java

Administrator@PC-20170705JCHA MINGW64 /d/jerry/gitres/gitcode (master|MERGING)
$ git commit -m "解决Git.java文件的版本冲突"
[master f606988] 解决Git.java文件的版本冲突

Administrator@PC-20170705JCHA MINGW64 /d/jerry/gitres/gitcode (master)
$ git merge demotest
    Already up to date.

如果冲突是修改成和demotest分支一致的内容,那么解决冲突之后就不需要再做操作。
如果是不一致的,而且希望master和demotest一致,则需要在demotest合并主分支。

Git 查看提交历史

Git 提交历史一般常用两个命令:

  • git log - 查看历史提交记录。
  • git blame - 以列表形式查看指定文件的历史修改记录。
  • git log —oneline 选项来查看历史记录的简洁的版本。
  • git log —graph 选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:
  • git log —reverse 参数来逆向显示所有日志。
  • git log —author 查找指定用户的提交日志可以使用命令:例如,比方说我们要找 Git 源码中 Cherry提交的部分

Git 标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。比如说,我们想为我们的 runoob 项目发布一个”1.0”版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)”v1.0”的标签。
-a 选项意为”创建一个带注解的标签”。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。 推荐一直创建带注解的标签。

$ git tag -a v1.0

当执行 git tag -a 命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
注意当我们执行 git log —decorate 时,我们可以看到我们的标签了
查看所有标签可以使用以下命令

$ git tag

回到历史版本

git log 查询hash值
git reset hash值

Github

代码托管的平台:https://github.com/

本机的免密登录

在本机使用git的命令生成公钥
image.png
c/User/….为公钥的位置

idea配置git

创建一个新的项目
在IDEA中设置Git,在File—>Setting->Version Control—>Git—>Path to Git executable选择你的git安装后的git.exe文件,然后点击Test,测试是否设置成功
image.png
Git配置好了之后,就可以使用了,但是不能推送到远程仓库。
初始化仓库:
image.png

初始化之后,就有了git的相关菜单
image.png

可以在控制台使用git的命令:
image.png

在IDEA中设置Gitee
IDEA中没有Gitee,所以需要安装插件。
在file->settings->plugins 里面搜索gitee,点击安装:
image.png
重启,登录
image.png
登录之后就可以将IDEA中的代码推送到远程仓库,同样可以从远程仓库下载最新的代码
image.png
当然也可以使用命令。
设置远程仓库
image.png
在第一次推送的时候可能会被拒绝。
一般被拒绝的原因是因为版本冲突。
但是第一次推送被拒绝,大概率是因为gitee上的环境和本地环境差距太大导致的。
解决方案:
在idea内ALT+F12打开命令面板,输入下面三段:

git pull git pull origin master git pull origin master —allow-unrelated-histories

执行上面的命令的时候,要确保所有的文件以及提交。
上面命令中的 origin 要修改为自己设置的remtes的名字。
image.png
全部执行完成之后,再推送。
如果要获取最新的代码, 执行pull即可。

在多人合作的时候,如果要修改,记得先pull再修改,修改之后请push。