版本控制工具-Git
一、概述
什么是版本控制系统?
版本控制软件提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理活动,追踪多个版本的开发和维护活动,及时发布软件。
一句话总结:版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
版本控制系统分类:
- 集中式版本控制系统(CVCS): SVN
- 分布式版本控制系统(DVCS):Git
什么是Git?
Git是一款免费开源的分布式版本控制系统,用以处理小到大型的工程版本控制操作。
Git历史
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。
Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统(参见 Git 分支)。
Git学习文档
中文文档: https://git-scm.com/book/zh/v2
二、Git使用
安装Git
以windows平台为例
下载Git lient应用
https://github.com/git-for-windows/git/releases/download/v2.23.0.windows.1/Git-2.23.0-64-bit.exe
安装配置
建议:使用默认配置即可
如何使用Git
- GUI
- Bash
初始化设置
Administrator@PC-20190909FNCP MINGW64 /e
$ git config --global user.name 'gaozhy'
Administrator@PC-20190909FNCP MINGW64 /e
$ git config --global user.email 'gaozhy@zparkhr.com.cn'
Administrator@PC-20190909FNCP MINGW64 /e
$ git config --list
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
http.sslbackend=openssl
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
user.name=gaozhy
user.email=gaozhy@zparkhr.com.cn
核心概念
Git 工作区、暂存区和版本库
-
工作区:工作目录。
-
暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
-
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
基本操作
创建版本库(Repository)
仓库的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻恢复还原。
Administrator@PC-20190909FNCP MINGW64 /f/baizhi
$ git init
Initialized empty Git repository in F:/baizhi/.git/
使用
git init
指令会在工作目录中,创建一个隐藏目录.git
, 此目录是git
版本库文件,请勿破坏
Add
将工作区中的文件 添加到版本库的暂存区
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git add Hello.java
Commit
将暂存区的数据,提交到版本库。只有提交到版本库的数据,Git才会进行版本控制操作
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git commit -m 'first commit Hello.java'
[master (root-commit) 8c21f36] first commit Hello.java
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Hello.java
Status
展示Git的工作状态
如:删除Hello.java
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: Hello.java
no changes added to commit (use "git add" and/or "git commit -a")
Checkout
从版本库恢复误删除的数据
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git checkout -- Hello.java
Diff
比对工作区文件或者目录和版本库内容差异
+: 工作区对比版本库多出来代码
-: 工作区对比版本库少出来代码
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git diff Hello.java
diff --git a/Hello.java b/Hello.java
index d6301bf..936b28c 100644
--- a/Hello.java
+++ b/Hello.java
@@ -1,5 +1,4 @@
public class Hello{
public static void main(String[] args){
- System.out.println("Hello");
}
}
Rm
删除工作区的文件或者目录
真删除
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ rm -rf Cat.java
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: Cat.java
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git add Cat.java
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: Cat.java
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git commit -m 'delete Cat.java'
[master a980b75] delete Cat.java
1 file changed, 1 deletion(-)
delete mode 100644 Cat.java
误删除
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: Hello.java
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git checkout -- Hello.java
版本回退
log
展示Git版本库的提交日志
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git log
commit a980b7551643e8ab39d41ec9a84cae3903990db9 (HEAD -> master) # commit id
Author: gaozhy <gaozhy@zparkhr.com.cn> # 操作人身份信息
Date: Fri Oct 18 14:33:04 2019 +0800 # 操作时间
delete Cat.java # 操作内容
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git log --pretty=oneline
a980b7551643e8ab39d41ec9a84cae3903990db9 (HEAD -> master) delete Cat.java
5e3aa730d9a4e2656ebb0589ec9e604dec413d61 modify something
c85edcd49c082a1f41bd36342c248b89b9c95d21 first commit Cat.java
2fae3bb8852414d6787eaab3965cf04d69246366 print hello
8c21f366594684612b71df8827807677b302332b first commit Hello.java
reset
回退到版本库的历史版本
从历史版本回到将来版本
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git reset --hard 2fae3
HEAD is now at 2fae3bb print hello
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
# 展示所有的操作日志
$ git reflog
8c21f36 (HEAD -> master) HEAD@{0}: reset: moving to 8c21f366594684612b71df882780 7677b302332b
a980b75 HEAD@{1}: reset: moving to a980b7551643e8ab39d41ec9a84cae3903990db9
8c21f36 (HEAD -> master) HEAD@{2}: reset: moving to 8c21f366594684612b71df882780 7677b302332b
c85edcd HEAD@{3}: reset: moving to c85edcd49c082a1f41bd36342c248b89b9c95d21
a980b75 HEAD@{4}: commit: delete Cat.java
5e3aa73 HEAD@{5}: commit: modify something
c85edcd HEAD@{6}: commit: first commit Cat.java
2fae3bb HEAD@{7}: commit: print hello
8c21f36 (HEAD -> master) HEAD@{8}: commit (initial): first commit Hello.java
Check(过期)
丢弃已提交到暂存区的修改内容
三、Git远程仓库-GitHub
Git远程仓库:GitHub、GitLab
GitHub是全球最大的一个Git本地版本库的托管网站,使用Github可以有效的对Git本地版本库的内容进行备份,并且我们可以借助于GitHub完成协同开发
注册&登陆
配置SSH免密登陆
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ ssh-keygen -t rsa -C "gaozhy@zparkhr.com.cn"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):
Created directory '/c/Users/Administrator/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:yj8T1aEOWEfRR8L10gqlfu6tPvWKD2+JJAqG5SpDTi0 gaozhy@zparkhr.com.cn
The key's randomart image is:
+---[RSA 2048]----+
| .o+.o+ |
| . . ++.o |
| o . ooo. o|
| o . o... o |
| . + S+ . o |
| E o.+.. o .o .|
| + . oo. o o...o.|
| + . .+ .=+..|
| o .o .+B+.|
+----[SHA256]-----+
Administrator@PC-20190909FNCP MINGW64 ~
$ cd .ssh/
Administrator@PC-20190909FNCP MINGW64 ~/.ssh
$ ll
total 5
-rw-r--r-- 1 Administrator 197121 1675 十月 18 15:11 id_rsa
-rw-r--r-- 1 Administrator 197121 403 十月 18 15:11 id_rsa.pub
创建Git远程仓库
本地关联远程版本库
Administrator@PC-20190909FNCP MINGW64 /e
$ cd F:
Administrator@PC-20190909FNCP MINGW64 /f
$ cd baizhi/
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
# 关联
$ git remote add origin https://github.com/gaozhy520/bigdata2.git
推送代码
Administrator@PC-20190909FNCP MINGW64 /f/baizhi (master)
$ git push -u origin master
Username for 'https://github.com': 627345199@qq.com
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 6 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 296 bytes | 296.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/gaozhy520/bigdata2.git
2fae3bb..f94ae97 master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
四、分支管理
展示当前所处分支
当前所处的分支前,会有
*
标记
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (master)
$ git branch
* master
创建分支
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (master)
$ git checkout -b dev
Switched to a new branch 'dev'
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (dev)
$ git branch
* dev
master
切换分支
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (dev)
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (master)
$ git checkout dev
Switched to branch 'dev'
合并分支
test分支功能合并到dev分支
- 切换到dev分支
- merge操作
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (dev)
$ git merge test
Updating b5655a3..13b13cf
Fast-forward
Hello.java | 1 +
1 file changed, 1 insertion(+)
删除分支
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (master)
$ git branch -d test
Deleted branch test (was 13b13cf).
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (master)
$ git branch
dev
五、协同开发
邀请组员
发送邀请链接
发送邀请链接https://github.com/gaozhy520/bigdata2/invitations给协同者,协同开发者选择同意后,即可假如项目中(读写访问权限)。
协同者克隆项目
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (master)
$ git clone https://github.com/gaozhy520/bigdata2.git
协同开发代码提交到远程版本库
协同者操作
同步协同者的代码到本地版本库
Administrator@PC-20190909FNCP MINGW64 /f/baizhi1/bigdata2 (master)
$ git pull origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/gaozhy520/bigdata2
* branch master -> FETCH_HEAD
f94ae97..db941ee master -> origin/master
Auto-merging Hello.java
CONFLICT (content): Merge conflict in Hello.java
Automatic merge failed; fix conflicts and then commit the result.
发现如下内容:CONFLICT (content): Merge conflict in Hello.java
解决代码冲突问题:
- 代码共存(无重合)
- 保留一方(有重合)
六、冲突处理
当团队协同工作的时候,多位团队成员同时操作一个文件。团队成员A操作完成后,将该文件提交到远程仓库上。此时,其他团队成员的本地文件与版本库上的文件版本不一致。当团队成员B操作完成并对文件进行 提交操作时,就会产生冲突
七、IDEA集成
准备工作
- 需要Git客户端应用(略)
集成方法
设置
开启
初始化
其余操作
产生冲突
[外链图片转存中…(img-u6YDxcOs-1578464558006)]
[外链图片转存中…(img-WeydqHSD-1578464558007)]
七、IDEA集成
准备工作
- 需要Git客户端应用(略)
集成方法
设置
[外链图片转存中…(img-FOdFwUcA-1578464558007)]
开启
[外链图片转存中…(img-dHYaAdrJ-1578464558008)]
初始化
[外链图片转存中…(img-mZgzSOYc-1578464558008)]
其余操作
[外链图片转存中…(img-xXFptPsn-1578464558009)]
[外链图片转存中…(img-TOEy4hHD-1578464558009)]
[外链图片转存中…(img-Mz7vHxIL-1578464558010)]
[外链图片转存中…(img-7136asVb-1578464558010)]
[外链图片转存中…(img-A21M5fdA-1578464558011)]