🔥这些git技巧,你都会了吗?

1,761 阅读7分钟

这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

大家好,我叫小杜杜,在项目管理上,我们会将所有的代码放在一个版本控制的平台,一个是集中式版本控制,一个是分布式管理控制。两个模式的代表分别是 svngit,随着时间的推移,使用git的公司越来越多,已经逐渐取代svn了,所以今天就来讲讲常见的 git操作,如果你对git不太熟悉,或者有相关的问题,相信这篇文章一定能够帮助你,还请大家多多支持~

什么是git

git: 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

工作区域的三种状态

git的工作区域主要分为三种状态:已提交(committed)已暂存(staged)已修改(modified)

  • 已提交:在git上存在的代码
  • 已暂存: 代码提交到了本地,但未提交到git仓库
  • 已修改: 只对拉下的代码进行简单的修改,未提交过

如何绑定git(ssh方式)

在这里推荐使用ssh方式,我们在git上找到Setting在找到SSH and GPG keys,就是这样:

image.png

  • 首先你需要绑定自己的git账号
$ git config --global user.name "git用户名"
$ git config --global user.email "git邮箱"
  • 然后执行:
$ ssh -keygen -t rsa -C 邮箱 // 此时已经生成了key
  • 查找:
$ cd ~/.ssh
$ open id_rsa

此时会弹出key的文件,复制到git上就OK了

可视化工具

这里推荐一个可视化工具:GitHub Desktop

有的小伙伴可能觉得使用工具比较low,就喜欢敲命令,我在这里想说下,命令固然重要,但直接使用可视化的工具无疑减少了大量的时间,尤其是在合并冲突查看commit记录上非常方便,所以还是推荐使用这个工具(但至少你要熟悉相关的命令~~)

常见情况

首次提交文件到git

当我们想要将文件提交到git 上,需要先进行 git init,然后创建README.md(描述文件),然后 git remote 链接到对应的库,再 git push 即可

     git init
     git add REMADE.md
     git add .
     git commit -m 'xxx'
     git remote add origin git@github.com: xxx/xxx.git
     git push -u origin master

查看分支、切换分支、合并分支

  • 查看分支: 通过 git branch 即可,git仓库可通过git branch -a完成
  • 合并分支: 通过 git merge 分支名(需要合并的分支)即可
  • 切换分支: 分两步,第一步创建分支git branch test01 第二部切换分支git checkout test01
  • 切换分支的两步可以合成一步,用 git checkout -b test01 即可
  • 需要注意,此时只是在本地创建了分支,还需要把分支再 git push

分支提交错了,版本回退

情况一:我现在有两个分支,分别是 test01 和 test02, 我要在 test02 上开发,但此时的分支在test01,此时提交到了本地,并未提交到git仓库上该如何做?

情况二:还是上述情况,只不过这时已经 commit 上了,已经同步到git仓库了,然后发现提交错了,提交成了 test01,那么现在应该如何操?

情况三:还是上述情况,但我这次提交的就是 test01,并且把代码发到了测试环境,但这是又个产品跑过来,气喘吁吁的告诉你,先别发,我要再看看之前的,好家伙,要回推到了之前的版本,如何做?

针对上面的三种情况,实际上是两种,情况二和情况三是一种,都是已经提交到了 git 仓库,要将git仓库回退到之前的版本,而情况一则是提交到了本地,还未提交到git

我们这时就需要使用git reset这个命令

首先,你要知道回退有两种方式:

  • HEAD: 代表你要回退的前几步,如过你要回退上一步的操作,就是HEAD^1 (简写:HEAD^)
  • hash值:适合回退比较靠前的版本,通常可以使用 git log 查看,如:

image.png

接下来再介绍下 git reset 的三种模式

  • --mixed:不会删除本地代码,撤销 commit 操作,并且撤销 git add . 这个操作
  • --soft:与 --mixed 一样,但不能撤销 git add .(至于是否撤销git add . 个人觉得不重要)
  • --hard:撤销 commit 操作,并且删除所有本地改的代码,回退到制定的版本(一定要慎用,要不然估计你写的代码直接就没了,直接芭比Q~)

所以针对回退的建议使用 --soft--mixed, 顺便做个对比:

image.png

针对情况一:只需要使用 git reset --soft HEAD^就行

情况二和情况三:最大的问题是,我本地代码已经变了,但git仓库上的代码没变,并且还提示我再 git pull,那么解决办法也很简单,强制push下,所以在reset的基础上执行:git push -f origin 分支名 即可

做完了整个需求,但只上部分需求

情况:当做一个非常大的需求时,拆分多个小需求,分别 commit,但每个功能是按照顺序依次上的,比如说今天上第一个,明天上第二个,...,这时就需要将整个代码拆分,如何做?

正确的操作流程是,先把master的代码恢复到之前,然后在开发这个大需求的基础上,以次分离出代码,创建对应的分支

  • 首先,先通过log来拿到对应的hash值,假设:abc123
  • 然后创建一个新分支,并切换到该分支,假设 test01
  • 然后通过 git cherry-pick abc123,就OK了,但注意此时可能会有冲突

把分支删了怎么办

情况一:我不小心把我本地的分支(已在git上存在)删了怎么办? 情况二:我想删除git仓库的分支怎么办?

针对情况一:删除本地分支:git branch -D 分支名

删除了本地分支,但git上还存在,直接使用 git checkout 分支名(刚本地删除的分支名)此时会直接下载

针对情况二:删除远程分支:

  • git push origin --delete 分支名
  • git push origin :分支名(简写)

注意:删除完git仓库的分支后,本地实际上还是存在的,只不过这时需要重新提交

提交的commit太多了,最后不方便看到底改了啥

在开发中我们要常常切换分支,但切换分支就必须先把代码提交到本地,这样一个功能下来,本地这边就会有非常多的commit,同时也不好看具体改了哪些文件,要一个个找,我现在就想要不过提交多少个commit,最后合并成一个,该如何做?

熟悉的小伙伴知道,在GitLab有一个 Merge requests的功能,会将代码合并,没错就是实现这个效果。

  • 首先我们通过git log获取对应的哈希值,假设:abc123
  • 然后通过 git reset --soft abc123回到之前的版本
  • 之后在 git commit 一次就能合并了

这里需要注意,如果已经上传了git仓库,在切回的时候,强制上传一波,消除之前的commit就行了

代码冲突了,怎么搞?

开发的时候难免会代码冲突,这时我们该怎么办?

通过 git status 可以看到文件,也可以用更为简单的办法看到文件的状态, git status -s 之后解决就行了

当然这里建议直接使用: GitHub Desktop,这东西是真方便,一眼看出哪些文件有冲突,一键选择用那个分支的代码,方便你我他~

End

致此,我总结了下在工作中常用的操作,相信这篇文章足以在工作上游刃有余了,大家有什么常见的git操作可以在下方留言,共同进步,喜欢的点个赞👍🏻支持下吧(● ̄(エ) ̄●)