阅读 620

你应该知道的Git常用操作

常规的提交代码流程

  • 0.首先执行git pull –-rebase 拉取最新代码
  • 1.修改完本地代码后,执行git add .,将所有改动暂存
  • 2.执行git status,查看当前文件状态,确保要提交的文件都已经暂存
  • 3.执行git commit -m “ADD:hello world”,提交一个新的commit
  • 4.确认代码已经改完了,准备push到远程仓库,在此被前还有再执行一遍git pull –-rebase 来合并远程仓库的最新代码,因为在修改代码这段时间 可能有其他人的新提交。
  • 5.如果上一步遇到冲突,需要处理完冲突才能继续
  • 6.冲突处理完成后,执行git push origin master将代码提交到远程master分支(假设当前在master分支上)

Git分支管理

合并branchA到branchB的常规操作

  • 1.git checkout branchB 切换到branchB
  • 2.git pull –-rebase 拉取branchB的最新代码
  • 3.git merge origin/branchA --no-ff合并branchA最新代码
  • 4.处理可能遇到的冲突
  • 5.检查两个分支合并的commit-id无误后,执行git push origin barnchB将代码提交到远程的branchB分支

包含submodule的分支切换

有时项目中包含子模块,在切换分支时,也需要切换submodule相关内容

1.A分支切换到B分支时,必做!!

git status,查看子module状态

2.发现子module有新提交

切换分支时,子module不会跟着更新,新的分支可能引用的不是当前的节点了
所以需要git submodule update –init –recursive更新一下。
再次执行git status查看状态。通常情况下都会没问题

3.发现子module有为untraced文件

A分支存在一子module,但是B分支没有。这时切换到B的时候,这个子module中包含的文件就当做是未提交的文件了。
这种情况下执行:git submodule foreach –recursive git clean -ffd
或者进入对应目录,手动执行git clean -ffd

4.发现子module有modified

A分支不包含B分支存在的一个module,但是有一个文件夹是B分支的子module名字,执行update时,这个子module不会被checkout,所以内容还是A的样子
这种情况下执行:git submodule foreach –recursive git checkout .
或者进入对应子module,手动执行git checkout .

分支工作流程

  • 1.master:管理发布状态,使用标签记录发布版本号
  • 2.develop:日常开发分支
  • 3.release:为每次发布做准备,分离develop分支,在完成发布后merge到master和develop分支
  • 4.hotfixes:快速修复上线后的bug
  • 5.feature:用于跨发布周期的,独立的功能开发

日常工作流程

  • 1.日常在develop开发
  • 2.如果有比较大的功能或者其他需求,那么新开分支:feature/xxx 来做,并在这个分支上进行打包和提测。
  • 3.在封版日,将该版本上线的需求合并到develop,然后将开个新的分支release/版本号(如release/1.0.1),将develop合并至该分支。
  • 4.灰度阶段,在releases/版本号 分支上修复BUG,打包并发布,同时在对应的commit上打上tag:{版本号}_grey
  • 5.如果在全量发布后,发现有线上问题,那么在对应的master分支上新开分支hotfix/{版本号}来修复,并升级版本号,修复完成后发版,同时在对应的commit上打上tag:{版本号},然后将hotfix合并到master,同时将合并到develop

git commit message规范

所有commit message,除了merge时系统自动生成的,均应遵循以下格式
OPERATION: description
一次提交可以有多个OPERATION,但最好只有一个,多个OPERATION一行一个。

OPERATION何时使用description应该写什么
ADD增加功能/文件增加了什么功能/文件(文件太多可以写目录)
MOD修改功能/文件修改了什么功能/文件, 以及修改原因
DEL删除功能/文件删除了什么功能/文件, 以及删除原因
FIX修复 bug说明解决的问题是什么, 如果在 jira 上有相应 bug 报告, 要写 ISSUE_ID
RFCT重构重构了什么
CLN清理清理了什么

Git常用指令

还原指令

还原代码到修改前
git reset –hard HEAD

远程分支强制覆盖本地

git fetch –all
git reset –hard origin/master

git amend使用

有时你提交过代码之后,发现一个地方改错了,你下次提交时不想保留上一次的记录;或者你上一次的commit message的描述有误,这时候你可以使用接下来的这个命令:git commit –-amend。
git amend适用于本地commit或者CodeReview,如果用于已经推送到远程的commit,需要合并代码

git合并多个提交

有时候在一个分支的多次意义相近的 commit,会把整个提交历史搞得很混乱,此时可以将一部分的 commit 合并为一个 commit,以美化整个 commit 历史,可以使用 rebase 的方法来合并多次 commit,主要步骤如下:

1. git log 查看当前的提交历史

比如需要将 3 个 ”请假应用客户端代码优化“ 的 commit 合并为一个 commit;

2. git rebase 进行 git 压缩

执行 git rebase -i HEAD~4 对最近的 4 个 commit 进行 rebase 操作;
详情可见:Git 合并多次 commit

git删除某个commit

同样的,利用 git 压缩 rebase 指令来删除某个 commit,过程和以上是类似的;
详情可见:Git 合并多次 commit

为什么merge时推荐使用git merge –-no-ff

在merge代码时,推荐使用–no-ff模式 Git merge的时候,有几种合并方式可以选择

--fast-forward

Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward)不过这种情况如果删除分支,则会丢失merge分支信息。

--squash

把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

–-no-ff

关闭fast-forward模式,在提交的时候,会创建一个merge的commit信息,然后合并到master分支

merge的不同行为,向后看,其实最终都会将代码合并到master分支,而区别仅仅只是分支上的简洁清晰的问题,然后,向前看,也就是我们使用reset 的时候,就会发现,不同的行为就带来了不同的影响
使用--no-ff在代码回退时更加安全,所以在merge时推荐使用--no-ff模式

git stash使用

  • (1)git stash save “save message” : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
  • (2)git stash list :查看stash了哪些存储
  • (3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
  • (4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
  • (5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
  • (6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
  • (7)git stash drop stash@{num} :丢弃stash@{num}存储,从列表中删除这个存储
  • (8)git stash clear :删除所有缓存的stash

临时合并代码的操作

例如当代码正在等待review时,你同时需要合并代码,操作步骤如下:
原分支为feature/test,需要合并develop

  • 1.git checkout -b temp 切换到temp分支
  • 2.git branch -D feature/test 删除test分支
  • 3.git checkout feature/test 将test分支还原到与远程一致
  • 4.git merge origin/develop --no-ff 合并develop分支
  • 5.git cherry-pick temp 合并temp分支,即等待review的代码
  • 6.git push origin feature/test 将test分支推送到远程
  • 7.git branch -D temp 删除temp分支

参考链接

Git 合并多次 commit
git merge和git merge --no-ff的区别