BoyChai's Blog - 版本控制 2022-06-04T15:17:00+00:00 Typecho https://blog.boychai.xyz/index.php/feed/atom/tag/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/ <![CDATA[Git-版本控制工具]]> https://blog.boychai.xyz/index.php/archives/17/ 2022-06-04T15:17:00+00:00 2022-06-04T15:17:00+00:00 BoyChai https://blog.boychai.xyz 概述

Git是一个开源免费的分布式版本控制系统,可以快速高效的来管理项目代码。

官网:https://git-scm.com/

安装

Windows

[vplayer status="true"]
[Video url="https://www.bilibili.com/video/BV1Rb4y1C7z1" title="采用b站UP:Houor的视频" /]
[/vplayer]

Linux

yum -y install git

工作流程

流程图

在本地主机会分三个区域,分别为工作区、暂存区、本地库,如果需要多人协作可以上传到一个远程仓库里面提供他人管理代码。

区域作用
工作区写代码的过程都会在工作区内完成,写完之后需要上传到暂存区
暂存区代码写完之后需要放到暂存区,确定没有问题之后需要把版本信息和暂存区的内容上传到本地库
本地库全部的版本都在本地库里面
远程库远程仓库是整个团队中所有人都可以访问的地方。

代码管理

设置签名

签名就是上传到本地库,远程仓库的时候的身份。

$ git config --global user.name "BoyChai"
$ git config --global user.email "1972567225@qq.com"
$ git config --global --list

初始化仓库

默认本地是没有仓库的,这时候我们需要初始化一个仓库,进入到对应项目的目录执行命令"git init",例如

$ mkdir project
$ cd project/
$ git init
Initialized empty Git repository in /root/project/.git/

初始化好了之后会在本地创建一个".git"的目录,这个目录就是存放暂存区和本地库的地方。此时项目文件夹就是工作区。

提交暂存区

此时目录里创建一个文件可以通过命令"git add [file]"将文件提交到暂存区,例如

$ echo 111 > test01
$ git add test01

提交本地库

提交完暂存区之后可以通过命令"git commit -m "[版本信息]""提交到本地库里面,例如

$ git commit -m "test01"
[master (root-commit) 776b640] test01
 1 file changed, 1 insertion(+)
 create mode 100644 test01

状态

显示当前分支,并且查看在你上次提交之后是否有对文件进行再次修改。

git status 

记录

通过命令"git log"显示历史提交记录,例如

$ git log
commit 4240a74fc27134b79addead798a10d8d4808ec91
Author: BoyChai <1972567225@qq.com>
Date:   Sat Jun 4 09:40:10 2022 -0400

    test03

commit 93d1896fcc57d4b84733f70bffab8d68b56a2f0b
Author: BoyChai <1972567225@qq.com>
Date:   Sat Jun 4 09:40:02 2022 -0400

    test02

commit 776b640b6bf839f27a5ef099f33c11e66aa8f1da
Author: BoyChai <1972567225@qq.com>
Date:   Sat Jun 4 09:38:43 2022 -0400

    test01

也可以让他进行简易的输出提交记录

”git log --pretty=onelint“或“git log --oneline”

还可以使用命令“git reflog”来查看可引用的历史版本记录,他输出会带一个tag,输出内容如下

[root@gitlab project]# git reflog
4240a74 HEAD@{0}: commit: test03
93d1896 HEAD@{1}: commit: test02
776b640 HEAD@{2}: commit (initial): test01

回滚

可以让代码回到历史的某个版本

git reset --hard [版本ID]

版本的ID可以使用查看记录的方法获得

[root@gitlab project]# git reflog
4240a74 HEAD@{0}: commit: test03
93d1896 HEAD@{1}: commit: test02
776b640 HEAD@{2}: commit (initial): test01
[root@gitlab project]# git reset --hard 93d1896    //回滚到test02
HEAD is now at 93d1896 test02

分支管理

概述

如果涉及团队开发合作可以使用分支来分配工作,在写代码的时候,如果有多个功能需要去实现而且是一个团队进行编写,都在一个主分支上编写代码可能并不是很好管理,这个时候可以通过分支来管理,把每一个功能都单独创建一个分支让一个人去编写或者几个人去编写,当这个功能完善的时候就可以和主分支进行合并。

查看分支

使用命令"git branch -v"来查看,例如

$ git branch -v
* master 93d1896 test02

创建分支

使用命令"git branch [分支名称]"来创建,例如

$ git branch branch1
$ git branch -v
  branch1 93d1896 test02
* master  93d1896 test02

切换分支

使用命令"git checkout [分支名称]"来切换分支,例如

$ git checkout branch1
Switched to branch 'branch1'
$ git branch -v
* branch1 93d1896 test02
  master  93d1896 test02

合并分支

当分支的代码提交好了之后可以进行合并分支,合并分支需要将分支切换到master(主分支),然后使用命令"git merge [分支名称]"来合并分支,之后使用“commit”来提交,例如

$ git branch -v
* branch1 93d1896 test02
  master  93d1896 test02
$ echo aaa > branch1_file01
$ git add branch1_file01
$ git commit -m "branch1_分支提交"
[branch1 af08213] branch1_分支提交
 1 file changed, 1 insertion(+)
 create mode 100644 branch1_file01
$ git checkout master
Switched to branch 'master'
$ git branch -v
  branch1 af08213 branch1_分支提交
* master  93d1896 test02
[root@gitlab project]# echo bbb > master_file1
[root@gitlab project]# git add master_file1
[root@gitlab project]# git commit -m "master提交"
[master 731413b] master提交
 1 file changed, 1 insertion(+)
 create mode 100644 master_file1
[root@gitlab project]# git branch -v
  branch1 af08213 branch1_分支提交
* master  731413b master提交
[root@gitlab project]# git merge branch1 //merge之后会弹出一下内容,第一行是写合并备注的,类似于命令"it commit -m"的备注
----------------------------------------------------------------------------------
Merge branch 'branch1'

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
----------------------------------------------------------------------------------
//保存之后显示
Merge made by the 'recursive' strategy.
 branch1_file01 | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 branch1_file01
$ git commit
 # On branch master
nothing to commit, working directory clean
$ git branch -v
  branch1 af08213 branch1_分支提交
* master  6a764f1 Merge branch 'branch1'

上面这个是主分支和分支都改变代码的情况下进行合并,如果没有改变主分支的代码就进行合并则不会弹出merge之后的内容

分支代码冲突

当分支和主分支的代码产生冲突该,例如

$ git branch branch2
$ git checkout master
Switched to branch 'master'
$ cat > file.txt <<EOF
> 111
> 222
> 444
> EOF
$ cat file.txt
111
222
444
$ git add file.txt
$ git commit -m "master_提交"
[master d7e9855] master_提交
 1 file changed, 3 insertions(+)
 create mode 100644 file.txt
[root@gitlab project]# git checkout branch2
Switched to branch 'branch2'
$ cat > file.txt <<EOF
> 111
> 222
> 333
> 444
> EOF
$ cat file.txt
111
222
333
444
$ git add file.txt
$ git commit -m "branch2_提交"
[branch2 3bac7d1] branch2_提交
 1 file changed, 4 insertions(+)
 create mode 100644 file.txt

此时master和分支branch2提交的最新版本的file.txt文件是有冲突的,这个时候进行合并会出现一下问题

$ git checkout master
Switched to branch 'master'
[root@gitlab project]# git branch -v
  branch1 af08213 branch1_分支提交
  branch2 3bac7d1 branch2_提交
* master  d7e9855 master_提交
$ git merge branch2
Auto-merging file.txt
CONFLICT (add/add): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.

此时查看冲突文件会发现文件里的内容发生了改变

$ cat file.txt
111
222
<<<<<<< HEAD
=======
333
>>>>>>> branch2
444

文件的意思就是中间出现了333这一行,如果想要保留branch2分支的内容则就改成这样

$ cat file.txt
111
222
333
444

如果不想保留branch2分支的内容则就删除对应内容,例如

$ cat file.txt
111
222
444

上面两种保留方式选择一种之后,使用命令"git add [冲突文件]"来解决冲突,并使用命令"git commit"进行合并

$ cat file.txt
111
222
333
444
$ git add file.txt
$ git commit -m "master-branch2解决冲突"
[master 00721ab] master-branch2解决冲突
$ git branch -v
  branch1 af08213 branch1_分支提交
  branch2 3bac7d1 branch2_提交
* master  00721ab master-branch2解决冲突

远程仓库管理

创建远程仓库

远程仓库的类型有很多,Github,Gitee,Gitlab,Gogs等等,这里采用github作为示范,如图

创建仓库

创建完成

推送代码

推送代码到github之前还需要一个用户token,打开github的settings -> Developer settings -> Personal access tokens -> Generate new token,日期我选的7天权限根据自己情况自己勾选,之后店家Generate token,如图

创建token

token

之后当我们的代码已经提交完到本地库里了,我们可以通过命令"git push '仓库地址' '分支名称' "进行推送,推送过程中需要输入用户名和密码,这个密码实际上就是我们刚才创建的token,例如

$ git push https://github.com/BoyChai/Git_test.git master
Username for 'https://github.com': BoyChai
Password for 'https://BoyChai@github.com':
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (20/20), 1.53 KiB | 0 bytes/s, done.
Total 20 (delta 7), reused 0 (delta 0)
remote: Resolving deltas: 100% (7/7), done.
To https://github.com/BoyChai/Git_test.git
 * [new branch]      master -> master

克隆代码

当远程仓库发生改变想要同步到本地的时候可以使用命令"git pull '仓库地址' '分支名称' ",例如

$ git pull https://github.com/BoyChai/Git_test.git master
From https://github.com/BoyChai/Git_test
 * branch            master     -> FETCH_HEAD
Already up-to-date.

别名

每次去推送、克隆代码的时候都需要输入一段很长的仓库地址,并不是很方便,可以使用命令"git remote add '别名' '仓库地址' "来创建别名,例如

$ git remote add git_test https://github.com/BoyChai/Git_test.git
$ git remote -v 
git_test        https://github.com/BoyChai/Git_test.git (fetch)
git_test        https://github.com/BoyChai/Git_test.git (push)

之后相关代码仓库地址的位置都可以替换成别名来操作,例如

git push git_test master
git pull git_test master

团队协作

团队协作需要在远程仓库里添加团队内部的人,在Github上的具体流程为 打开对应的项目 -> Settings -> Collaborators -> Add people

添加协作

添加协作

点击Select a collaborator above之后会给一个链接,需要发给对方进行验证,通过之后就可以在此仓库进行协作了

跨团队协作

跨团队操作需要进行Fork操作,如图

fork点击fork之后会让你写一个仓库名称,之后这个仓库会以刚才的仓库名称变成你仓库里的一个项目,你可以自己任意更改提交克隆,当代码写好提交到自己fork的仓库之后,去对方的仓库里面点击pull requests

pull requestspull requests

创建一个之后会出现一个版本比较的一个东西,让你选择版本进行对比,第一个选择就是他的仓库,第二个就是自己fork的仓库,选择好之后会出现修改的内容对比,然后进行创建,创建之后对方会受到一个请求,当对方同意的时候代码就会自动合并到对方仓库里。

]]>