一直想写来着,拖了很久,这篇博客记录一下git的学习心得
参考:廖雪峰git教程

一、什么是git

git是目前世界上最先进的分布式版本控制系统,没有之一!
简单来说git可以帮助我们控制版本修改,让我们参与大型项目的开发中。
image.png

二、git的工作流程


Workspace:工作区,平时存放项目代码的地方。
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
Remote:远程仓库 ,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。

具体工作流程如下:
1、在工作目录(Workspace)中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域(Index / Stage);
3、将暂存区域的文件提交到Git仓库。

三、git初始化

git下载

git官网:https://git-scm.com/
git下载教程:https://zhuanlan.zhihu.com/p/443527549

选择自己系统版本下载即可

git配置
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。

1
2
3
4
5
6
7
Config file location
--global use global config file
--system use system config file
--local use repository config file
--worktree use per-worktree config file
-f, --file <file> use given config file
--blob <blob-id> read config from given blob object

在提示中我们可以看到提供了global,system,local等多级的工作环境变量配置。使用 git config 时用 –system 选项,配置的是系统中所有用户,若使用 git config 时用 –global 选项,配置当前使用的用户。
用户信息配置

1
2
git config --global user.name "name"
git config --global user.email email@email

四、仓库创建和使用

基本操作
先创建一个文件夹,进入该文件夹输入git init进行初始化,会发现初始化后多了一个.git目录,说明初始化成功。
按照工作流程,该进行三步操作,修改,提交到暂存区,将暂存区文件提交到版本库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#修改并提交到暂存区
(base) PS C:\Users\95734\Desktop\gittest> git add .\text1.txt
(base) PS C:\Users\95734\Desktop\gittest> git status
On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: text1.txt

(base) PS C:\Users\95734\Desktop\gittest> git commit -m "wrote a new file"
#提交到版本库
(base) PS C:\Users\95734\Desktop\gittest> git commit -m "wrote a new file"
[master (root-commit) b8a15e1] wrote a new file
1 file changed, 2 insertions(+)
create mode 100644 text1.txt
(base) PS C:\Users\95734\Desktop\gittest> git status
On branch master
nothing to commit, working tree clean

版本回退
当我们发现自己的修改发生了错误,需要修改,这个时候就需要引出一种版本回退机制,来帮助我们控制版本修改。不得不先提到一个东西head
这要从git的分支说起,git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。在 git 中,它是一个指向你正在工作中的本地分支的指针,可以将 HEAD 想象为当前分支的别名。

现在我们进行如下操作,在文件夹中新建一个text2文件,并提交到版本库并通过git reset –hard <…>命令进行版本回退

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(base) PS C:\Users\95734\Desktop\gittest> git add .\text2.txt
(base) PS C:\Users\95734\Desktop\gittest> git commit -m "add another file"
[master f9ccede] add another file
1 file changed, 1 insertion(+)
create mode 100644 text2.txt
(base) PS C:\Users\95734\Desktop\gittest> git log --pretty=oneline
f9ccedee1ad66749b11331650bcf61cdceab3e95 (HEAD -> master) add another file
b8a15e1e0b045c4dbf23e66b382868178e8bfbe5 wrote a new file
(base) PS C:\Users\95734\Desktop\gittest> git reset --hard b8a15
HEAD is now at b8a15e1 wrote a new file
(base) PS C:\Users\95734\Desktop\gittest> git log --pretty=oneline
b8a15e1e0b045c4dbf23e66b382868178e8bfbe5 (HEAD -> master) wrote a new file
(base) PS C:\Users\95734\Desktop\gittest> git reflog
b8a15e1 (HEAD -> master) HEAD@{0}: reset: moving to b8a15
f9ccede HEAD@{1}: commit: add another file
b8a15e1 (HEAD -> master) HEAD@{2}: commit (initial): wrote a new file
(base) PS C:\Users\95734\Desktop\gittest> git reset --hard f9cced
HEAD is now at f9ccede add another file

五、远程仓库

(1)为什么需要

想象这样一个场景,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。显而易见,我们需要一台git服务器,但是有github、gitlab或者gitee的存在充当了这个角色。

GitHub

GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管,故名GitHub。
GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目Spring、MyBatis、React、Vue等。
2018年6月4日,微软宣布,通过75亿美元的股票交易收购代码托管平台GitHub。

Gitlab

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。
GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它使用Ruby语言写成。后来,一些部分用Go语言重写。截止2018年5月,该公司约有290名团队成员,以及2000多名开源贡献者。GitLab被IBM,Sony,JülichResearchCenter,NASA,Alibaba,Invincea,O’ReillyMedia,Leibniz-Rechenzentrum(LRZ),CERN,SpaceX等组织使用。

GitHub与GitLab的区别
GitHub是一个基于Git实现的在线代码仓库,是目前全球最大的代码托管平台,可以帮助程序员之间互相交流和学习。
GitLab是一个基于Git实现的在线代码仓库软件,你可以用GitLab自己搭建一个类似于GitHub一样的仓库,但是GitLab有完善的管理界面和权限控制,一般用于在企业、学校等内部网络搭建Git私服。

(2)远程仓库连接和使用

以Github为例,需要先将公钥等进行设置,再新建仓库并与本地进行连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(base) PS C:\Users\95734\Desktop\gittest> git remote add origin https://github.com/xichengchangjinglu/gittest.git
(base) PS C:\Users\95734\Desktop\gittest> git branch -M main
(base) PS C:\Users\95734\Desktop\gittest> git push -u origin main
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 510 bytes | 510.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/xichengchangjinglu/gittest.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

#查看远程仓库信息
(base) PS C:\Users\95734\Desktop\gittest> git remote -v
origin https://github.com/xichengchangjinglu/gittest.git (fetch)
origin https://github.com/xichengchangjinglu/gittest.git (push)

六、分支管理

(1)为什么要有分支管理

git所有分支之间彼此互不干扰,各自完成各自的工作和内容。可以在分支使用完后合并到总分支上,安全、便捷、不影响其他分支工作。
假设这样的场景,当我们进行大型项目多人协作时,我们就可以使用多个分支,在自己修改的过程中也不会影响他人的工作。

(2)创建合并分支

创建一个新的dev分支,并在该分支下新建一个text4文件,再返回main分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(base) PS C:\Users\95734\Desktop\gittest> git checkout -b dev
Switched to a new branch 'dev'
(base) PS C:\Users\95734\Desktop\gittest> git branch
* dev
main
(base) PS C:\Users\95734\Desktop\gittest> git add .\text4.txt
(base) PS C:\Users\95734\Desktop\gittest> git commit -m "dev test"
[dev e65406f] dev test
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 text4.txt
(base) PS C:\Users\95734\Desktop\gittest> git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
(base) PS C:\Users\95734\Desktop\gittest> dir

Directory: C:\Users\95734\Desktop\gittest

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2022/10/11 15:52 33 text1.txt
-a--- 2022/10/11 16:14 15 text2.txt
-a--- 2022/10/11 16:48 19 text3.txt

要知道git中对版本的控制始终是对head指针的移动,所以可以很快速的进行修改。当我们想要合并分支其实就是发生了如下的过程。
创建新的分支dev

在新分支dev上进行修改

合并分支

删除分支

1
2
3
4
#合并分支
git merge dev
#删除分支
git branch -d dev

(3)解决冲突

当我们在两个分支上修改同一个文件时,经常会发生冲突,现在在main和dev分支上同时修改text1文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(base) PS C:\Users\95734\Desktop\gittest> git add .\text1.txt
(base) PS C:\Users\95734\Desktop\gittest> git commit -m "change the text1 on main"
[main 7ad011f] change the text1 on main
1 file changed, 2 insertions(+), 1 deletion(-)
(base) PS C:\Users\95734\Desktop\gittest> git checkout dev
Switched to branch 'dev'
(base) PS C:\Users\95734\Desktop\gittest> git add .\text1.txt
(base) PS C:\Users\95734\Desktop\gittest> git commit -m "change the text2 on dev"
[dev 880c3c6] change the text2 on dev
1 file changed, 2 insertions(+), 1 deletion(-)
(base) PS C:\Users\95734\Desktop\gittest> git checkout main
Switched to branch 'main'
Your branch is ahead of 'origin/main' by 3 commits.
(use "git push" to publish your local commits)
(base) PS C:\Users\95734\Desktop\gittest> git merge dev
Auto-merging text1.txt
CONFLICT (content): Merge conflict in text1.txt
Automatic merge failed; fix conflicts and then commit the result.
(base) PS C:\Users\95734\Desktop\gittest> git status
On branch main
Your branch is ahead of 'origin/main' by 3 commits.
(use "git push" to publish your local commits)

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: text1.txt

no changes added to commit (use "git add" and/or "git commit -a")

需要解决冲突再进行合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(base) PS C:\Users\95734\Desktop\gittest> git add .\text1.txt
(base) PS C:\Users\95734\Desktop\gittest> git commit -m "change again"
[main 45e7316] change again
(base) PS C:\Users\95734\Desktop\gittest> git checkout main
Already on 'main'
Your branch is ahead of 'origin/main' by 5 commits.
(use "git push" to publish your local commits)
(base) PS C:\Users\95734\Desktop\gittest> git merge dev
Already up to date.
(base) PS C:\Users\95734\Desktop\gittest> git status
On branch main
Your branch is ahead of 'origin/main' by 5 commits.
(use "git push" to publish your local commits)

nothing to commit, working tree clean
(base) PS C:\Users\95734\Desktop\gittest> git log --graph --pretty=oneline --abbrev-commit
* 45e7316 (HEAD -> main) change again
|\
| * 880c3c6 (dev) change the text2 on dev
* | 7ad011f change the text1 on main
|/
* 77f5bda change the text1
* e65406f dev test
* c5bbf4e (origin/main) add the third file
* f9ccede add another file
* b8a15e1 wrote a new file