0 初始化配置

0.1 全局配置

安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址

1
2
3
4
git config --global user.name "gsemir0418"
git config --global user.email "845217811@qq.com"
// 查看全局配置
git config --list

0.2 配置SSH公匙

0.2.1 本地创建ssh key

打开终端,输入如下指令

1
ssh-keygen -t rsa -C "845217811@qq.com"

直接点回车,说明会在默认文件id_rsa上生成ssh key

然后系统要求输入密码,直接回车表示不设密码;重复密码是也可以直接回车,表示不设密码。

创建成功后,在终端输入如下指令,便可看到几个文件:

1
2
ls ~/.ssh
id_rsa  id_rsa.pub  known_hosts

如没有known_hosts,可以后续尝试clone项目,git会为我们自动添加known_hosts文件

vscode或vim打开id_rsa.pub,复制全部内容备用。

0.2.2 git账户设置ssh

进入github主页,进入Account Settings,左边选择SSH Keys,Add SSH Key,

title建议填写计算机名称,粘贴刚刚复制的key。确定后配置完成了

0.2.3 验证

输入以下指令验证配置是否成功:

1
ssh -T git@github.com

如果配置过密码,输入密码后,看到如下指令,则表示配置成功

1
You’ve successfully authenticated, but GitHub does not provide shell access

0.3 修改之前的http仓库为ssh

1
2
3
4
// 查看当前远程仓库路径
git remote -v
// 修改为ssh路径
git remote set-url origin [新路径]

0.4 创建多个ssh key

在使用git的时候,遇到需要创建多个ssh key的需求,一个用来github项目,一个用来gitlab项目;

之前如果已将创建过一个ssh key,那么在创建第二个的时候,要修改默认名称,然后增加配置文件;

之前创建ssh key生成了如下两个文件,一个私钥,一个公钥

id_rsa id_rsa.pub

我们要生成新的一个ssh key,由于路径跟之前的一直,所以要改个名字

id_rsa_gitlab id_rsa_gitlab.pub

具体如下,-f指定路径及文件名:

1
ssh-keygen -t rsa -f ~/.ssh/id_rsa_gitlab -C "845217811@qq.com" 

注意:因为SSH默认只读取id_rsa,为了让SSH识别新的私钥,需要使用命令将其添加到SSH agent,命令如下:

1
2
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_gitlab

若执行ssh-add时提示“Could not open a connection to your authentication agent”,则执行下面的命令:

1
ssh-agent bash

然后再运行ssh-add命令(可以通过ssh-add -l查看私钥列表)

接着修改配置文件:

在~./ssh目录下新建一个config文件,命令如下:

1
touch config

配置文件如下: #github Host github.com IdentityFile ~/.ssh/id_rsa User a@b.com

#gitlab Host gitlab.com IdentityFile ~/.ssh/id_rsa_gitlab User a@b.com

1 简单的代码提交流程

1.1 基本流程

  1. git status 查看工作区代码相对于暂存区的差别,可简写为gst
  2. git add . 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录,可简写为ga .
  3. git commit -m "注释" 将缓存区内容添加到本地仓库,尽量使用双引号
  4. git pull origin master先将远程仓库master中的信息同步到本地仓库master中
  5. git push origin master 将本地版本库推送到远程服务器,origin是远程主机,master表示是远程服务器上的master分支和本地分支重名的简写,分支名是可以修改的

1.2 存在分支的情况

  1. git branch 查看当前所在分支
  2. git checkout 分支名 切换到工作分支
  3. git status 查看有没有需要提交的改动
  4. git pull 与远端代码保持同步
  5. coding...
  6. git add . && git commit -m "注释" 将改动提交
  7. git push origin 分支名 推送到远程

2 git flow协同工作流

2.1 单人管理模式

  • 单人管理模式即组长建立与管理主仓库,组员不在主仓库的分支上开发,而是 fork 到自己 workspace 下。每次开发,需要先checkout 一个新的分支,commit 之后推送到自己的仓库,再向主仓库提Merge Request。所以开发过程中对于大多数项目来说,都会经过如下步骤:

    • Fork(Once)

    • Create a branch

    • Add commits

    • Open a Merge Request

    • Code review

    • Merge

    • Deploy

  • 流程详解如下

2.1.1 fork

  • 主仓库一般有两个分支,master和dev,日常开发工作在dev分支(设置为default

  • 协同办公的组员,将主仓库fork到自己的github,将dev分支clone到本地

  • 将主仓库的远程地址添加进来

    1
    
    $ git remote add upstream 主仓库url
    
  • push和pull时,分别使用自己的仓库和主仓库

    1
    2
    
    $ git push origin HEAD:分支
    $ git pull upstream dev
    

2.1.2 建立分支

  • (此步骤之后的所有操作,就是日常工作的操作流程了)查看当前分支

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # 查看所在分支
    $ git branch
    * dev
    # 查看本地和远程的全部分支
    $ git branch -a 
    * dev
    	remotes/origin/HEAD -> origin/dev
    	remotes/origin/dev
    	remotes/origin/master
    
  • 新建分支

    • 当正式开始coding前,先不要在dev分支上直接开始,先pull一下主仓库保证代码为最新,之后新建一个当天开发用的分支(from dev)
    1
    2
    3
    4
    
    $ git pull upstream dev
    
    $ git checkout -b todaywork
    Swiched to a new branch 'check'
    
    • Coding…

2.1.3 stash & 同步分支代码

  • stash

    • 当开发完成一个功能,或者这一天结束了,想要提交代码前,要先pull主仓库的代码
    • 但直接pull代码会带来冲突,此时可以使用stash命令,将提交或者代码放入暂存区
    1
    2
    
    $ git stash save "202207251044"
    $ git pull upstream dev
    
    • 主仓库最新代码拉取下来后,将暂存区内容拿出来
    1
    2
    3
    4
    5
    6
    7
    8
    
    # stash命令
    $ git stash list # 查看stash了哪些存储
    $ git stash show # 显示做了哪些改动
    $ git stash apply stash@{$num} # 将某个暂存取出
    $ git stash drop stash@{$num} # 丢弃stash@{$num}存储,从列表中删除这个存储
    $ git stash clear # 删除所有缓存的stash
    # 一般使用pop,相当于apply(0) + drop(0)
    $ git stash pop
    
    • 解决本地冲突即可,stash会智能显示代码中的冲突

2.1.4 正常提交代码

  • add&commit&push

    • 接下来要将代码提交至本地仓库,首先要查看代码状态
    1
    
    $ git status / git diff
    
    • 提交代码
    1
    
    $ git add . && git commit -m "feat: xxx"
    
    • push到自己的远程仓库
    1
    
    $ git push origin todaywork
    

2.1.5 Pull Request

  • 提PR
    • 我们到自己的远程仓库里,向主仓库提交分支合并请求,一般是自己这次工作创建的分支(todaywork)合并到主仓库的dev分支。
    • 选择好分支后,可以描述这次的合并请求,加title和description,在合并选项里可以选择在合并请求同意后删除这个分支,这个看个人情况,选或是不选,一般自己新建的工作分支可以选择勾上。之后就可以submit提交了,等待项目负责人的回应。这里也可以选择右上角的Assign——>Edit,来选择管理人员,效果相当于“@提醒一下”。

2.1.6 Code Review

  • 之后就是在项目负责人那边查看这个合并请求,进行Code Review,主要是:
    • 发现错误:人都会不可避免的出现一些纰漏,而这些纰漏在另一个人眼中也许显而易见。
    • 健壮性检查:代码是否健壮,是否有潜在安全、性能风险。代码是否可以回滚。
    • 质量保证:在一般情况下,新提交的代码一定需要写测试,测试不只可以保证你的提交符合预期,还可以在后人改你的代码时多一层保障。
    • 统一风格:对于整个团队来说,代码风格的统一很重要。
    • 完善注释:包括 commit message、代码中复杂实现是否有解释性的注释、紧急 hack 是否明确标注等。
    • 互相学习
  • 哪些人需要参与 Review
    1. 项目的维护者
    2. 上下游影响的相关人员
  • Reviewer人员还可以对相关的代码做评论,点赞等等,再所有人觉得代码没有问题之后,便可以接收这次合并请求,你的分支就合并到了主仓库的主分支上,你的代码就算是加上去了。
  • 当然,主仓库管理人也可以对你的合并请求提出问题,做出相关评论,暂时不合并你的分支,甚至取消这个请求,这时你就需要查看评论和问题,修改代码,再次push你自己的这个分支(提交请求合并的分支),另一边也能及时看到变化(显示两次commit)。如果你的合并请求被取消了,只能重新再提交请求。

2.1.7 同步本地与主仓库代码

  • 最后,在自己的workspace下,既可以将工作分支合并到自己的dev分支中,也可以直接删除工作分支,pull主仓库来同步最新代码

    1
    2
    3
    4
    5
    6
    7
    
    # 方案一
    $ git checkout dev
    $ git merge todaywork
    $ git branch -d todaywork
    # 方案二
    $ git branch -d todaywork
    $ git pull upstream dev
    

2.2 多人协同模式

// TODO

3 git add

  • 提交所有变化
1
git add -A
  • 提交被修改和被删除的文件,不包括新文件
1
git add -u
  • 提交新文件和被修改的文件,不包括被删除的文件
  • 2.x版本的git add .相当于-A
1
git add .

4 git commit

  • 取消上次commit
    • git reset --soft HEAD^ ——仅撤回commit操作,不改变代码
    • HEAD表示回退版本,如果你进行了2次commit,都想撤回,可以使用HEAD^2
    • --mixed——不删除工作空间改动代码,撤销commit,并且撤销git add . 操作这个为默认参数,git reset –mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
    • --soft——不删除工作空间改动代码,撤销commit,不撤销git add .
    • --hard——删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态。
  • 如果commit注释写错了,只是想改一下注释,只需要git commit --amend

5 git fetch

6 git merge

  • 将所在分支与指定分支合并
1
git merge <分支名>

7 git pull

8 git push

  • 提交代码到指定远程仓库
1
git push -u 仓库名 分支名

加了参数-u后,以后可以直接用git push 代替

  • 使用本地分支强行覆盖远程分支
1
git push origin master -f

9 git remote

  • 添加远程仓库
1
git remote add 仓库名 仓库路径
  • 删除远程仓库
1
git remote remove 仓库名
  • 修改远程仓库路径
1
git remote set-url 路径
  • 查看远程仓库
1
git remote -v

10 git checkout/branch

10.1 基本操作

  • 查看本地有哪些分支
1
git branch
  • 新建分支
1
git branch <分支名>
  • 切换至分支
1
git checkout <分支名>
  • 新建并切换至新分支
1
git checkout -b <分支名>
  • 删除本地分支
1
git branch -d <分支名>
  • 删除远端分支
1
git push origin --delete <分支名>

10.2 业务场景

  • 要将修改的业务代码同时push到其他分支:(dev分支的改动同步到debug分支)

    1
    2
    3
    4
    5
    6
    7
    8
    
    // 在dev分支找到并复制最新的commitId
    git log
    // 切换到debug分支
    git checkout debug
    // 使用cherry-pick命令,此时将会将对应的commit应用到此分支
    git cherry-pick commitId
    // 直接push
    git push origin debug
    

11 git reset

  1. git reset –soft 版本号

    • git reset --soft HEAD^ //回到上一个版本
    • 不删除工作区改动的代码,撤销commit,不撤销git add .
  2. git reset –mixed 版本号

    • git reset --mixed HEAD^ //回到上一个版本

    • 不删除工作区改动的代码,撤销commit,撤销git add .

      git reset –hard 版本号

      git reset --hard HEAD^ //回到上一个版本

    • 不删除工作区改动的代码,撤销commit,撤销git add .

      git reset –hard 版本号

      git reset --hard HEAD^ //回到上一个版本

    • 删除工作区的代码,撤销commit,撤销git add . 回到上一次commit的状态