Git

版本控制

版本控制(Revision control):一种在开发过程中对项目文件、目录等内容的修改历史进行管理,以方便查看更改历史记录,备份以便恢复以前的版本的技术

主要功能:

  • 实现跨区域多人协同开发
  • 追踪和记载一个或多个文件的历史记录
  • 组织、保护源代码与文档
  • 统计工作量
  • 追踪记录整个项目的开发过程

版本控制分类:

  • 本地版本控制

    记录文件每次的更新,对每个版本做一个快照或记录补丁文件,适合个人使用

    代表产品:RCS

  • 集中版本控制

    所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改

    用户本地只有自己以前所同步的版本,如果不连网,用户就看不到历史版本

    一旦服务器故障,项目即存在较大风险

    代表产品:SVN

  • 分布式版本控制

    所有版本信息可以同步到每一个用户的本地,本地可以查看到所有的版本历史

    可以离线在本地提交,之后在连网时push到服务器或其他用户那里

    由于每个用户那里保存的都是所有的版本数据,故只要有一个用户的设备没有问题就可以恢复所有的数据

    代表产品:Git

Git与SVN

  • SVN是集中式版本控制系统,版本库是集中放在中央服务器的;而工作的时候,用的都是自己的电脑,所以首先先要从中央服务器得到最新的版本,工作完成后,则需要把文件推送到中央服务器。

  • Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库;工作的时候不一定需要连网

    Git协同的方式是这样的:小明在电脑上改了文件A,小红也改了文件A,他们两之间把各自的修改推送给对方,就可以互相看到对方的修改了

思考:使用SVN,团队开发同时修改同一文件,先后提交,会发生什么?

会提交失败!解决办法:

1、对文件选择revert操作:文件恢复到最新的版本,放弃自己的更新内容

2、对文件选择update操作:update后会出现冲突,出现四个文件:旧版本的文件、别人更新的文件、我更新的文件、别人跟我共同修改后的文件。然后自己整理内容,和别人讨论到底留谁的,接着执行resolve解决冲突,最后执行revert恢复到最新版本。

Git工作原理

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/lndex)、资源库/版本库(Git Directory/Repository)

Git有一个远程仓库(Remote Directory),文件在四个区域之间的转换关系如下:

git工作区间

  • 工作区:平时存放项目代码的地方
  • 暂存区:临时存放改动,是一个文件,保存的是即将提交的文件的修改信息
  • 版本库:安全存放数据的地方,里面有提交到所有版本的数据,其中HEAD指向最新放入仓库的版本
  • 远程仓库:托管代码的服务器

其中用户能看到的是工作区和远程仓库,而暂存区和版本库是放在隐藏文件.git中的

Git工作流程:

  1. 在工作目录中添加、修改文件
  2. 将需要进行版本管理的文件放入暂存区
  3. 将暂存区的文件提交到远程仓库

因此,Git管理的文件有三种状态:已修改(modified)、已暂存(staged)、已提交(committed)

Git的使用

windows版的Git安装完后,会出现三个exe

  • Git Bash:Unix与Linux风格的命令行
  • Git CMD:Windows风格的命令行
  • Git GUI:图形界面版的Git

在桌面右键,会出现Git Bash Here,点击进入Git客户端;安装时可以选择命令类型,若选择Linux风格的,此时就需要用Linux命令去操作

Git配置

Git安装目录下的etc\gitconfig文件,是Git系统配置文件

C:\Users\Administrator\.gitconfig,为用户配置文件

  • Git客户端执行git config -l:查看全部配置清单
  • git config --system --list:查看系统配置
  • git config --global --list:查看用户配置
  • git config --global user.name "xxx":设置用户名
  • git config --global user.email xxx:设置邮箱

Git项目搭建

  • 本地搭建仓库

    创建本地仓库的方法有两种:本地创建全新的仓库;克隆远程仓库

    1、本地创建全新的仓库,需要在项目的根目录启动Git客户端,并执行以下命令:

    git init
    

    2、克隆远程仓库,需要先创建一个用于存放项目的空目录,再在该目录执行如下命令:

    git clone [url]
    

Git文件操作

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,Git管理的文件有以下4种状态:

  • Untracked:未跟踪,此文件在文件夹中,但并没有加入到版本库,不参与版本控制,通过git add命令,可以将其状态改为Staged
  • Unmodify:文件已入库,未修改,即版本库中的文件快照的内容与文件夹中的一致;如果它被修改,状态会变为Modified;如果使用git rm命令将其移出版本库,状态则变为Untracked
  • Modified:文件已修改,通过git add命令,可使其进入staged状态,使用git checkout命令,从版本库中取出文件,覆盖当前修改,返回到Unmodify状态
  • Staged:暂存状态,执行git commit,可以将修改的文件同步到库中,这时库中的文件和本地文件变为一致,文件变为Unmodify状态,执行git reset HEAD [filename]取消暂存,文件状态变为Modified

查看文件状态的命令:

  • 查看指定文件状态

    git status [filename]

  • 查看所有文件状态

    git status

文件管理相关命令:

  • 添加所有文件到暂存区

    git add .

  • 提交暂存区内容到本地版本库,-m "xxx"表示提交信息

    git commit -m "xxx"

  • 将本地版本库的分支推送到远程服务器上对应的分支

    git push <远程主机名> <本地分支名>:<远程分支名>

    eg:git push origin master:origin/master

    将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名

    git push :如果当前分支只有一个远程分支,那么主机名都可以省略

  • 从远程获取代码并合并本地的版本

    git pull <远程主机名> <远程分支名>:<本地分支名>

忽略文件

有时我们不想把某些文件纳入版本控制中,比如数据库文件、临时文件等

可以在主目录下建立.gitignore文件,达到这一目的,在Git客户端输入命令touch .gitignore,可以在当前目录建立一个 .gitignore文件

此文件有如下规则:

  • 文件中的空行或以#号开始的行,会被视为注释(此行无效果)

  • 可以使用Linux通配符,如:* 代表任意多个字符,代表一个字符,[xxx]代表可选字符串范围,{str1,str2}代表可选的字符串

  • 放在文件名前,表示例外规则

  • /放在路径前,如/a,表示只忽略当前目录下的a文件和目录,子目录的a不在忽略范围内

  • /放在路径后,表示要忽略的是当前目录下该路径后的所有内容

    eg:

    target          //忽略这个target目录
    angular.json    //忽略这个angular.json文件
    log/*           //忽略log下的所有文件
    css/*.css       //忽略css目录下的.css文件 ,但不包括css/a/xx.css
    *.txt           //忽略所有 .txt结尾的文件
    !lib.txt        //lib.txt除外,即使前面设置了对*.txt的忽略
    /temp           //忽略当前目录下的temp文件,子目录中的temp不被忽略
    build/          //忽略所有build目录下的文件,但如果是名为build的文件则不忽略
    

Git分支

分支一般用于区分项目的版本,分支之间的关系就像是平行宇宙,不同的分支之间互不干扰

常用分支命令

#列出所有本地分支
git branch

#列出所有远程分支
git branch -r

#新建一个分支,但依然停留在当前分支
git branch [branch-name]

#切换分支
git checkout [branch-name]

#新建一个分支,并切换到该分支
git checkout -b [branch-name]

#合并指定分支到当前分支
git merge [branch-name]

#删除分支
git branch -d [branch-name]

#删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]

#拉取远程仓库的全部更新
git fetch

#查看分支所有节点(版本)
git log --graph --all

优秀博客参考:https://www.cnblogs.com/videring/articles/6962005.html

远程仓库

码云、GitHub或公司自己搭建的仓库

  • 本机设置绑定SSH公钥,实现免密码登陆远程仓库
    1. 进入本机的C:\Users\Administrator\.ssh目录
    2. 开启Git客户端,输入ssh-keygen命令,生成公钥;ssh-keygen -t rsa -b 4096 -C "你的邮箱"公钥使用rsa加密算法加密,同时配置邮箱
    3. 命令执行完,会生成两个文件:id_rsa和id_rsa.pub
    4. 把id_rsa.pub里的内容添加到远程仓库
  • 在远程仓库新建或寻找一个仓库,复制它的克隆地址,在本地进行clone

优秀博客参考:https://blog.csdn.net/qq_38085855/article/details/82684167

IntelliJ IDEA集成Git

  1. 把远程仓库的.git文件复制到IDEA项目中(可以把之前从目标仓库克隆下来的文件拷贝过去);或者File->new->porject from version control,新建工程
  2. 项目有了.git文件,idea上方工具栏就会有git相关工具;在idea目录中,文件的颜色表示文件不同的状态
  3. 可以使用idea上方工具栏中的update工具,更新当前的项目
  4. 可以在idea下方的terminal中执行git add .,以add项目的文件,也可以在idea左方文件目录右键,点击add,进行add操作
  5. terminal中执行git commit,以commit项目的文件;也可以使用Commit工具,选择需要commit的文件,之后点击commit按钮,即可自动完成commit操作
  6. terminal中执行git push ,进行远程仓库同步