工作中的git

一、背景

工作中天天都需要使用git,各种idea也都集成了可视化的git操作界面,个人在工作中一直不习惯使用git可视化,坚持使用git bash,习惯使用各种命令进行操作。本文主要是记录自己日常使用git的习惯,以及处理不同场景的方式,目前暂未出现过任何问题,如果对git使用不熟悉,可以进行参考。

二、工作流程

2.1 分支分类
  • master:主分支,现网发布分支,受保护分支(不支持reset操作、可设置为只有仓库拥有者拥有权限)
  • dev :开发分支、联调分支,用于开发自己测试以及跟客户端进行联调使用,分支内的功能比较混乱
  • test:测试分支,提供给测试进行测试的分支,当开发需要提测时,将feature分支合并到test分支进行测试
  • feature:功能需求分支,用户进行功能开发的分支,从master分支checkout过来
  • hotfix:现网bug修复分支,临时使用,从master分支checkout过来

如果没有足够的资源的话,如没有联调环境等,都是本地开发的话,可以简单点来,直接本地将feature分支功能自测通过后,直接合并到test分支进行提测。

针对feature分支,可以不用feature-user这样的命名,可以使用如gitlab、coding等上面的issue号码,根据功能创建issue,根据issue编号创建如feature-1这样的分支名称。

测试完成后,可以将feature分支合并至master分支,这个时候需要进行审核,看feature分支有没有新加内容,直接看提测的最后的commitId 跟 当前最新的commitId是不是一致。

2.2 开发新功能

当有新需求需要开发时,需从master新建一个功能分支。

git checkout master # 切到master
git pull # 更新master
git checkout -b feature-1 # 切分支
git push --set-upstream origin feature-1 # 同步远程

然后就可以开始各种 git add 、git commit 、git push 。

多人开发,使用同一个分支的话,push前先pull下,如果喜欢经常commit,建议合并下commit

如:

λ git log --pretty=oneline # 查看提交日志
92e36edb7cd97e55ddcdd55f588d531c97227c73 (HEAD -> feature-1) 'three'
77f571b80b0999492a784fc3e614539d0fa4950b 'two'
ece1ffd733b8b2a5a0d9e7475ae5258ae72cc6d4 'one'
f2693b5ec6bf055f0803d3e920e5b37515023203 (origin/master, origin/dev, origin/HEAD, master, dev) Merge branch 'feature-duration' into 'master'

将上面三个commit合并成一个commit

git rebase -i f2693b5ec6bf055f0803d3e920e5b37515023203

pick ece1ffd 'one'
pick 77f571b 'two' # s 77f571b 'two'
pick 92e36ed 'three'# s 92e36ed 'three'

# 将后两个pick改成s,就可以往前合并,还有其他的参数,如d 删除commit

跟着指令操作就可以将commit进行合并,然后git push -f 提交到远程

多人操作同一个分支的时候, 使用-f 参数的时候要注意不要覆盖别人的代码,也可以每个人使用一个功能子分支,如:feature-1.1、feature-1.2 这样的,自己部分开发自测完成,合并至feature-1功能主分支。

2.3 再来一个新功能

如果这个功能比较小的话,就临时修改几行代码,并且feature-1上的代码开发也可以暂停,建议就直接从master分支上切feature-2分支,如2.2流程。

如果feature-1的代码就写了一半,又不愿意提交的话,可以直接提到暂存区。

git stash # 将修改提交至暂存区
git stash list # 可以查看暂存区列表
git stash pop # 可以将暂存区恢复至工作区,这样会清除暂存
git stash apply # 这种恢复,但是不清除

如果开发的功能很大,同时会出现交替开发的情况,这个时候就不建议直接checkout一个新的分支,因为这样的话,你同时只能对一个分支就行开发,交替开发的话需要切换分支,同时利用idea进行开发的话,切换分支也会重新进行文件索引,个人建议使用worktree新开个工作区。

git worktree add ../test master # 这样会在项目的同级目录,新建一份代码在test文件夹下,可以在当前目录进行开发,并且这个工作目录跟主目录是共享一个repository
git worktree list # 可以查看有多少个工作空间
git worktree remove # 可以移除相应的工作空间

用worktree的好处就是两个需求互不影响,同时也可以用idea打开两份分支代码,这样就可以随时切换功能需求开发了,但是worktree也有些弊端,比如不能是同一个分支等。

2.4 两个分支合并代码
2.4.1 分支内容比较多

分支commit比较多的情况下,个人一般直接使用git merge,这样就算有冲突也只用解决一次。

git merge feature-2 # 当前分支合并feature-2分支内容
2.4.2 分支内容不多

如果你的分支commit10个以内的话,建议直接用git rebase ,这样的话会保留commit log,以便之后查看,以及回退到指定的commit。

git rebase feature-2 # 这样的话,会将你当前分支的commit,在feature-2的基础上重新执行
2.4.3 几个commit

两三个commit的话,直接cherry-pick吧,将需要的代码,在你当前分支上执行。

git checkout feature-2 # 切到想要合并的分支
git log # 查看提交日志
git checkout feature-1 # 切回功能分支
git cherry-pick commitId # 将git log 查看到commitId 取过来
2.5 对比代码
git diff commit1 commit2 # 对比两个commit
git diff branch1 branch2 # 对比两个branch
git diff . # 可以查看工作空间有哪些修改
2.6 查看commit修复
git show commitId # 查看指定commitId的修复内容
2.7 查看当前分支来源
# 可以查看当前分支是从哪个分支checkout出来的
git reflog --date=local -all | grep feature-1

# 显示内容
92e36ed HEAD@{Thu Dec 24 18:20:00 2020}: rebase (finish): returning to refs/heads/feature-1
92e36ed refs/heads/feature-1@{Thu Dec 24 18:10:40 2020}: commit: 'three'
77f571b refs/heads/feature-1@{Thu Dec 24 18:10:10 2020}: commit: 'two'
ece1ffd refs/heads/feature-1@{Thu Dec 24 18:09:54 2020}: commit: 'one'
f2693b5 refs/heads/feature-1@{Thu Dec 24 17:46:52 2020}: branch: Created from HEAD
f2693b5 HEAD@{Thu Dec 24 17:46:52 2020}: checkout: moving from master to feature-1
2.8 回退代码

回退代码基本使用两种方式,git reset和git revert ,两者的区别就在于你是否需要保留相应的commit。

git reset commitId  # 回退到指定的commit,指定commit之后的commit都会清除
git revert commitId

三、更多操作

根据工作中常用的流程来说,上诉的命令可以让我很好的操作git了,还有很多命令可以参考官方文档。

https://git-scm.com/docs