6. GIT 技巧总结

官方文档

6.1. 如何将自己fork的代码更新到最新的代码

作者[Thomas]

我们经常会遇到自己之前做的项目突然就跟不上主分支了。这个时候我们只要按照以下步骤来操作即可。

我们以RT-Thread来举例说明

第一步,将RT-Thread官方路径添加到upstream中

git remote add upstream https://github.com/RT-Thread/rt-thread.git

第二步,将官方的最新代码更新下来

git fetch upstream

第三步,将最新的代码下载同步下来,

git checkout upstream/master

第四步,创建一个本地的分支

git checkout -b new_master

第五步,这个时候我们就拥有了最新的代码的分支,提交到github上面去

git push origin new_master:old_master

这边需要注意的是,上面的命令old_master如果是你fork仓库中已经有的分支,需要加-f来强制push。如果是一个新的分支则你的fork仓库会创建一个分支,这个时候就是最新的代码了。

第六步,以下可以操作,也可以不用操作。并不是必须的,强迫症患者可以看下。

如果你有强迫症的话,想让你fork仓库的master更新到最新的话。

git push origin new_master:master -f    

如果还有强迫症的话,可能需要把本地的master分支给删了(因为这个是旧的)

git branch -D master

如果你还有强迫症的话,可以删除调upstream,看起来似乎干净一些

git remote remove upstream

6.2. TODO

6.2.1. git如何只拉取远端分支

当遇到github上面的代码太多,我只想拉去一个分支的时候,而且只要最上层的commit的时候

  1. 找到对应的branch

git clone --depth 1 --single-branch https://github.com/RT-Thread/rt-thread.git rt-thread --branch lts-v4.1.x

这样拉取的时候最快

当然这个时候我们又想要远端新建的一个分支怎么办呢?

  1. 先把远端的分支拉下来

git fetch origin 本地分支:远程分支
  1. 再切到那个本地分支

git checkout 本地分支

6.2.2. git如何删除远端分支

当遇到github上面远端分支需要删除的时候,我们使用下面命令

  1. 找到对应的branch

git branch -a              
  1. 删除远端branch

git push origin --delete xxx_dev

6.3. git如何添加submodule

如果引用第三方库的话,可以使用下面命令添加submodule

git submodule add https://xxx.git

删除第三方库:

git submodule deinit <submodule-name>

6.4. github国内如何快速更新代码

本章节主要通过gitee快速方便的更新代码

6.4.1. 情况一:第一次下载

第一次下载的时候,比如RTTHREAD master上面的源码,

可以先在gitee上面建个仓库

../../_images/image-20210202204744516.png

从这里导入仓库地址 https://github.com/RT-Thread/rt-thread.git

导入之后就可以下载了

6.4.2. 情况二, PR一次之后如果需要将RTTHREAD更新到最新的

可以按照上面的来更新到最新的branch

6.4.3. 情况三,本地fork的分支已经在远端更新了,但是本地git pull太慢

这种情况,主要原因是因为github没有同步按钮,先将gitee上面的老的分支先同步一下,

../../_images/image-20210202205055719.png

然后把gitee的branch先fetch下来

git fetch giteestream

这样本地就有新的代码了,

之后再执行git pull

会发现很快就更新完成了。

6.4.4. git如何合并之前的提交

有时候PR的时候,我们会有很多无用的提交,这些提交如果保留也会增大codesize的,所以尽量PR的时候尽可能少的commit提交。

git rebase命令格式:

git rebase -i [startpoint] [endpoint]

先要合并可以用下面的命令:

//合并当前的head 到某个commit XXXX
git rebase -i xxxx

//合并最近两次提交

git rebase -i HEAD~2

执行这个命令之后,有个vi编辑器

里面有提示

里面的提示有: pick:保留该commit(缩写:p) reword:保留该commit,但我需要修改该commit的注释(缩写:r) edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e) squash:将该commit和前一个commit合并(缩写:s) fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f) exec:执行shell命令(缩写:x) drop:我要丢弃该commit(缩写:d)

把pick改为squash就是可以把commit合并到前面一个commit

其他的可以根据提示修改。

然后:wq保存就可以了。

修改commit的时候一定要小心,不要把别人的commit修改了。看清楚那几个commit要合并的。

6.4.5. 如何修改倒数第二个的commit。

先用rebase找到commit git rebase -i HEAD~2

找到需要修改的commit,将前缀改为edit

然后git add 提交修改

git add . -u

git commit --amend 提交修改,

然后执行git rebase --continue 保存rebase

6.4.6. github如何贡献代码

6.4.7. github如何修改代码之后再次提交

这个只要PR之后,在原来分支上直接提交。PR的时候也会

6.4.8. git如何正确使用分支

6.4.9. git的原理本质

6.4.10. git如何正确管理自己的仓库和分支

原则一: 将比较大的repo仓库统一管理,方便维护

6.4.11. git通用行为准则

  • 每次提交新的代码之前,最好先下载最新的代码,git pull,之后再提交。

  • 完成功能的可以是一个仓库,提交代码的可以是一个仓库(防止错改),代码提交PR之后,就可以删掉原来的仓库了。通常可以两个仓库来回切换

  • 代码提交完了或者merge之后,自我验证一下,防止有些文件没有add上去。

  • 代码的commit尽量整理修改为有效的commit(删掉一些无用的commit,这些会占codesize),参考上面如何修改提交

  • 尽量新建一个branch添加功能

  • PR之后,自己先检查一遍文件是否正确(尽量不要直接等审核人员检查,因为有些文件,可能只有你自己知道是否正确)

6.4.12. GIT PR之后如何修改作者名称

如果遇到PR之后,签CLA一直签不了,用下面命令

git commit --amend --no-edit --author="User Name <user@exmaple.com>"

6.4.13. GIT PR之后如何将修改后的commit文件恢复回去

找到上一次commit提交的commit-id

git checkout commit-id file

之后再git commit 提交push

6.4.14. GIT flow 工作流

整个代码库中一共有五种分支

Master 分支,可发布

Release 分支,发布的准备工作

Developer 分支。是开发分支

Feature 分支,功能分支,开发完成,向develop合并,自删

Hotfix 分支,Bug-fix,完成后删除

6.5. 参考教程

Git及GitHub教程