嗨!我是团子,大家好久不见呀~
记得之前在网上学习git相关知识时,看到的文章大部分都是讲解git的基本命令有哪些,用处是什么,但是自己真正上手使用git时,仍然无从下手。
所以今天就想从初始化一个git仓库开始,一边教大家实践git,一边讲解git的命令有哪些!
在实践git之前,我们需要先理解一下什么是git。
请教了一下chatGPT,给出的答案如下图所示:
概括来说,Git是一种开源的分布式版本控制系统,可以跟踪文件的每一次修改,方便团队协作和软件开发。
git的工作区示意图如下所示,大家可以先有个印象,我们后面慢慢理解它~
在了解了什么是git后,我们需要先确保自己的电脑上安装了git的全局环境,这样才能使用git来管理我们的代码。
安装git的途径有多种, 对于windows环境的用户,这里推荐去Git的官网:
https://git-scm.com/downloads下载自己的电脑系统对应的安装包,然后通过可视化界面进行安装。
Mac环境的用户推荐使用Homebrew进行安装,网上的安装教程有很多,大家可以去搜搜看~
当安装完毕后,在命令行中输入git --version,如果出现了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 "[email protected]"
5.通过命令行或者文件夹找到 .ssh所在目录,拷贝公钥
// Mac
cd ~/.ssh (如果不在.ssh文件夹需要执行此步)
cat id_rsa.pub
// windows
默认在:C:\Users\xxx\.ssh\id_rsa.pub
6.将公钥添加到云端的代码托管平台,如:github、gitee、gitlab等等,便于日后直接推拉代码。
至此就完成了git相关的配置!
接下来,我们就以协同开发一个前端算法仓库为例开始实战吧!
初始化代码仓库有两种形式:
一
是在云端代码托管平台(本文以github为例)创建云端仓库,然后在本地空文件夹下执行:
git clone 远程项目的ssh地址
从而完成云端的项目初始化以及本地项目与远程仓库建立连接。
二
是在云端代码托管平台创建了云端仓库后,在本地一个空文件夹(项目文件夹,取名别用中文)下使用git init创建本地git仓库,然后使用下述命令来与远程仓库建立连接。
git remote add origin 远程项目的ssh地址
以github代码托管平台为例,如果我们是项目的创建者,则需要在云端创建一个代码仓库供项目开发成员协作开发。
在我们点击Create repository按钮后,就会初始化一个空的云端仓库了。
因为此时的云仓库里啥都没有,github就会出一些提示来帮助远程仓库和本地仓库建立连接:
按照图中的说法,本地仓库和云端仓库建立连接有两种办法:
一
是本地空白项目文件夹下使用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 remote add origin 远程项目地址
git branch -m master
git push -u origin master
与此同时,如果我们只是项目的开发者,并不是创建者的话,只需要在有项目开发权限情况下执行下述命令拉取远程仓库代码就行啦:
git clone [email protected]:dossweet/algorithm-practice.git
语法格式为:git clone (-b) (远程分支名) 项目地址。括号里的 -b 远程分支名用于克隆云端指定分支的代码,不加时默认为远程主分支代码。
在团队协作开发中,项目成员一般会按照功能(feature)在本地创建分支(branch)进行开发,并在功能开发完毕后推送代码到云端仓库,然后等待相关人员review代码,确保代码质量无误后merge进项目主分支,然后在云端和本地删除无用的分支(可选)。
因为本文创建的只是一个案例项目,因此项目结构比较简单。
首先执行git branch命令查看本地项目分支:
因为前面我们只创建了一个master主分支,所以branch只有一个。
本地的master分支一般用作主分支来和远程主分支代码进行交互。因此我们需要先在本地创建一个新分支来编写具体的功能代码。
checkout指令用于切换分支,加上-b参数表明切换的分支需要新建。
git checkout -b sort-algorithm
然后执行git branch就可以发现本地有两个分支了,而且当前处于sort-algorithm分支。
接下来,我们在项目根目录下新建一个堆排序的js文件,并填充算法内容:
然后执行git status查看当前的仓库状态:
git status
发现文件都是红色,这表明我们编写的代码还没有录入本地。
除此之外,还多出了 .idea/ 文件,这是webstorm编辑器自带的配置文件,使用vscode编辑器会有 .vscode文件也是同理。
这种配置文件一般是不需要上传到云端代码仓库中的,因此我们需要在项目文件夹下生成 .gitignore 文件,来把不需要协作的文件放进去。
再次执行git status,发现 .idea/ 不见了,取而代之的是 .gitignore
然后执行git add . 操作把这两个文件放进本地的仓库暂存区中:
git add .
git add 文件名操作会把文件添加进本地的仓库暂存区,如果一次性想添加所有文件的话,可以直接用.来代替。
再次执行git status命令,就会发现文件变成了绿色,这表明文件已经到了本地git仓库暂存区。
接着我们执行git commit命令来把添加至本地暂存区的代码提交至本地项目仓库中。格式为:git commit -m “提交信息”
git commit -m "feat: 新增堆排序"
接着我们再执行git status命令查看文件状态,就会发现本地没有无状态的文件了,这表明所有的文件都已进入了本地代码仓库。
接着我们需要把本地完成的功能提交到云端。
通常来说,在项目开发中,我们需要在云端仓库中新建一个和本地分支命名相同的远程分支,然后本地分支完成当前功能后,将代码推送到远程同名分支,然后由项目负责人review代码,确认无误后将代码合并到远端主分支中。
因此我们需要先在远程分支中创建一个同名的分支:
然后在本地执行git push <远程主机名> <本地分支名>:<远程分支名> 将本地当前分支的代码推送到云端分支中。当本地分支与要推送的云端分支名相同时,可省略远程分支名。
我们执行下列代码:
git push origin sort-algorithm
然后云端仓库对应分支就会同步更新推送上来的分支代码为最近版本,同时出现是否pr(pull request)的提醒:
功能开发者可以自行选择是否提pr(pull request),如果功能开发完成,就可以提pr啦!
此时代码reviewer就会审查代码并给出意见。如果需要修改代码,就需要开发者本地修改后重新push;如果不需要修改,则reviewer可以merge当前pr到项目主分支。
当分支代码被merge后,本地和远程就可以选择删除sort-algorithm这个分支啦!
到此步,就完成了一次本地代码和远程代码的同步。
然后在之后的每次新功能开发中,项目开发者需要先在本地执行git checkout <本地分支名> 切换到项目主分支master,执行git pull <远程主机名> <远程分支名> 获取云端仓库最新版本的代码。
git checkout master
git pull origin master
然后执行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 // 查看日志
除此之外,在项目开发中,还有一些高频进阶指令我们最好掌握:
在多人协作开发过程中,合并操作是我们经常会遇到的一个场景。
关于合并操作,常用的两个git命令是merge和rebase。关于什么时候用merge,什么时候用rebase,通过实践和总结,我得出来的结论如下:
● 当我们需要合并自己分支的代码项目公共分支上时,推荐使用merge指令。
因为merge指令会保留完整的commit记录,方便开发者溯源。
继续拿我们的模拟仓库来说,假设有两个开发者A、B克隆了远程主分支C1版本的代码在本地进行独立开发。
其中开发者A在本地没有创建自己的分支,直接在master分支上进行了开发,新增了一个堆排序,并提交了代码到云端主分支。
那么此时云端主分支的代码版本就变成了C2。
此时,开发者B基于云端的C1分支,在本地新建了一个自己的分支dev进行开发,同时也是新增了冒泡排序这个文件。
那么在开发者B想要合并代码时,就需要借助merge操作了。
并且如果开发者B想直接merge代码到项目主分支的话,git会报错提示:当前主分支版本 (C1) 落后于远程主分支版本 (C2) ,此时我们需要先执行git pull命令,再在本地主分支上执行merge分支dev的操作,然后再推送到云端。
与此同时,因为开发者A和开发者B修改了同一个文件,那么在merge代码时就可能存在冲突问题需要解决。
代码中的冲突示意( 需要根据项目情况进行修改 ):
合并示意图如下所示:
● 当我们需要基于远程公共分支在本地自己的分支上进行开发时,推荐使用rebase指令 。
因为这会使我们的commit记录呈线性变化,非常清晰。
以模拟项目为例,我们本地新建了一个分支叫array-algorithm。并想在项目公共分支的基础上进行代码编写。那么此时就可以使用rebase操作,因为它会呈现出一条清晰的commit。
其实rebase更准确的说法应该叫变基。
以我们的模拟项目为例,如果想要将基分支 (master) 修改到待变为基分支的array-algorithm分支上时,
就需要先执行checkout切换分支到master分支,然后执行git rebase操作,这样就会以array-algorithm的最新一次提交作为新的基底,并把master分支公共父节点之后的版本追加到新基底之后~
git checkout master
git rebase array-algorithm
在使用git进行协作开发时,回滚也是非常高频的操作之一了。
所谓回滚操作,指的是commit的代码版本有不正确之处,想要回退代码。
关于回滚操作,git中有两条指令可以实现:reset和revert。相比于reset指令来说,更推荐使用revert指令。
● reset指令
reset指令指的是让代码回滚到之前的某次commit版本,同时清除这条commit之后的所有新commit。
如果开发者是在自己的分支上执行reset倒是可行,但是如果在公共分支上执行reset指令,则可能出现冲掉其他开发者提交的commit的情况,因此reset指令需要慎重使用。
回到我们的项目中,本地切换分支到array-algorithm,小修改一下代码,然后重新执行commit:
然后使用git log查看本地提交记录。发现刚提交的commit为最新版本。此时如果想回退到上次的commit版本时,可以使用 git reset --soft commit id 来进行回退:
git reset --soft 86896b7a350
此时,我们再查看提交记录,就会发现版本回退到了上次提交的版本:
一般来说,使用reset指令回退了代码后,在推送到云端仓库时会报错,提示本地代码版本落后于远程分支代码(因为回退了代码嘛),此时我们就需要使用 git push -f 来进行强制推送。
需要注意的是:强制推送会使本地代码直接覆盖远程分支代码,因此需要谨慎使用!
git push -f <远程分支名>
● revert指令
相比于reset直接回退到指定版本的commit来说, revert的原理是在当前提交后面,新增一次提交,从而达到抵消掉之前commit的版本导致的所有变化。它不会改变过去的历史,所以不会存在丢失代码的风险,因此是回滚的首选方案。
回到我们的项目中,在array-algorithm分支上,小修改一点代码。然后commit内容到本地仓库:
接着执行一下git log查看一下本地提交记录:
发现最新的commit id为74a5219打头。如果此时我们想要回滚commit id为86896b7a的代码,
就可以使用git revert来实现:
git revert 86896b7a
然后执行git log,就会发现新增了一次commit,内容中删除了我们回滚的代码版本中的内容。
大家需要区分的一点是: git reset后面跟的commit id是我们想要回退到的commit版本,而git revert后面跟的commit id是开发者想要删去的commit版本。
掌握git中高频指令的使用方式可以大大提高协同开发的效率。市面上也有很多可视化的工具来帮助大家更好的上手git,比如:fork、smartGit…
本文主要讲解了git中最基本最常用的一些指令。坦白说,git中的学问远不止这些,但个人建议大家不要狂啃理论,在实践中用到时再去学可能会记得更牢固!
下一篇聊聊前端跨域~
参考文献:
[1]https://blog.csdn.net/lala_yanzi/article/details/124962662
[2]https://blog.csdn.net/awei970512/article/details/127029596
[3]https://blog.csdn.net/Lakers2015/article/details/111318801
[4]https://juejin.cn/post/6844903749631098893
[5]https://m.runoob.com/git/git-reset.html
[6]https://geek-docs.com/git/git-cmds/git-reset.html
[7]https://juejin.cn/post/6974184935804534815