Git
一、Git概述
1、Git定义:
Git是一个免费的、开源的分布式版本控制系统,可以快速高效的处理从小型到大型的各种项目。
Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和ClearCase等版本控制工具。
1、何为版本控制?
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
1、为么需要版本控制?
从个人开发到团队协作。
2、版本控制工具
-
集中式版本控制工具
CVS、SVN(subversion)、VSS 集中化的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或者提交更新。多年以来,这已经成为版本控制系统的标准做法。 这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做什么。而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比各个客户端上维护本地数据库来得轻松容易。 事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法系统工作。
-
分布式版本控制工具
Git、Mercurial、Bazaar、Darcs 像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。 分布式的版本控制系统出现以后,解决了集中式版本控制系统的缺陷: 1.服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的) 2.每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
3、Git发展历史
4、Git工作机制
工作区(写代码)
|
| git add
|
暂存区(临时存储)
|
| git commit
|
本地库(历史版本)
5、Git和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库
- 局域网
- GitLab
- 互联网
- GitHub(外网)
- Gitee码云(国内网站)
二、Git常用命令
概要
语法 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户名 |
git config --global user.email 邮箱 | 设置用户邮箱 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加暂存区 |
git rm --cached 文件名 | 移除暂存区 |
git commit -m “日志信息” 文件名 | 提交本地库 |
git reflog 查看简略信息 git log 查看详细信息 | 查看版本信息 |
git reset --hard 简略版本号 | 版本穿梭 |
1、设置用户签名
12086@DESKTOP-VPJ7A44 MINGW64 ~/Desktop
#设置用户名
$ git config --global user.name gzb
#设置用户邮箱
12086@DESKTOP-VPJ7A44 MINGW64 ~/Desktop
$ git config --global user.email 1208644355@qq.com
在Windows家目录下查看配置文件C:\Users\12086.gitconfig
[user]
name = gzb
email = 1208644355@qq.com
1、初始化本地库
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01
$ git init
Initialized empty Git repository in E:/Git-Space/demo01/.git/
2、查看本地库状态
git status
3、添加暂存区
$ git add temp.txt
warning: in the working copy of 'temp.txt', LF will be replaced by CRLF the next time Git touches it
4、移出暂存区
$ git rm --cached temp.txt
rm 'temp.txt'
5、提交本地库
git commit -m "日志信息" 文件名
$ git commit -m "first commit" temp.txt
warning: in the working copy of 'temp.txt', LF will be replaced by CRLF the next time Git touches it
[master (root-commit) 211a689] first commit
1 file changed, 9 insertions(+)
create mode 100644 temp.txt
6、查看版本信息
方式一:简略版
git reflog
$ git reflog
211a689 (HEAD -> master) HEAD@{0}: commit (initial): first commit
方式二:详细版
git log
$ git log
commit 211a6896c752889caa818e041b0887f989995287 (HEAD -> master)
Author: gzb <1208644355@qq.com>
Date: Sat Oct 15 09:02:55 2022 +0800
first commit
7、修改文件
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#修改文件
$ vim temp.txt
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看git状态信息
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: temp.txt
no changes added to commit (use "git add" and/or "git commit -a")
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#将修改的文件添加到暂存区
$ git add temp.txt
warning: in the working copy of 'temp.txt', LF will be replaced by CRLF the next time Git touches it
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看git状态信息
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: temp.txt
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#提交到本地库
$ git commit -m "second commit" temp.txt
warning: in the working copy of 'temp.txt', LF will be replaced by CRLF the next time Git touches it
[master 11d6055] second commit
1 file changed, 5 insertions(+)
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看git详细的版本信息
$ git log
commit 11d6055ce1c0009dcdf8a0b59fadc3cffbecb890 (HEAD -> master)
Author: gzb <1208644355@qq.com>
Date: Sat Oct 15 09:15:59 2022 +0800
second commit
commit 211a6896c752889caa818e041b0887f989995287
Author: gzb <1208644355@qq.com>
Date: Sat Oct 15 09:02:55 2022 +0800
first commit
8、版本穿梭(也就是修改head指针所指向的版本)
语法:
#版本穿梭,也就是修改head指针
$ git reset --hard 简略版本号
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看temp.txt文件,此时是第二个版本的文件
$ cat temp.txt
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
public static main(String[]args) {
System.out.println("Hello World");
}
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看简略的版本信息
$ git reflog
#当前head指针指向第二个版本
11d6055 (HEAD -> master) HEAD@{0}: commit: second commit
211a689 HEAD@{1}: commit (initial): first commit
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#版本穿梭,也就是修改head指针
$ git reset --hard 211a689
HEAD is now at 211a689 first commit
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看版本信息,此时head指针已经指向了第一个版本
$ git reflog
211a689 (HEAD -> master) HEAD@{0}: reset: moving to 211a689
11d6055 HEAD@{1}: commit: second commit
211a689 (HEAD -> master) HEAD@{2}: commit (initial): first commit
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看temp.txt文件,此时是第一个版本的文件
$ cat temp.txt
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
9、查看当前分支指向:
E:\Git-Space\demo01\.git\HEAD
ref: refs/heads/master
10、查看当前分支指向的版本
E:\Git-Space\demo01\.git\refs\heads\master
211a6896c752889caa818e041b0887f989995287
三、Git分支操作
1、什么是分支?
在版本控制中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行,对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
2、分支的好处
1.同时并行推进多个功能开发,提高开发效率。
2.各个分支在开发过程中,如果其中一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
3、分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
1)查看分支
git branch -v
$ git branch -v
* master 211a689 first commit
2)创建分支
git branch 分支名
#创建分支
$ git branch hot-fix
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#查看当前分支
$ git branch -v
hot-fix 211a689 first commit
* master 211a689 first commit
3)切换分支
git checkout 分支名
#切换分支
$ git checkout hot-fix
Switched to branch 'hot-fix'
#修改文件
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (hot-fix)
$ vim temp.txt
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (hot-fix)
#查看文件状态
$ git status
On branch hot-fix
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: temp.txt
no changes added to commit (use "git add" and/or "git commit -a")
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (hot-fix)
#将文件提交到暂存区
$ git add temp.txt
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (hot-fix)
#查看状态
$ git status
On branch hot-fix
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: temp.txt
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (hot-fix)
#提交暂存区中的temp.txt文件到本地库
$ git commit -m "hot-fix first commit" temp.txt
[hot-fix 18eb611] hot-fix first commit
1 file changed, 1 insertion(+)
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (hot-fix)
#查看简略的日志信息
$ git reflog
#当前head指针指向了hot-fix分支的first commit版本
18eb611 (HEAD -> hot-fix) HEAD@{0}: commit: hot-fix first commit
211a689 (master) HEAD@{1}: checkout: moving from master to hot-fix
211a689 (master) HEAD@{2}: reset: moving to 211a689
11d6055 HEAD@{3}: commit: second commit
211a689 (master) HEAD@{4}: commit (initial): first commit
4)合并分支
git merge 分支名
#合并分支
$ git merge hot-fix
Updating 211a689..18eb611
Fast-forward
temp.txt | 1 +
1 file changed, 1 insertion(+)
#重新查看文件
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
$ cat temp.txt
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
This is hot-fix!
#文件已经修改
5)合并冲突(解决冲突问题)
#当master修改了原文件并且hot-fix修改了原文件时,再次合并会发生冲突
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
#合并hot-fix分支
$ git merge hot-fix
Auto-merging temp.txt
#合并冲突
CONFLICT (content): Merge conflict in temp.txt
#提示自动合并失败,需要手动修改文件并提交
Automatic merge failed; fix conflicts and then commit the result.
#手动修改文件
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master|MERGING)
$ vim temp.txt
#查看修改后的文件
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master|MERGING)
$ cat temp.txt
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
This is master(master second version)!
This is hot-fix!(second version)
#查看状态
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master|MERGING)
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: temp.txt
no changes added to commit (use "git add" and/or "git commit -a")
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master|MERGING)
#将文件添加到暂存区
$ git add temp.txt
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master|MERGING)
#提交文件
$ git commit -m "merge test" temp.txt #注意不能带有文件名
fatal: cannot do a partial commit during a merge.
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master|MERGING)
$ git commit -m "merge test"
[master 7d4553b] merge test
#手动合并成功
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master)
$
四、团队协作机制
1、团队内协作
2、跨团队协作
五、GitHub操作
1、创建远程仓库
GitHub网址:https://github.com/
Ps:全球最大的同性交友网站,技术宅男的天堂,新世界的大门。
2、远程仓库操作
命令名称 | 作用 |
---|---|
git remote | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
-
创建别名
#创建别名 $ git remote add demo01 https://github.com/007264/demo01
#查看当前有哪些别名 12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master) $ git remote -v 12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master) #创建别名 $ git remote add demo01 https://github.com/007264/demo01 12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master) #查看当前有哪些别名(fetch用来拉取,push用来推送) $ git remote -v demo01 https://github.com/007264/demo01 (fetch) demo01 https://github.com/007264/demo01 (push)
-
推送本地仓库到远程库
git push 别名 分支名
12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master) #推送本地仓库到远程库 $ git push demo01 master Enumerating objects: 15, done. Counting objects: 100% (15/15), done. Delta compression using up to 12 threads Compressing objects: 100% (10/10), done. Writing objects: 100% (15/15), 1.12 KiB | 573.00 KiB/s, done. Total 15 (delta 4), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (4/4), done. To https://github.com/007264/demo01 * [new branch] master -> master
-
拉取远程库到本地库
git pull 别名 分支名称
#拉取远程库到本地库 $ git pull demo01 master remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 698 bytes | 24.00 KiB/s, done. From https://github.com/007264/demo01 * branch master -> FETCH_HEAD 7d4553b..d0de6b3 master -> demo01/master Updating 7d4553b..d0de6b3 Fast-forward temp.txt | 1 + 1 file changed, 1 insertion(+) 12086@DESKTOP-VPJ7A44 MINGW64 /e/Git-Space/demo01 (master) #查看拉取后的文件 $ cat temp.txt Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! This is master(master second version)! This is hot-fix!(second version) This is GitHub !(first version)
-
克隆远程仓库到本地
git clone 远程地址
小结:
clone会做如下操作:
1.拉取代码
2.初始化本地仓库
3.创建别名
-
团队内协作
主要涉及到令狐冲克隆代码到本地,然后将代码push提交到GitHub,但此时会报错。需要岳不群先将令狐冲拉入到团队中,同时把邀请函网址发给令狐冲,然后令狐冲选择接受邀请,此时令狐冲就可以将代码push提交到GitHub了。之后岳不群就可以pull拉取令狐冲修改后的代码到本地了。
-
跨团队协作
东方不败fork代码到GitHub代码仓库,修改完代码之后,发送pull request请求,岳不群收到请求之后,需要先审批一下代码,同时还可以在请求消息中进行聊天交流,确认代码可以之后,可以进行合并(merge)。
-
SSH免密登录(略)
六、IDEA集成Git
1、配置Git忽略文件
-
为什么要忽略这些文件?
与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽IDE工具之间的差异。
-
如何操作来忽略这些文件?
1.创建忽略规则文件xxxx.ignore(前缀名随便起,建议就是git.ignore)
这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig文件引用,建议也放在用户家目录下
git.ingore文件模板内容
#Compiled class file *.class
# compile file *.class # log file *.log # BlueJ file *.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* replay_pid* # maver ignore file target/ pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup pom.xml.next release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties !/.mvn/wrapper/maven-wrapper.jar # idea environment file .idea/* .idea/compiler.xml .idea/encodings.xml .idea/modules.xml *.iml
2.在.gitconfig文件中引用忽略配置文件(此文件在Windows的家目录中)
[user] name = gzb email= 1208644355@qq.com [core] excludesfile = C:/用户/12086/git.ignore
3.在IDEA中定位git程序
在idea的settings中找到Git,设置Git安装路径下的git.exe并测试 在没有问题的情况下,选择OK
2、在IDEA中进行Git的相关操作
七、IDEA集成GitHub
八、国内代码托管中心-码云
1、简介
众所周知,GitHub服务器在国外,使用GitHub作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至出现登录不上的情况。针对这个情况,大家可以使用国内的项目托管网站-码云。
码云是开源中国推出的基于Git的代码托管中心,网址:https://gitss.com/,使用方式跟GitHub一样,而且他还是一个中文网站,适合英文不是很好的开发者。