前言:写本文是希望对 git 做一个完整讲述,大家知道常用的命令使用没问题,不常用的老是需要搜索比对确认下才可以操作,毕竟代码这么重要,因此这里做个完整记录。
Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
Git 区域理解
-
远程仓库区
:也就是我们代码最终提交的归宿,没啥好说的。 -
远端分支本地副本
:这个其实主要储存了远程仓库各分支数据在本地的一个副本,你可以打开你 Git 项目下的 .git 文件,里面有个 refs/remotes,这里就主要存的就是远程仓库的分支信息,一般你执行 push 或者 pull、fetch 都会往这里进行更新。 -
本地分支
:这里就是我们经常会打交道的区域,你在执行 commit 之后,本质上就是提交到了这个区域,你可以查看你的 .git 目录下的 refs/heads 目录,里面存的就是我们本地的分支代码信息。 -
暂存区
:这个区域就是我们每次执行 git add 之后会存到的区域,用来与本地仓库之间做一个缓存,同时也是 Git 底层设计上来说也算是比较重要的一个区域,它能帮助 Git 在做 diff 的时候提高查找性能。 -
工作区
:这个一般就是我们写代码的地方,比如你的 vscode 打开的项目,你可以进行代码编辑的地方。
Git 工作中简单工作流程
- 来了一个新需求,我们会从
git checkout
一个新的 feature 分支出来进行开发。 - 开发完某个功能点,我们会执行
git add
将代码提交到暂存区。 - 执行
git commit
将代码提交到本地仓库 - 执行
git pull
将代码更新到本地仓库 - 执行
git push
将代码提交到远端分支 - 当我们开发完所有需求之后,可能会设立一个专门的测试分支比如名叫 dev 的分支,那么我们就把代码合并到这个测试分支上,在该测试分支出个 tag 部署测试环境进行测试。
- 测试完毕之后,在测试分支checkout个上线分支(这个时候,保证包含master 线上代码,可以提前pull下master 分支代码,有新代码就merge 合并)
- 在上线分支出tag 并走发版流程
以上流程大致概括了一般常规的 Git flow 流程,不同的公司可能会设计自己的规范,这里就不过多指示了。
命令概览
-
git init
-
git remote
-
git clone
-
git branch
-
git checkout
-
git add
-
git commit
-
git commit --amend
修改最后一次提交 -
git pull
-
git push
-
git fetch
-
git merge
-
git tag
-
git stash
命令解析
git init
除了我们从远端建仓库,有的时候我们自己本地也是可以自己初始化一个 Git 仓库来操作的,这个时候我们就直接使用 git init 就能轻松为当前目录创建一个 git 仓库,也就能开始对当前目录的改动纳入版本管理库了。
不过本地 init 的仓库没法和远端进行交互,所以我们还是需要去 github/gitlab 创建一个远端仓库,然后关联一下,也就是 git remote
命令了。
git remote
用于和远程仓库进行关系绑定处理等等操作。
git remote add
: 添加一个远程版本库关联git remote rm
: 删除某个远程版本库关联
比如我们本地有个初始化好的仓库,同时还有一个创建好的远程空仓库,那么我们就可以执行一下操作让他们关联起来:
-
git remote add origin xxx.git
先添加到本地仓库 -
git push -u origin master
:表示把当前仓库的 master 分支和远端仓库的 master 分支关联起来,后面我们执行 push 或者 pull 都可以非常方便的进行操作了。
git clone
最基础也是最常用的用法莫过于直接使用
git clone xxx.git
这样就能轻松把一个仓库代码拉到本地了,但仅仅知道这一点似乎还不太够。一般我们直接 clone 下来不带参数的话,它会默认停留在 master 分支,有的时候我们依旧需要一些其他诉求,比如怎么拉到本地之后自动切到指定分支呢?
git clone xxx.git -b branch1
有了仓库之后,我们总不能一直在 master 分支搞事吧,一般是不是都需要开个新分支改代码,再最后完事了再合到 master,那就需要用到下面介绍 git branch 命令了,不过呢,在讲到具体的分支操作之前呢,笔者还是要先补一下有关于本地仓库的初始化的流程。
git branch
在拿到一个项目之后,你首先还是应该看一下当前仓库现在有哪些分支,不要待会创建新分支发现名字重复之类的问题,那这个时候我们就可以使用 git branch
来查看一下相关的分支了。
git branch
:查看本地所有分支信息git branch -r
:查看远程仓库所有分支git branch -a
:查看本地和远程仓库所有分支git branch -d xxx
:删除本地分支, 会在删除前检查merge状态(其与上游分支或者与head)。git branch -D xxx
:删除本地分支xxx,是git branch --delete --force的简写git push origin --delete xxx
:删除远程分支以及追踪分支
一般来说如果分支太多的话,还是建议使用可视化工具来查
如果我们想以当前分支为基准,创建一个新的分支并切换过去,可以使用如下命令。
- 创建并切换到指定新分支:
git checkout -b branch1
(branch1为远程分支名) - 切换到指定分支:
git checkout branch1
(branch1为远程分支名)
git add
我们在某个分支更改了代码之后,想要把它提交一下,那么你第一步要做的就是,执行 git add
git add [file1] [file2]
: 添加一个或多个文件到暂存区
一般我们平时在使用的时候,用的比较多的应该还是:
git add .
:暂存所有(新的,修改的,已删除的)文件, git 2.X 版本以上git add -A
:暂存所有(新的,修改的,已删除的)文件, git 2.X 版本以上 当然 不同的git版本git add .
有点区别。
# git add .与git add -A的区别(版本不同时候的区别)
git commit
文件添加到暂存区之后,我们就可以执行下一步操作了。
-
git commit [file1] ... -m [message]
:将暂存区的内容提交到本地 git 版本仓库中- -m 表示的是当前提交的信息
- -a 对于已经被纳入 git 管理的文件(该文件你之前提交过 commit),那么这个命令就相当于帮你执行了上述
git add -A
,你就不用再 add 一下了;对于未被 git 管理过的(也就是新增的文件),那么还是需要你先执行一下git add -A
,才能正确被 commit 到本地 git 库。
通常情况下,我们用的比较多得应该是 git commit -m 'feat: do something'
,设置当前提交的信息。当然,如果你没有强诉求需要 git add
和 git commit
一定要分开,那你大可选择 git commit -am
,方便又快捷。
git commit --amend
修改最后一次提交
方式一:直接输入命令:git commit --amend
,会进入对最后一次提交信息编辑的vim编辑器界面(普通模式下,按i
进入编辑模式,编辑模式下按esc
退出到普通模式,普通模式下按:
进入命令模式,输入wq
即可保存修改并退出vim编辑器)
方式二:如果提交信息简单也可以直接通过如下命令行完成:
git commit --amend -m 'new commit message'
git pull
通常情况下,如果当前分支已经和远端分支建立了联系,那么我们想要合并一下远端分支,只需要执行 git pull
就好了,不用带其他参数,但如果和 git push 时产生了冲突,还没有建立联系的时候,我们就需要指定需要拉取哪个分支的代码下来进行合并了。
- 拉取指定远端分支合并到本地当前分支:
git pull origin branch1
(branch1为远程分支名)
这里的 origin 是我们对远端仓库的命名,想改也是可以的,不过一般都是用的 origin。
回到上面提到的冲突问题,我们可以直接使用 git pull 然后指定合并当前本地分支想要建立联系的远程分支,然后本地解决一下冲突,然后提交一下改动,再执行 git push --set-upstream origin branch1
命令就大功告成了。
git push
接下来我们想要把刚创建好得分支推送到远端,一般来说我们可能会需要用到 git push,但我们这是个新分支,根本没和远端仓库建立任何联系,那么我们就需要加点参数,让他们关联上:
- 推送分支并建立关联关系:
git push --set-upstream origin branch1
完事之后我们可以再去远程仓库看一眼就会发现我们创建的新分支已经推上去了。接下来可能会有小伙伴要问了,那如果远端仓库已经有了这个分支名咋整?
这里就分两种:
-
一种就是你本地的代码和远端代码没有冲突的情况下,并且你本地有新增提交,那么你可以仍然执行上述命令,这样就会直接将当前本地分支合远程分支关联上,同时把你的改动提交上去。
-
另一种就是本地分支和远端分支存在冲突,这个时候你执行上述命令就会出现提示冲突,那么接下来就需要你先把远端当前分支的代码拉下来,解决一下冲突了,就需要用到 git pull 命令了。
所以在push之前先执行pull
git merge
合并指定分支代码到当前分支。一般来说,我们用的比较多的场景可能是,远端仓库 master 分支有变更了,同时这个时候我们准备提 MR 了,那么就需要先合一下 master 的代码,有冲突就解决下冲突,那这个时候我们可以做以下操作:
- 切到 master 分支,git pull 拉一下最新代码
- 切回开发分支,执行 git merge master 合并一下 master 代码
同理,上面介绍的 git merge origin/xxx 也是一样的用法。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情