Git 概述、命令、分支,免密登录;及 Idea 集成 GitHub

Git

Git 概述

Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目

Git 易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具

集中化的版本控制系统诸如 CVS、SVN 等、都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法

这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易

事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作

像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份

分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷

  1. 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
  2. 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)

Git 分为工作区(本地磁盘)-暂存区(临时存储)-本地库(历史版本)-远程库(托管中心)

  • Git 的当前版本是基于上一版本的,因此不能删除历史版本
  • 代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库
    • 局域网:GitLab
    • 互联网:GitHub、Gitee

Git 安装

Git 命令

常用命令

命令名称作用
git config --global user.name设置用户签名
git config --global user.email设置用户签名
git init初始化本地库
git status查看本地库状态
git add 文件名添加到暂存区
git commit -m “提交说明” 文件名提交到本地库
git reflog查看历史记录(含版本号前七位)
git reset --hard 版本号版本穿梭

签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码

这里设置的用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系

较之于 git reflog,git log 可以看到更完整的历史记录(包含日期、用户名、邮箱和完整版本号)

Git 版本穿梭的底层是修改指针引用

  • head → master → second(指向 master 分支的第二版)
  • head → master → first(指向 master 分支的第一版)

Git 分支

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本(分支的底层其实也是指针的引用

分支的好处

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

Git 分支命令

命令名称作用
git branch 分支名创建分支
git branch -v查看分支
git checkout 分支名切换分支
git merge 分支名把指定的分支合并到当前分支上

合并分支时,若两个分支在同一个文件的同一个位置(这里指同一行或相邻行,间隔一行不会触发)有两套完全不同的修改。Git 就会认为发生了合并冲突

此时需要手动进行修改,并将修改后的文件添加到暂存区,提交到本地库,即合并成功

合并分支只会修改一个分支(被合并的分支)

创建分支的本质就是多创建一个指针,head 指向当前所在的分支的提交

跨团队协作(跨仓库)时,才会使用 fork 和 merge 操作

Idea 集成 Git

配置 Git 忽略文件(有些文件与项目的实际功能无关,不参与服务器上部署运行。把他们忽略掉能够屏蔽 IDE 工具之间的差异)

  1. 创建忽略规则文件 xxxx.ignore(一般是 git.ignore)

  2. .ignore 文件模板内容如下

    # Compiled class file
    *.class
    
    # Log file
    *.log
    
    # BlueJ files
    *.ctxt
    
    # Mobile Tools for Java (J2ME)
    .mtj.tmp/
    
    # Package Files #
    *.jar
    *.war
    *.nar
    *.ear
    *.zip
    *.tar.gz
    *.rar
    
    # virtual machine crash logs
    hs_err_pid*
    
    .classpath
    .project
    .settings
    target
    .idea
    *.iml
    
  3. 在 .gitconfig 文件中引用忽略配置文件

    [core]
    	excludesfile = C:/Users/asus/git.ignore
    

在 Maven 中也可以直接配置 ignore

Idea 初始化本地库:VCS(Version Control Setting)→ Import into Version Control → Create Git Repository

Idea 中标红的文件表示未添加到暂存区

Idea 中标绿的文件表示已添加到暂存区

Idea 中标蓝的文件表示已添加到暂存区,并被再次修改了

Idea 添加到本地库:右键项目→ Git → Add,会提示 The following dictory may contain ignored files. Do you want to force add it? 这时点击 Cancel,即添加成功

Idea 提交到本地库:右键项目→ Git → Commit Directory,输入提交说明,点击 Commit

Idea 中正常标黑的文件表示已提交到本地库,不需要再提交了

Idea 切换版本:左下 Version Control → Log 可以查看所有分支版本和当前分支版本,在要切换的版本上右键点击 Checkout Revision ‘xxxxxxxx’

在 Idea 中,既可以将 head 指针指向某个版本,也可以将 head 指针指向某个分支指针(如 master,这也是默认的行为)

Idea 创建分支:右键项目→ Git → Repository → Branches → New Branch

在 Idea 的右下角状态栏也会显示当前处于哪个分支,可点击并创建的新分支

若勾选 Checkout branch,则不仅会创建分支,还会切换到新分支

Idea 合并分支:在右下角状态栏点击分支,点击要合并来的分支,点击 Merge into Current

Idea 冲突合并:会弹出标题为 Conflicts 的弹窗,可选择:

  • Accept Yours
  • Accept Theirs
  • Merge…(手动合并)

GitHub

创建远程库

点击 New repository,输入远程库名字(建议和本地库名字一致)

常用命令

命令名称作用
git remote -v查看当前所有远程地址
git remote add添加远程地址

代码推送 Push

代码拉取 Pull

拉取动作会自动提交本地库(一般用于合并代码)

代码克隆 Clone

从公共库克隆代码不需要登录账号

Clone 会做如下操作:

  1. 拉取代码
  2. 初始化本地库
  3. 创建别名

SSH 免密登录

ssh-keygen -t rsa -C atguiguyueyue@aliyun.com

生成公钥后,复制到 GitHub 的 SSH keys 中

此后,可以使用 SSH 链接在 Git 进行拉取和推送(不必登录)

Idea 集成 GitHub

push 操作:

  • 在进行 push 操作之前,确保先进行了 pull 操作,以便将远程库的最新更改合并到本地库中
  • 如果本地库的版本比远程库的版本高(有新的提交),则在 push 之前需要先进行合并操作,以解决可能存在的冲突
  • 确保解决冲突后,再进行 push 操作,将本地库的更改推送到远程库

pull 操作:

  • 在进行 pull 操作之前,确保先进行了 commit 操作,将本地的修改保存到本地库中
  • 如果远程库的版本比本地库的版本高(有新的提交),则进行 pull 操作将远程库的更改合并到本地库中
  • 如果合并过程中存在冲突,需要解决冲突后再进行 commit 操作

clone 操作:新建时,选择 Get from Version Control

Gitee

创建远程库

Idea 集成 Gitee

Gitee 连接 GitHub 进行代码的复制和迁移

码云(Gitee)提供了直接复制 GitHub 项目的功能,方便我们做项目的迁移和下载

  • 导入已有仓库
  • 已导入的 GitHub 仓库内容更新后,可在 Gitee 中选择强制同步,覆盖 Gitee 仓库

GitLab

GitLab 服务器的搭建和部署

Idea 集成 GitLab