再谈Git

115 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情 git 是一线研发人员都会使用到的一个版本管理工具,我在有了一定的使用经验后,对 git 的使用做了一些场景化的总结。

场景一:git 配置多用户

这个场景其实蛮常见的,比如我既使用我个人的 github 带薪学习,又有公司的 gitlab 作为业务项目,这时候就需要为这两个不同的平台(对应不同用户)进行 git 的配置。

当我们和远程仓库交互(push/pull)时,会遇到用户权限校验,有两种校验方式,其一是基于 https 的,这时候会要求输入远程仓库的用户名和密码进行验证,其二是使用 ssh 的方式,ssh 基于我们在客户端进行秘钥的生成和配置。

需要明确的一个问题是,一对秘钥(包含公钥和私钥)可以同时被多个不同的 git 平台使用(github、gitee、gitlab等),但是如果在一个平台上有多个用户账号,那么在该平台需要配置多对的秘钥。

配置

当然在这里我们还是使用两对不同的秘钥分别配置两个不同的平台(具体步骤命令可以参照 👇)

配置多个git账号的ssh密钥

  1. 秘钥生成

    1. 使用 ssh-keygen 生成秘钥,注意两对秘钥分别保存在不同的文件夹中加以区分。
    2. 复制公钥并粘贴在对应的平台公钥添加处。
  2. 用户和秘钥配置

    1. 在 ~/.ssh/ 文件夹下创建配置文件

    2. 对文件进行配置, 下方为 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
      
    3. 添加新的私钥到 ssh-agent 缓存中(可选)

      git config --list # 查看 git 配置
      
  3. 验证配置是否成功

用户切换

一个前置知识是,我们一般会对 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"

场景二:修改撤销

这个场景也是非常经典的操作了,下面的这个链接将情况区分的非常清晰了 👇

如何撤销修改?

  1. 工作区撤销,可能有以下两种状态

    1. Untracked files
    2. Changes not staged for commit
  2. 暂存区撤销: git reset 命令可选参数有以下三种

    • -hard:撤销 commit,撤销 add,删除工作区改动代码
    • -mixed:默认参数。撤销 commit,撤销 add,还原工作区改动代码
    • -soft:撤销 commit,不撤销 add,还原工作区改动代码
  3. 版本回退

    1. 远端仓库代码回退

      1. git push -f(在本地回退的基础上,使用强制提交 -f)

      2. git revert

      reset 直接恢复到上一个提交,工作区代码自然也是上一个提交的代码;而 revert 是新增一个提交,但是这个提交是使用上一个提交的代码。

      因此,它们两恢复后的代码是一致的,区别是一个新增提交(revert),一个回退提交(reset)。

      正因为 revert 永远是新增提交,因此本地仓库版本永远不可能落后于远程仓库,可以直接推送到远程仓库,故而解决了 reset 后推送需要加 -f 参数的问题,提高了安全性

    2. 回滚之后试图前进版本(再次反悔。。。)

    # 查找回滚之前的 commit hash
    git reflog
    git reset <commit_hash>
    

场景三:git 基本分支操作

  1. 查看分支(无参数 -a 表示只查看本地的所有分支)
git branch -a
  1. 删除远程分支
git push <remoten> <branchname> --delete
  1. 删除本地分支
git branch -d <branchname>
  1. 创建分支
git checkout -b <branchname>
  1. 切换分支
git checkout <branchname>

场景四:修改 commit 信息

参考官网中的方法

Git - 重写历史 这里可能有两种场景~

  1. 修改最近一次的提交
git commit --amend
  1. 修改更久远的提交信息(下面这个教程写的非常清晰,好评 🤩)

Git修改Commit信息

git rebase

场景五:分支合并

这部分涉及两个操作 rebase 和 merge 以及在处理分支时可能遇到的分支冲突问题。 下面这篇文章写的太好了,无需多言~

GIT使用rebase和merge的正确姿势

使用 rebase 和 merge 的基本原则

  1. 下游分支更新上游分支内容的时候使用 rebase
  2. 上游分支合并下游分支内容的时候使用 merge
  3. 更新当前分支的内容时一定要使用 -rebase 参数

例如现有上游分支 master,基于 master 分支拉出来一个开发分支 dev,在 dev 上开发了一段时间后要把 master 分支提交的新内容更新到 dev 分支,此时切换到 dev 分支,使用 git rebase master

等 dev 分支开发完成了之后,要合并到上游分支 master 上的时候,切换到 master 分支,使用 git merge dev

场景六:A分支的提交转移到B分支

😍是时候介绍一下 cherry-pick 了,任何人不知道这个命令我都会伤心的 OK。下方是一篇精品教程!

举个栗子,代码仓库有masterfeature两个分支。

 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