敞开生长之旅!这是我参与「日新计划 2 月更文应战」的第 2 天,点击检查活动详情


嗨!我是团子,咱们好久不见呀~


记住之前在网上学习git相关知识时,看到的文章大部分都是解说git的根本指令有哪些,用途是什么,但是自己真正上手运用git时,仍然无从下手。


所以今天就想从初始化一个git库房开端,一边教咱们实践git,一边解说git的指令有哪些!

什么是git

在实践git之前,咱们需求先了解一下什么是git。


请教了一下chatGPT,给出的答案如下图所示:

面向新手的Git实战教程

概括来说,Git是一种开源的分布式版别控制系统,能够盯梢文件的每一次修正,便利团队协作和软件开发。


git的作业区示意图如下所示,咱们能够先有个形象,咱们后边慢慢了解它~

面向新手的Git实战教程

装置及装备git

装置git

在了解了什么是git后,咱们需求先保证自己的电脑上装置了git的全局环境,这样才能运用git来管理咱们的代码。


装置git的途径有多种, 关于windows环境的用户,这里引荐去Git的官网:git-scm.com/downloads 下载自己的电脑系统对应的装置包,然后经过可视化界面进行装置。


Mac环境的用户引荐运用Homebrew进行装置,网上的装置教程有许多,咱们能够去搜搜看~


当装置结束后,在指令行中输入git –version,假如呈现了git的版别号,则说明装置成功啦~

面向新手的Git实战教程

装备git

完结了git的装置后,咱们还需求对git进行简略的装备才能进行正常的运用。


详细来说便是需求生成用户名、邮箱以及推拉代码需求的公钥和私钥


1.打开git bash窗口
2.装备git用户名

git config --global user.name "account name"

3.装备用户邮箱

git config --global user.email "account email"

4.生成公钥、秘钥(填自己的邮箱,履行后按几次enter直到结束)

ssh-keygen -t rsa -C "xxx@xx.com"

5.经过指令行或许文件夹找到 .ssh所在目录,拷贝公钥

// Mac
cd ~/.ssh (假如不在.ssh文件夹需求履行此步)
cat id_rsa.pub
// windows
默认在:C:\Users\xxx\.ssh\id_rsa.pub

6.将公钥增加到云端的代码保管平台,如:githubgiteegitlab等等,便于日后直接推拉代码。


至此就完结了git相关的装备!

git实战

接下来,咱们就以协同开发一个前端算法库房为例开端实战吧!

1.初始化代码库房

初始化代码库房有两种形式:


是在云端代码保管平台(本文以github为例)创立云端库房,然后在本地空文件夹下履行:

git clone 长途项目的ssh地址

然后完结云端的项目初始化以及本地项目与长途库房树立衔接。


是在云端代码保管平台创立了云端库房后,在本地一个空文件夹(项目文件夹,取名别用中文)下运用git init创立本地git库房,然后运用下述指令来与长途库房树立衔接。

git remote add origin 长途项目的ssh地址

github代码保管平台为例,假如咱们是项目的创立者,则需求在云端创立一个代码库房供项目开发成员协作开发。

面向新手的Git实战教程
面向新手的Git实战教程
在咱们点击Create repository按钮后,就会初始化一个空的云端库房了。


由于此刻的云库房里啥都没有,github就会出一些提示来协助长途库房和本地库房树立衔接:

面向新手的Git实战教程
依照图中的说法,本地库房和云端库房树立衔接有两种办法:


是本地空白项目文件夹下运用git init初始化本地库房,并增加README.md文件,然后顺次履行如下指令:

git add README.md // 增加项目说明文档至本地库房缓存
git commit -m 'first commit' // 运用commit将文档增加进本地库房
git branch -m master // 本地生成一个master分支,用于后续项目开发

然后履行如下指令和长途库房树立衔接:

git remote add origin 长途项目地址

最终运用git push指令将本地更改同步到云端。

git push -u origin master

这里的 -u 参数的含义是在进行推送代码到远端分支,且之后希望持续向该长途分支推送时,能够在推送指令中增加 -u 参数,简化之后的推送指令输入。
这样以后履行git push就相当于履行git push origin master

面向新手的Git实战教程

是本地项目已经是初始化后的git项目时,直接履行下面三条指令即可和云端树立起衔接:

git remote add origin 长途项目地址
git branch -m master 
git push -u origin master

与此一起,假如咱们仅仅项目的开发者,并不是创立者的话,只需求在有项目开发权限状况下履行下述指令拉取长途库房代码就行啦:

git clone git@github.com:dossweet/algorithm-practice.git

语法格式为:git clone (-b) (长途分支名) 项目地址括号里的 -b 长途分支名用于克隆云端指定分支的代码,不加时默认为长途主分支代码。

面向新手的Git实战教程

2.协作开发

在团队协作开发中,项目成员一般会依照功用(feature)在本地创立分支(branch)进行开发,并在功用开发结束后推送代码到云端库房,然后等候相关人员review代码,保证代码质量无误后merge进项目主分支,然后在云端和本地删去无用的分支(可选)。


由于本文创立的仅仅一个案例项目,因而项目结构比较简略。


首先履行git branch指令检查本地项目分支:

面向新手的Git实战教程

由于前面咱们只创立了一个master主分支,所以branch只要一个。


本地的master分支一般用作主分支来和长途主分支代码进行交互。因而咱们需求先在本地创立一个新分支来编写详细的功用代码。


checkout指令用于切换分支,加上-b参数表明切换的分支需求新建。

git checkout -b sort-algorithm

然后履行git branch就能够发现本地有两个分支了,并且当时处于sort-algorithm分支。

面向新手的Git实战教程

接下来,咱们在项目根目录下新建一个堆排序的js文件,并填充算法内容:
面向新手的Git实战教程

然后履行git status检查当时的库房状况:

git status

面向新手的Git实战教程

发现文件都是赤色,这表明咱们编写的代码还没有录入本地。


除此之外,还多出了 .idea/ 文件,这是webstorm编辑器自带的装备文件,运用vscode编辑器会有 .vscode文件也是同理。


这种装备文件一般是不需求上传到云端代码库房中的,因而咱们需求在项目文件夹下生成 .gitignore 文件,来把不需求协作的文件放进去。


这样以后就再不会在git指令行中呈现这个文件啦~

面向新手的Git实战教程

再次履行git status,发现 .idea/ 不见了,取而代之的是 .gitignore
面向新手的Git实战教程

然后履行git add . 操作把这两个文件放进本地的库房暂存区中:

git add .

git add 文件名操作会把文件增加进本地的库房暂存区,假如一次性想增加一切文件的话,能够直接用.来替代。

面向新手的Git实战教程

再次履行git status指令,就会发现文件变成了绿色,这表明文件已经到了本地git库房暂存区。


接着咱们履行git commit指令来把增加至本地暂存区的代码提交至本地项目库房中。 格式为:git commit -m “提交信息”

git commit -m "feat: 新增堆排序"

面向新手的Git实战教程

接着咱们再履行git status指令检查文件状况,就会发现本地没有无状况的文件了,这表明一切的文件都已进入了本地代码库房。
面向新手的Git实战教程

接着咱们需求把本地完结的功用提交到云端。


一般来说,在项目开发中,咱们需求在云端库房中新建一个和本地分支命名相同的长途分支,然后本地分支完结当时功用后,将代码推送到长途同名分支,然后由项目负责人review代码,确认无误后将代码兼并到远端主分支中。


因而咱们需求先在长途分支中创立一个同名的分支:

面向新手的Git实战教程

然后在本地履行git push <长途主机名> <本地分支名>:<长途分支名> 将本地当时分支的代码推送到云端分支中。当本地分支与要推送的云端分支名相一起,可省略长途分支名。


咱们履行下列代码:

git push origin sort-algorithm

面向新手的Git实战教程

然后云端库房对应分支就会同步更新推送上来的分支代码为最近版别,一起呈现是否pr(pull request)的提示:
面向新手的Git实战教程

功用开发者能够自行选择是否提pr(pull request),假如功用开发完结,就能够提pr啦!


此刻代码reviewer就会审查代码并给出定见。假如需求修正代码,就需求开发者本地修正后从头push;假如不需求修正,则reviewer能够merge当时pr到项目主分支。

面向新手的Git实战教程

当分支代码被merge后,本地和长途就能够选择删去sort-algorithm这个分支啦! 到此步,就完结了一次本地代码和长途代码的同步


然后在之后的每次新功用开发中,项目开发者需求先在本地履行git checkout <本地分支名> 切换到项目主分支master,履行git pull <长途主机名> <长途分支名> 获取云端库房最新版别的代码。

git checkout master
git pull origin master

面向新手的Git实战教程

然后履行git checkout -b <本地分支名> 创立一个本地新分支持续开发新功用。或许履行git checkout <本地分支名> 在已有的分支上持续开发新功用!


以上便是咱们项目开发中最常运用的一些根本指令啦!


汇总一下,大约包含如下一些指令:

git clone (-b) (长途分支名) 长途项目地址
git status
git branch
git branch -r //检查长途分支名
git branch -a //检查本地分支名+长途分支名
git branch -m <本地分支名> // 修正本地分支名
git branch -d <本地分支名> // 删去本地分支
git add <本地文件名>(悉数文件时用.替代)
git commit -m "提交说明"
git push <长途主机名> <长途分支名>
git push -f <长途主机名> <长途分支名> // 强制推送,往常不引荐运用
git checkout -b <新分支称号>
git checkout <本地已有分支称号>
git pull <长途主机名> <长途分支名>
git remote add <长途主机名> <长途项目地址>
git log // 检查日志

除此之外,在项目开发中,还有一些高频进阶指令咱们最好把握:

进阶指令

1.兼并操作

在多人协作开发过程中,兼并操作是咱们经常会遇到的一个场景。


关于兼并操作,常用的两个git指令是mergerebase。关于什么时候用merge,什么时候用rebase,经过实践和总结,我得出来的结论如下:


当咱们需求兼并自己分支的代码项目公共分支上时,引荐运用merge指令。


由于merge指令会保留完好的commit记载,便利开发者溯源。


持续拿咱们的模仿库房来说,假设有两个开发者A、B克隆了长途主分支C1版别的代码在本地进行独立开发。


其中开发者A在本地没有创立自己的分支,直接在master分支进步行了开发,新增了一个堆排序,并提交了代码到云端主分支。

面向新手的Git实战教程

那么此刻云端主分支的代码版别就变成了C2


此刻,开发者B根据云端的C1分支,在本地新建了一个自己的分支dev进行开发,一起也是新增了冒泡排序这个文件。


那么在开发者B想要兼并代码时,就需求借助merge操作了。


并且假如开发者B想直接merge代码到项目主分支的话,git会报错提示:当时主分支版别 (C1) 落后于长途主分支版别 (C2) ,此刻咱们需求先履行git pull指令,再在本地主分支上履行merge分支dev的操作,然后再推送到云端。


与此一起,由于开发者A和开发者B修正了同一个文件,那么在merge代码时就或许存在抵触问题需求解决。

面向新手的Git实战教程

代码中的抵触示意( 需求根据项目状况进行修正 ):
面向新手的Git实战教程

兼并示意图如下所示:
面向新手的Git实战教程

当咱们需求根据长途公共分支在本地自己的分支进步行开发时,引荐运用rebase指令 。


由于这会使咱们的commit记载呈线性变化,十分明晰。


以模仿项目为例,咱们本地新建了一个分支叫array-algorithm。并想在项目公共分支的基础进步行代码编写。那么此刻就能够运用rebase操作,由于它会呈现出一条明晰的commit

面向新手的Git实战教程

其实rebase更准确的说法应该叫变基。


以咱们的模仿项目为例,假如想要将基分支 (master) 修正到待变为基分支的array-algorithm分支上时,


就需求先履行checkout切换分支到master分支,然后履行git rebase操作,这样就会以array-algorithm的最新一次提交作为新的基底,并把master分支公共父节点之后的版别追加到新基底之后~

git checkout master
git rebase array-algorithm

面向新手的Git实战教程

2.回滚操作

在运用git进行协作开发时,回滚也是十分高频的操作之一了。


所谓回滚操作,指的是commit的代码版别有不正确之处,想要回退代码。


关于回滚操作,git中有两条指令能够完成:resetrevert。比较于reset指令来说,更引荐运用revert指令。


reset指令


reset指令指的是让代码回滚到之前的某次commit版别,一起铲除这条commit之后的一切新commit。


假如开发者是在自己的分支上履行reset倒是可行,但是假如在公共分支上履行reset指令,则或许呈现冲掉其他开发者提交的commit的状况,因而reset指令需求慎重运用


回到咱们的项目中,本地切换分支到array-algorithm,小修正一下代码,然后从头履行commit:

面向新手的Git实战教程

然后运用git log检查本地提交记载。发现刚提交的commit为最新版别。此刻假如想回退到前次的commit版别时,能够运用 git reset –soft commit id 来进行回退:

  git reset --soft 86896b7a350

面向新手的Git实战教程

此刻,咱们再检查提交记载,就会发现版别回退到了前次提交的版别:
面向新手的Git实战教程


一般来说,运用reset指令回退了代码后,在推送到云端库房时会报错,提示本地代码版别落后于长途分支代码(由于回退了代码嘛),此刻咱们就需求运用 git push -f 来进行强制推送。
需求留意的是:强制推送会使本地代码直接覆盖长途分支代码,因而需求慎重运用!

git push -f <长途分支名>

revert指令


比较于reset直接回退到指定版别的commit来说, revert的原理是在当时提交后边,新增一次提交,然后到达抵消掉之前commit的版别导致的一切变化。它不会改变过去的历史,所以不会存在丢失代码的风险,因而是回滚的首选计划


回到咱们的项目中,在array-algorithm分支上,小修正一点代码。然后commit内容到本地库房:

面向新手的Git实战教程
接着履行一下git log检查一下本地提交记载:
面向新手的Git实战教程
发现最新的commit id为74a5219打头。假如此刻咱们想要回滚commit id为86896b7a的代码, 就能够运用git revert来完成:

  git revert 86896b7a

然后履行git log,就会发现新增了一次commit,内容中删去了咱们回滚的代码版别中的内容。

面向新手的Git实战教程
咱们需求区分的一点是: git reset后边跟的commit id是咱们想要回退到的commit版别,而git revert后边跟的commit id是开发者想要删去的commit版别。


总结

把握git中高频指令的运用方式能够大大提高协同开发的效率。市面上也有许多可视化的工具来协助咱们更好的上手git,比如:forksmartGit


本文主要解说了git中最根本最常用的一些指令。坦白说,git中的学问远不止这些,但个人主张咱们不要狂啃理论,在实践中用届时再去学或许会记住更牢固!


下一篇聊聊前端跨域~


参考文献:
[1]blog.csdn.net/lala_yanzi/…
[2]blog.csdn.net/awei970512/…
[3]blog.csdn.net/Lakers2015/…
[4]/post/684490…
[5]m.runoob.com/git/git-res…
[6]geek-docs.com/git/git-cmd…
[7]/post/697418…