文章目录
第一章 Git概述
Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
Git易于学习,占地面积小,性能极快。具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。
1.1 版本控制
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制最重要的是可以记录文件修改历史,从而让用户能够查看历史版本,方便版本切换。
1.2 版本控制工具
集中式版本控制工具:CVS、SVN、VSS…
-
集中化的版本控制系统诸如 CVS、SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
-
优点:每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
-
缺点:中央服务器发生单点故障后任何人都无法提交更新,无法协同工作。
分布式版本控制工具:Git、Mercurial、Bazaar、Darcs…
- 像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来 (本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
- 分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷 :
- 服务器断网的情况下也可以进行开发,因为版本控制是在本地进行的。
- 每个客户端保存的也都是整个完整的项目,包含历史记录。更加安全。
1.3 Git简史
1.4 Git工作机制
1.5 Git和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
- 局域网:GitLab
- 互联网:GitHub、Gitee
第二章 Git安装
官网:https://git-scm.com/
安装步骤:默认即可
安装时注意事项:
文件的行末换行符, Windows使用 CRLF Linux使用 LF
第三章 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 版本号 | 版本穿梭 |
3.1 设置用户签名
基本语法:
git config --global user.name 用户名
git config --global user.email 邮箱
配置完成后可在C:\Users\Administrator\.gitconfig
文件中查看配置信息。
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。 Git首次安装必须设置一下用户签名,否则无法提交代码。
注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。
3.2 初始化本地库
基本语法:
git init
初始化后可在工作空间看到隐藏的 .git
文件夹。
3.3 查看本地库状态
基本语法:
git status
首次查看(工作区没有任何文件)
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
新增文件(hello.txt)
$ vim hello.txt
hello git
hello git
再次查看(检测到未追踪的文件)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
3.4 将工作区文件添加到暂存区
基本语法:
git add 文件名
提交后查看状态(检测到暂存区有新文件)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
删除暂存区文件
git rm --cached 文件名
再次查看状态(检测到未追踪的文件)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
3.5 将暂存区文件提交到本地库
基本语法:
git commit -m "日志信息" 文件名
$ git commit -m "first commit" hello.txt
[master (root-commit) 6433731] first commit
1 file changed, 2 insertions(+)
create mode 100644 hello.txt
提交成功后查看状态
$ git status
On branch master
nothing to commit, working tree clean
查看版本信息
$ git reflog
6433731 (HEAD -> master) HEAD@{0}: commit (initial): first commit
6433731:版本号
查看版本详细信息
$ git log
commit 6433731704e58f8e9768d5b9165b9033c9c36926 (HEAD -> master)
Author: wuyp315 <345949570@qq.com>
Date: Thu Nov 10 16:35:32 2022 +0800
first commit
6433731704e58f8e9768d5b9165b9033c9c36926:详细版本号
3.6 修改文件
修改文件–> 查看状态–> 添加到暂存区–> 查看状态 --> 提交到本地库 --> 查看状态 --> 查看版本信息
$ vim hello.txt
hello git
hello git 111
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git add hello.txt
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: hello.txt
$ git commit -m "second commit" hello.txt
[master 83c894c] second commit
1 file changed, 1 insertion(+), 1 deletion(-)
$ git status
On branch master
nothing to commit, working tree clean
$ git reflog
83c894c (HEAD -> master) HEAD@{0}: commit: second commit
6433731 HEAD@{1}: commit (initial): first commit
3.7 历史版本
基本语法:
git reflog 查看版本信息
git log 查看版本详细信息
3.8 版本穿梭
基本语法:
git reset --hard 版本号
--首先查看当前的历史记录,可以看到当前是在83c894c这个版本
$ git reflog
83c894c (HEAD -> master) HEAD@{0}: commit: second commit
6433731 HEAD@{1}: commit (initial): first commit
--切换到6433731版本,也就是我们第一次提交的版本
$ git reset --hard 6433731
HEAD is now at 6433731 first commit
--切换完毕之后再查看历史记录,当前成功切换到了6433731版本
$ git reflog
6433731 (HEAD -> master) HEAD@{0}: reset: moving to 6433731
83c894c HEAD@{1}: commit: second commit
6433731 (HEAD -> master) HEAD@{2}: commit (initial): first commit
--然后查看文件hello.txt,发现文件内容已经变化
Git 切换版本,底层其实是移动的 HEAD 指针。
第四章 Git分支操作
4.1 什么是分支
在版本控制过程中,同时推进多个任务,为每个任务我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
4.2 分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
4.3 分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
4.3.1 查看分支
基本语法:
git branch -v
$ git branch -v
* master 6433731 first commit
4.3.2 创建分支
基本语法:
git branch 分支名
$ git branch hot-fix
$ git branch -v
hot-fix 6433731 first commit(刚创建的新的分支 ,并将主分支master的内容复制了一份)
* master 6433731 first commit
4.3.3 修改分支
修改master分支后,将文件添加暂存区,提交本地库后查看分支
$ git branch -v
hot-fix 6433731 first commit(hot-fix分支并未做任何改变)
* master 83c894c first commit(当前master分支已更新为最新一次提交的版本)
4.3.4 切换分支
基本语法:
git checkout 分支名
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
--发现当先分支已由master改为hot-fix,并且hot-fix分支上的文件内容与master分支上的内容不同
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (hot-fix)
4.3.5 合并分支(正常合并)
基本语法:
git merge 分支名
$ git merge hot-fix
Updating 6433731..110e36d
Fast-forward
hello.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
4.3.6 合并分支(冲突合并)
冲突产生的表现:后面状态为 MERGING
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master|MERGING)
$ cat hello.txt
hello git 111
test
<<<<<<< HEAD
2222
=======
test
>>>>>>> hot-fix
hello git
冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
查看状态(检测到有文件有两处修改)
$ 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: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
4.3.7 解决冲突
-
编辑有冲突的文件,删除特殊符号,决定要使用的内容
- 特殊符号:
<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
- 特殊符号:
-
添加到暂存区
git add hello.txt
-
执行提交(注意:此时使用git commit 命令时不能带文件名)
-
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master|MERGING) $ git commit -m "test" [master 22c139d] test --后面MERGING消失,变为正常 Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
-
4.4 创建分支和切换分支理解
master、hot-fix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的。所以创建分支的本质就是多创建一个指针。
HEAD 如果指向master,那么我们现在就在master 分支上。
HEAD 如果执行hotfix,那么我们现在就在hotfix 分支上。
所以切换分支的本质就是移动HEAD指针。
第五章 Git团队协作机制
5.1 团队内协作
5.2 跨团队协作
第六章 GitHub操作
GitHub网址:https://github.com/
6.1 创建远程仓库
6.2 远程仓库操作
命令名称 | 作用 |
---|---|
git remote v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
6.2.1 创建远程仓库别名
基本语法:
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git remote -v
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git remote add git-demo https://github.com/wuyp315/git-demo.git
Administrator@DESKTOP-MDUS2KF MINGW64 /d/Git-Space/git-demo (master)
$ git remote -v
git-demo https://github.com/wuyp315/git-demo.git (fetch)
git-demo https://github.com/wuyp315/git-demo.git (push)
6.2.2 推送本地分支到远程仓库
基本语法:
git push 别名 分支
$ git push git-demo master
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://github.com': wuyp315
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (13/13), 1022 bytes | 78.00 KiB/s, done.
Total 13 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/wuyp315/git-demo.git
* [new branch] master -> master
注意:登陆时密码需要填写生成的token
6.2.3 拉取远程仓库到本地
基本语法:
git pull 别名 分支
$ git pull git-demo master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/wuyp315/git-demo
* branch master -> FETCH_HEAD
22c139d..ccde45e master -> git-demo/master
Updating 22c139d..ccde45e
Fast-forward
hello.txt | 1 +
1 file changed, 1 insertion(+)
6.2.4 克隆远程仓库到本地
基本语法:
git clone 远程地址
$ git clone https://github.com/atguiguyueyue/git-demo.git
Cloning into 'git-demo'...
remote: Enumerating objects: 41, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 41 (delta 12), reused 10 (delta 10), pack-reused 28
Unpacking objects: 100% (41/41), done.
$ git remote -v
origin https://github.com/atguiguyueyue/git-demo.git (fetch)
origin https://github.com/atguiguyueyue/git-demo.git (push)
clone会做以下操作:拉取代码、初始化本地库、创建别名
6.2.5 邀请他人加入团队
在仓库中添加成员,并将生成的链接发送给对方即可。
6.2.6 跨团队协作
修改后点击create pull request
如果代码没有问题,可以点击 Merge pull reque合并代码。
第七章 IDEA集成Git
IDEA版本:2020.3
7.1 配置Git忽略
原因:与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE工具之间的差异。
配置方法:创建忽略规则文件 xxxx.ignore(前缀名随便起,建议是 git.ignore,建议也放在用户家目录下)
git.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
http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
在 .gitconfig文件中引用忽略配置文件
[core]
excludesfile = C:/Users/Administrator/git.ignore
7.2 定位Git程序
7.3 初始化本地库
选择要创建Git本地仓库的工程。
7.4 添加到暂存区、提交到本地库
7.5 切换版本
7.6 创建切换分支
选中Checkout branch后,创建成功后自动切换
切换分支:选中分支后,点击Checkout即可
7.7 合并分支(正常合并)
7.8 合并分支(冲突合并)
第八章 IDEA集成GitHub
8.1 添加GitHub账号
点击 + 进行添加,网页授权后即可添加成功。
8.2 push推送本地库到远程库
注意:push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push的操作是会被拒绝的。也就是说, 要想 push成功,一定要保证 本地 库的版本要比远程库的版本高! 因此一个成熟的程序员在动手改本地代码之前,一定会先检查下远程库跟本地代码的区别!如果本地的代码版本已经落后,切记要先 pull拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!