持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情 git 是一线研发人员都会使用到的一个版本管理工具,我在有了一定的使用经验后,对 git 的使用做了一些场景化的总结。
场景一:git 配置多用户
这个场景其实蛮常见的,比如我既使用我个人的 github 带薪学习,又有公司的 gitlab 作为业务项目,这时候就需要为这两个不同的平台(对应不同用户)进行 git 的配置。
当我们和远程仓库交互(push/pull)时,会遇到用户权限校验,有两种校验方式,其一是基于 https 的,这时候会要求输入远程仓库的用户名和密码进行验证,其二是使用 ssh 的方式,ssh 基于我们在客户端进行秘钥的生成和配置。
需要明确的一个问题是,一对秘钥(包含公钥和私钥)可以同时被多个不同的 git 平台使用(github、gitee、gitlab等),但是如果在一个平台上有多个用户账号,那么在该平台需要配置多对的秘钥。
配置
当然在这里我们还是使用两对不同的秘钥分别配置两个不同的平台(具体步骤命令可以参照 👇)
-
秘钥生成
- 使用
ssh-keygen生成秘钥,注意两对秘钥分别保存在不同的文件夹中加以区分。 - 复制公钥并粘贴在对应的平台公钥添加处。
- 使用
-
用户和秘钥配置
-
在 ~/.ssh/ 文件夹下创建配置文件
-
对文件进行配置, 下方为 config 的内容
# github email address # git 别名 Host github # User@HostName HostName github.com User git PreferredAuthentications publickey4 # 私钥存放地址 IdentityFile ~/.ssh/github_id_rsa # gitlab email address Host gitlab HostName gitlab.com User git PreferredAuthentications publickey IdentityFile ~/.ssh/gitlab_id_rsa -
添加新的私钥到 ssh-agent 缓存中(可选)
git config --list # 查看 git 配置
-
-
验证配置是否成功
用户切换
一个前置知识是,我们一般会对 git 有一个全局的用户配置,比如使用:
git config --global user.name "user_name"
git config --global user.email "user_name@example.com"
如果有多个用户,且当前项目中的用户和 global 中是不一致的,就需要进行切换,即设置本地的用户。
git config --local user.name "loacal_username"
git config --local user.email "local_user_email"
场景二:修改撤销
这个场景也是非常经典的操作了,下面的这个链接将情况区分的非常清晰了 👇
-
工作区撤销,可能有以下两种状态
- Untracked files
- Changes not staged for commit
-
暂存区撤销: git reset 命令可选参数有以下三种
-hard:撤销 commit,撤销 add,删除工作区改动代码-mixed:默认参数。撤销 commit,撤销 add,还原工作区改动代码-soft:撤销 commit,不撤销 add,还原工作区改动代码
-
版本回退
-
远端仓库代码回退
-
git push -f(在本地回退的基础上,使用强制提交 -f)
-
git revert
reset 直接恢复到上一个提交,工作区代码自然也是上一个提交的代码;而 revert 是新增一个提交,但是这个提交是使用上一个提交的代码。
因此,它们两恢复后的代码是一致的,区别是一个新增提交(revert),一个回退提交(reset)。
正因为 revert 永远是新增提交,因此本地仓库版本永远不可能落后于远程仓库,可以直接推送到远程仓库,故而解决了 reset 后推送需要加
-f参数的问题,提高了安全性 -
-
回滚之后试图前进版本(再次反悔。。。)
# 查找回滚之前的 commit hash git reflog git reset <commit_hash> -
场景三:git 基本分支操作
- 查看分支(无参数 -a 表示只查看本地的所有分支)
git branch -a
- 删除远程分支
git push <remoten> <branchname> --delete
- 删除本地分支
git branch -d <branchname>
- 创建分支
git checkout -b <branchname>
- 切换分支
git checkout <branchname>
场景四:修改 commit 信息
参考官网中的方法
Git - 重写历史 这里可能有两种场景~
- 修改最近一次的提交
git commit --amend
- 修改更久远的提交信息(下面这个教程写的非常清晰,好评 🤩)
git rebase
场景五:分支合并
这部分涉及两个操作 rebase 和 merge 以及在处理分支时可能遇到的分支冲突问题。 下面这篇文章写的太好了,无需多言~
使用 rebase 和 merge 的基本原则
- 下游分支更新上游分支内容的时候使用
rebase - 上游分支合并下游分支内容的时候使用
merge - 更新当前分支的内容时一定要使用
-rebase参数
例如现有上游分支 master,基于 master 分支拉出来一个开发分支 dev,在 dev 上开发了一段时间后要把 master 分支提交的新内容更新到 dev 分支,此时切换到 dev 分支,使用 git rebase master
等 dev 分支开发完成了之后,要合并到上游分支 master 上的时候,切换到 master 分支,使用 git merge dev
场景六:A分支的提交转移到B分支
😍是时候介绍一下 cherry-pick 了,任何人不知道这个命令我都会伤心的 OK。下方是一篇精品教程!
举个栗子,代码仓库有master和feature两个分支。
a - b - c - d Master
\
e - f - g Feature
现在将提交f应用到master分支。
# 切换到 master 分支
$ git checkout master
# Cherry pick 操作
$ git cherry-pick f
上面的操作完成以后,代码库就变成了下面的样子。
a - b - c - d - f Master
\
e - f - g Feature
从上面可以看到,master分支的末尾增加了一个提交f。