对本地库的操作很少,我们学习1~6节即可,其他了解下。我们可以在idea中完成对本地库还有远程库的操作,可视化界面用起来更加舒适而且也不会混淆。
1. Git概述
-
Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
-
Git 易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具。
-
本地库已经实现了版本管理,可以切换分支到任意版本下,如果我们是个人开发者,并且不需要与其他人合作开发,那么在本地库进行版本管理可能已经足够了。但要注意本地库无法备份代码,也不能与其他开发者分享代码。如果你需要和其他人协同工作或者希望备份你的代码,那么最好将代码提交到远程仓库中进行版本管理。这样可以确保对代码进行备份并方便代码共享和合作开发。
2. 何为版本控制
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。我们就像甲方一样,如果改了七版后还想要回第一版,我们就可以使用Git快速方便地切换回第一版。
虽然我们也可以直接通过备份的方式保存各个版本,但是这种方式不仅占用我们的存储空间,当文件较大时还会占用我们的时间。而且各个版本备份只是Git的一个作用,在远程仓库中还可以通过高亮比较各个版本代码的不同。跟他人分享我们的代码、代码备份、与他人协助开发。
3. Git和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
➢ 局域网
GitLab
➢ 互联网
GitHub(外网)
Gitee 码云(国内网站)
4. Git安装
我安装在D:\ProgramSofts
,安装好后右键任意位置,在右键菜单里选择 Git Bash Here 即可打开 Git Bash 命令行终端。
在 Git Bash 终端里输入 git --version 查看 git 版本,如图所示,说明 Git 安装成功。
5. 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 版本号 | 版本穿梭 |
6. 设置用户签名
任意位置右键git Bash然后用以下命令设置用户前面:
git config --global user.name zane (回车)
git config --global user.email 2116514824@qq.com
在家目录下我们可以看到新创建了一个文件.gitconfig
双击打开查看文件内容或通过git Bash方式获取文件内容
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
注意: 这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。
7. 初始化本地库
在D:\Git-Space
创建一个文件夹git-demo1
,然后在文件夹下右键git Bash,输入以下命令:
基本语法
git init
案例实操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1
$ git init
Initialized empty Git repository in D:/Git-Space/git-demo1/.git/
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ ll -a
total 4
drwxr-xr-x 1 ASUS 197121 0 Jul 5 20:22 ./
drwxr-xr-x 1 ASUS 197121 0 Jul 5 20:22 ../
drwxr-xr-x 1 ASUS 197121 0 Jul 5 20:22 .git/ (.git 初始化的效果,生成 git)
结果查看
初始化后在本地库(我们刚刚所新建的文件夹)下有一个.git文件夹
8. 查看本地库状态
基本语法
git status
案例实操
首次查看(工作区没有任何文件)
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
新增文件(hello.txt)
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ vim hello.txt //编辑文件,若没有则新建一个,输入后进入编辑区,点击i进入插入状态,输入以下内容:hello git!hello lzk! 按esc退出插入模式后,按下yy表示对光标所在行进行复制,p表示粘贴,编辑完毕,按下:wq表示保存文件
--------------------
hello git!hello lzk!
hello git!hello lzk!
再次查看(检测到未追踪的文件)
- 未追踪文件表示该文件尚未被添加到暂存区
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ 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)
9. 添加暂存区
将工作区的文件添加到暂存区
基本语法
git add 文件名
案例实操
- 执行命令后并未提示该文件是否加入到暂存区中,所以我们需要查看一下状态,可以忽略警告。
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
-------------------
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt (检测到暂存区有新文件)
10. 提交本地库
将暂存区的文件提交到本地库
基本语法
git commit -m "日志信息" 文件名
案例实操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git commit -m "my first commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
[master (root-commit) 661f746] my first commit
1 file changed, 16 insertions(+)
create mode 100644 hello.txt
再次查看状态(没有文件需要提交)
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git status
On branch master
nothing to commit, working tree clean
11. 修改文件
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ vim hello.txt (修改文件,因为我们在本地库下执行编辑文件命令,一个本地库为一个文件夹,文件夹下没有同名同后缀的文件,所以修改hello.txt就是修改指定的那个)
-----修改为以下内容--------
hello git! hello lzk!
22222222222222222222
查看状态
检测到工作区有文件被修改
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ 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: hello.txt
no changes added to commit (use "git add" and/or "git commit -a") //此处命令提示我们可以使用git add方式将工作区中的文件添加到暂存区或者使用git commit -a方式提交
--------------------
不add直接commit
两种情况:
- 新建的文件尚未纳入版本控制体系:必须先add纳入版本控制体系后才可以commit
- 已纳入版本控制体系的文件被修改:可以不add直接commit,Git自动执行了add
将修改的文件再次添加暂存区
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
暂存区文件提交本地库
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git commit -m "my second commit" hello.txt
.....
12. 查看历史版本
基本语法
git reflog 查看版本信息
git log 查看版本详细信息
案例实操
- 新增一次,提交到本地库,为版本1,修改后提交到本地库,为版本2。此时指针HEAD总是指向最后一次修改。本地库只有一份文件,但是git能存在两个版本信息,很神奇。
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git reflog
5c02310 (HEAD -> master) HEAD@{0}: commit: my second commit
661f746 HEAD@{1}: commit (initial): my first commit
13. 版本穿梭
基本语法
git reset --hard 版本号
案例实操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
--首先查看当前的历史记录,可以看到当前是在 5c02310 这个版本
$ git reflog
5c02310 (HEAD -> master) HEAD@{0}: commit: my second commit
661f746 HEAD@{1}: commit (initial): my first commit
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
--切换到 661f746 版本,也就是我们第一次提交的版本
$ git reset --hard 661f746
HEAD is now at 661f746 my first commit
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
--切换完毕之后再查看历史记录,当前成功切换到了 661f746 版本
$ git reflog
661f746 (HEAD -> master) HEAD@{0}: reset: moving to 661f746
5c02310 HEAD@{1}: commit: my second commit
661f746 (HEAD -> master) HEAD@{2}: commit (initial): my first commit
14. Git分支操作
什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
master为开发主线,其余为分支,分支为主线分支进行功能开发,开发好后将功能合并到master上。
分支的好处
-
同时并行推进多个功能开发,提高开发效率。
-
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支的操作命令
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支
基本语法
git branch -v
案例实操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch -v
* master 661f746 my first commit (*代表当前所在的分区)
创建分支
基本语法
git branch 分支名
案例实操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch hot-fix (创建分支hot-fix)
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch -v
hot-fix 661f746 my first commit (刚创建的新的分支,并将主分支 master
的内容复制了一份给它)
* master 661f746 my first commit (当前分支仍为master)
修改分支
--在 maste 分支上做修改
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ vim hello.txt
--添加暂存区
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git add hello.txt
--提交本地库
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git commit -m "my third commit" hello.txt
[master 1eec0ee] my third commit
1 file changed, 1 insertion(+), 5 deletions(-)
--查看分支
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git branch -v
hot-fix 661f746 my first commit (hot-fix 分支并未做任何改变)
* master 1eec0ee my third commit (当前 master 分支已更新为最新一次提交
的版本)
所以修改一个分支上的内容并不会对另一个分支内容产生影响。
--查看分支内容
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ cat hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
lzk first commit master!
切换分支
基本语法
git checkout 分支名
案例实操
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
--发现当先分支已由 master 改为 hot-fix
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
--修改hot-fix分支为以下的内容
$ vim hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
lzk second commit hot-fix!
hello git!hello lzk!
--添加暂存区
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
$ git add hello.txt
--提交本地库
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
$ git commit -m "hot-fix commit" hello.txt
[hot-fix 5219180] hot-fix commit
1 file changed, 1 insertion(+), 5 deletions(-)
合并分支
基本语法
git merge 分支名
案例实操
在master分支上合并hot-fix分支
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (hot-fix)
$ git checkout master
Switched to branch 'master'
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt (产生冲突)
Automatic merge failed; fix conflicts and then commit the result.
--冲突产生的表现:后面状态为 MERGING
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
冲突产生的原因:
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。
由于master分支上的hello.txt文件(总12行)后两行与要合并的分支hot-fix的hello.txt文件(总12行)后两行的内容不同,所以Git不知道谁覆盖谁,所以合并失败!
查看状态
检测到文件有两处修改
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (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: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
解决冲突
编辑有冲突的文件,删除特殊符号,决定要使用的内容
提示:特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ cat hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
<<<<<<< HEAD
hello git!hello lzk!
lzk first commit master!
=======
lzk second commit hot-fix!
hello git!hello lzk!
>>>>>>> hot-fix
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ vim hello.txt
按上面的提示进行修改操作
--修改完再次查看
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ cat hello.txt
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
hello git!hello lzk!
lzk first commit master!
lzk second commit hot-fix!
--添加到暂存区
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ git add hello.txt
--执行提交
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master|MERGING)
$ git commit -m "merge hot-fix"
[master 651389c] merge hot-fix
--发现后面 MERGING 消失,变为正常
ASUS@LAPTOP-L64DOQDG MINGW64 /d/Git-Space/git-demo1 (master)
实际应用:将项目A同时安排给B,C去完成,每人负责不同的模块,项目A此时就是主线分支master,而B,C需要在其他分支上进行工作,完成各自模块后自身分支合并到主线分支上去。