记录下最近遇到的 Git 使用场景,欢迎补充。
事先准备
- 需要fork的项目地址:https://github.com/root/demo
- fork后的项目地址:https://github.com/user/demo
注:假设项目地址是真实的。
场景一:需要添加
数据处理
的 API,然后 patch 到dev@email.com
开发过程中我们编写了 docs
和 code files
,那怎么使用 Git 呢?
git add docs
git commit -m "Add docs of data process"
git add .
git commit -m "Add codes of data process"
git format-patch HEAD~2 --subject-prefix "demo v1" --cover-letter -o patches
git send-email patches -to dev@email.com
如上操作就是场景一的实现,不过这里有几个细节需要注意:
- commit description 不要超过 50 个字符,如果超过了需要一下操作
git add docs
git commit
之后进入一个文本,在注释下面的第一行写标题,然后空一行,之后写详细的 commit description
- 如上示例中,patches 是自动生成的,之后需要编辑 patches 里的第一个描述文件,需要修改主题和描述
- patch 到指定邮箱时,最好先 patch 给自己,检查下,减少错误发生的概率
场景二:继场景一后,patch 后的代码需要修改部分
code files
,然后再 patch 到dev@email.com
修改完代码后,我们是否再重提一个新的 commit 呢?NO, 我们要把修改后的代码追加到 Add codes of data process
中就行,因为修改的是 data process
,所以没必要提新的 commit。怎么使用 Git 呢?
git add .
git commit --amend
会进入commit 的描述文件,如果你想添加,在下面添加,不然就保存退出就好啦
git format-patch HEAD~1--subject-prefix "demo v2"
只是会生成一个 patch 文件,假设文件名为:demov2.patch
git send-email demov2.patch -to dev@email.com
场景三:继场景二后,
docs
需要更新,然后提 PR
这个该怎么办呢?docs commit
先于 code files commit
, 不能像场景二似的那样操作。难道 reset 到最初嘛?这时 git rebase 就有用武之地啦。具体操作如下:
git rebase -i HEAD~~
之后进入一个文本文件,这时需要 `docs commit` 修改为 `edit` 即可。然后进行文档修改。
git add .
git commit --amend
git rebase --continue
然后将本地分支推送到远程仓库就 ok 啦
需要注意的是,想修改那个 commit, git rebase -i commit_id
指定 commit_id
场景四:继场景三后,
code files
需要添加新功能
因为 code files
是最新的 commit 所以我们按照场景二操作就ok.
场景五:继场景四后,在
code files
提交前,被 fork 的仓库更新啦,需要保持一致,方能将提的 pr Merge.
这时,rebase
就起作用啦。具体操作如下:
git remote add upstream https://github.com/root/demo
git fetch upstream
git checkout master
git rebase upstream/master
git push origin master
之后再推送 commit 就 ok.
场景六: 继场景五后,发现项目中含义子模块没有提交到 PR
我一上来我就懵逼啦,子模块的仓库代码我更新啦,这个项目中 Update gitsubmodule
是什么意思呢?看下具体操作吧:
git submodule // 查看子模块
git submodule init // 初始化子模块
git submodule update --remote // 获取远程最新的子模块
如上操作,将最新的 submodule
加载到本地,.gitmodules
也更新啦(其实更细了版本号),所谓的 Update gitsubmodule
就是添加 .gitmodules
Tips:保持良好的 Git 使用规范,合并多余的
commit
,title
要详细突出主题,不要轻易关闭PR
以前我常用的 Git 命令列表
- git init
- git add .
- git commit -m "Submit a description"
- git push origin master
被 Git 一顿完虐后,更新如下
- git log
- git reflog
- git reset --hard
commit_id
- git rebase -i
commit_id
- git rebase --continue
- git commit --amend
- git remote -v
- git remote add
remoteName
remoteAddress
- git format-patch
HEAD~n
--subject-prefix "common project name and version" - git send-email
patch
-toemailAddress
- git format-patch
HEAD~n
--subject-prefix "common project name and version" --cover-letter -opatches
- git send-email patches -to
emailAddress
- git submodule
- git submodule init
- git submodule update --remote
注:commit_id
指提交的版本号,remoteName
自动远程地址的名称,remoteAddress
远程地址,HEAD~n
,如果 patch 的话,n == 2的话是patch最近两次的commit,patch
生成的 patch 文件,emailAddress
收件人邮箱,patches
存放着多个 patch 文件
网友评论