1.Git简介
Git是一开源的分布式版本控制系统,提供了存储代码、管理版本历史、分支和合并等功能。
-
版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。它的主要目的是跟踪和记录软件开发过程中的每个版本,记录每个版本的修改历史、版本号和发布日期等信息,以便更好地管理代码和文档,并帮助开发人员更好地协作和开发软件。
-
通过版本控制,开发人员可以随时回滚到之前的稳定版本,恢复错误或进行分支开发等操作,以便更好地管理软件开发过程中的变化和风险。
-
版本控制通常与版本控制系统(Version Control System,VCS)相关联,如Git、SVN等。这些系统提供了存储代码、管理版本历史、分支和合并等功能,帮助开发人员更好地协作和管理软件开发过程中的版本变化。
2.版本控制的发展历史
早期的版本控制系统是本地化管理的,采用某种简单的数据库记录文件的历次更新差异。但随着合作开发和协调工作的需要,集中式的版本控制系统(CVCS)出现了。
不同的开发人员通过客户端连接到集中管理的服务器上,提交或读取最新的文件,比如常用的SVN就是这种工作模式。
2.1 集中化的版本控制系统
集中化版本控制系统,是通过一个集中管理的中央服务器,来保存所有文件修改的历史版本,而协同开发者通过客户端连接到这台服务器,从服务器上同步更新或上传自己的修改。
-
在集中式的版本控制系统中,管理员可以轻松管控每个开发者的权限,并且维护成本低。
-
但是这种架构下集中式服务器存在明显的单点故障,如果版本控制服务器宕机,则无法提供服务。
-
如果服务器数据丢失并且无法恢复,那么整个项目的数据和变更历史也随之丢失。
2.2 分布式版本控制系统
为解决以上问题出现了分布式版本控制系统(DVCS),其基本设计理念是客户端不仅仅提取最新版本的快照,而是把代码仓库完整的镜像下来,相当于在本地有一份完整的数据拷贝。这样,当CVS服务器故障时,通过任何一个本地的镜像仓库就可以恢复数据。同时还可以和不同的远端代码仓库进行交互,设置不同的协作流程。
-
用户在本地就可以查看所有的历史版本信息,当用户进行修改提交文件的时候,需要进行远程更新或提交。
-
用户即使离线时页可以进行本地提交,push推送到远程服务器才需要联网。
-
每个用户都保存了历史版本,所以只要有一个用户设备没问题,就可以恢复数据。
3.Git的相关概念
3.1 工作区域
工作区域 | 说明 |
---|---|
Workspace | 用户电脑本地看到的文件和目录,在Git的版本控制下,构成了工作区。 |
Index/Stage | 暂存区,一般存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放未提交的改动。比如:执行git add,这些改动就添加到这个区域。 |
Repository | 本地仓库,是一个存放在本地的版本库。 |
Remote | 远程仓库,就是远程数据交换的仓库。比如:github,码云等代码托管平台所提供的仓库。 |
Git的工作流程如下:
1)从远程仓库中克隆代码到本地仓库
2)从本地仓库中checkout代码然后进行代码修改
3)在提交前先将代码添加到暂存区
4)将暂存区的代码提交到本地仓库,本地仓库中保存修改的各个历史版本
5)修改完成后,需要和团队成员共享代码时,将代码push到远程仓库
4.Git下载与安装
Git - Downloadshttps://git-scm.com/download
5.环境配置
当安装Git后首先要做的事情是设置用户名称和email地址,每次Git提交都会使用该用户信息。
5.1 设置用户信息
git config --global user.name "han"
git config --global user.email "han@woniu.com"
5.2 查看配置信息
git config --list
git config user.name
通过上面的命令设置的信息会保存在~/.gitconfig
文件中
6.初始化仓库
要使用Git对我们的代码进行版本控制,首先需要获得Git仓库,获取Git仓库通常有两种方式:
在本地初始化一个Git仓库
从远程仓库克隆
6.1 在本地初始化一个Git仓库
git init
6.2 从远程仓库克隆
可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地。
命令形式为:git clone 远程Git仓库地址
git clone https://gitee.com/project.git
切换进入远程仓库的账号
git config --system --unset credential.helper
7. 本地仓库的操作
首先我们在工作区新建一个Hello.java
文件。
7.1 加入暂存区
git add Hello.java
7.2 查看文件的状态
git status
git status -s #输出简介信息
Git中文件有4种状态:
根据一个文件是否已加入版本控制,可以把文件状态分为:
Tracked已跟踪(被纳入版本控制),而tracked(已跟踪)又包括三种工作状态:
Unmodified 未修改状态
Modified 已修改状态
Staged 已暂存状态
Untracked未跟踪(未被纳入版本控制)
7.3 移除暂存区
git reset Hello.java # 将暂存区的文件取消暂存
7.4 提交到本地仓库
在提交到本地仓库之前,要先将文件添加到暂存区,然后在commit提交到本地仓库 。
git commit -m "初始化提交Hello.java" hello.java # 将暂存区的文件提交到本地仓库
7.5 直接提交到本地仓库
注意:commit -am 只对修改和删除有效,对于新增的文件还是先要执行add操作。
git commit -am "提交修改" # 不经过暂存区,直接提交本地仓库
7.6 删除文件
git rm Hello.java # 删除文件
7.7 提交删除
git commit -m "delete commit" # 将删除的文件提交本地仓库
7.8 忽略列表
一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
7.9 查看日志
git log
-
当
commit
(提交)比较多,git log
的内容在一页显示不完整,满屏放不下的时候,就会显示冒号。 -
回车(往下滚一行)、空格(往下滚一页)可以继续查看剩余内容。
-
退出:英文状态下 按
q
可以退出git log
状态。
7.10 回滚操作
git log //查看提交历史,找出要回滚到的commit-id
git reset --hard commit-id //回滚到commit-id
git reset --hard HEAD~1 //将最近1次的提交回滚
8.远程仓库的操作
8.1 从远程仓库克隆
如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
git clone https://gitee.com/woniuxy2021/myproject.git # 从远程仓库克隆到本地仓库
8.2 添加远程仓库
运行 git remote add 添加一个新的远程 Git 仓库,同时指定一个可以引用的简写。
git remote add origin https://gitee.com/p.git # 将本地仓添加一个新的远程Git仓库(关联)
8.3 查看远程仓库
如果想查看已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出指定的每一个远程服务器的简写。 如果已经克隆了远程仓库,那么至少应该能看到 origin ,这是 Git 克隆的仓库服务器的默认名字。
git remote # 查看远程仓库
git remote show origin # 查看远程仓库输出更详细的信息
8.4 推送到远程仓库
推送代码到远程仓库的分支
git push origin master # 将本地仓库的代码推送到远程仓库
8.5 拉取
git pull 是从远程仓库获取最新版本并merge到本地仓库。
git pull origin master # 从远程仓库中拉取代码(自动合并)
注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories ),解决此问题可以在git pull命令后加入参数—allow-unrelated-histories
git pull origin master --allow-unrelated-histories //加上后面这个选项允许不相关历史提交
8.6 移除远程仓库
如果因为一些原因想要移除一个远程仓库 ,可以使用 git remote rm命令
git remote rm origin # 将本地仓库跟远程仓库的关联移除
注意:此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库。
9.分支操作
Git一般都是存在多个分支的,比如:开发分支,回归测试分支以及主干分支等。
使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。开发人员在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
git init 命令会默认创建master分支。
9.1 新建分支
git checkout -b dev 新建一个分支,并且切换到新的分支dev
git branch dev 新建一个分支,但是仍停留在原来分支
9.2 查看分支
git branch 查看本地所有的分支
git branch -r 查看所有远程的分支
git branch -a 查看所有远程分支和本地分支
9.3 切换分支
注意:git在切换分支之前要确保当前分支没有未提交的修改,将当前分支内容进行commit之后再切换到其他分支。
git checkout dev 切换到dev分支
9.4 推送到远程仓库分支
git push origin dev # 推送至远程仓库分支
9.5 合并分支
在dev分支上进行开发完成之后,需要把dev开发分支上的代码合并到master主分支上。
首先切换到master分支
git checkout master
将dev分支合并到master分支
git merge dev
将master分支推送到远程仓库
git push origin master
9.6 删除分支
git branch -D <branchname> 删除本地branchname分支
10.IEDA集成Git
10.1 配置Git的路径
10.2 创建工程并添加到Git
10.3 将文件添加到暂存区
10.3.1 添加忽略列表
# .idea目录下面所有的文件
.idea/
# 忽略指定文件
git_test.iml
# 忽略编译后的文件
target/
10.3.2 添加到暂存区
10.3.3 提交文件
10.5 将代码推送到远程仓库
因为是新建的本地仓库,推送到远程仓库的时候,需要定义远程仓库。
10.5 从远程仓库克隆工程到本地
10.6 代码的推送/拉取
A开发者端:
(1)创建Hello.java
(2)添加、提交、推送
B开发者端:
(1)拉取代码
(2)修改代码、添加、提交、推送
(3)A开发者端从远程仓库更新代码
10.7 创建分支并切换分支
10.8 推送分支到远程仓库
在dev分支上开发代码,并推送到远程仓库。