BoyChai's Blog - git https://blog.boychai.xyz/index.php/tag/git/ Git-版本控制工具 https://blog.boychai.xyz/index.php/archives/17/ 2022-06-04T15:17:00+00:00 概述Git是一个开源免费的分布式版本控制系统,可以快速高效的来管理项目代码。官网:https://git-scm.com/安装Windows[vplayer status="true"][Video url="https://www.bilibili.com/video/BV1Rb4y1C7z1" title="采用b站UP:Houor的视频" /][/vplayer]Linuxyum -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,如图之后当我们的代码已经提交完到本地库里了,我们可以通过命令"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的仓库之后,去对方的仓库里面点击pull requests创建一个之后会出现一个版本比较的一个东西,让你选择版本进行对比,第一个选择就是他的仓库,第二个就是自己fork的仓库,选择好之后会出现修改的内容对比,然后进行创建,创建之后对方会受到一个请求,当对方同意的时候代码就会自动合并到对方仓库里。