git指南
本文基于个人git使用经验总结而成,可供初学者上手参考,欢迎补充与指正!
下载安装config以及添加ssh等请自行搜索完成。
git仓库
| 本地 | fork | 上游 |
|---|---|---|
| local | origin | upstream |
| 基于本地仓库修改代码 | 自己fork的仓库,拥有修改权限,可以push本地代码 | 源仓库,一般没有修改权限,所以无法直接push;拥有最新版本的代码 |
本地仓库初始化相关命令
需求分析:
我要开始为开源社区做贡献了!
git初始化命令
新建本地目录,在该目录下进行如下操作:
- 初始化本地git仓库
git init - 添加与之关联的fork仓库(名字可以随意,建议命名为origin)、上游仓库(名字可以随意,建议命名为upstream)
git remote add origin origin_ssh_urlgit remote add upstream upstream_ssh_url - 确认关联仓库
git remote -v - 下载代码
git clone origin_ssh_url
ok,到这里就把github里的项目挪到本地了,下一步是开发前的准备——更新/新建分支。
更新本地代码
需求分析:
- upstream仓库有更新,而自己fork的origin仓库和本地代码不会自动与之同步。
- 其他原因导致本地代码落后于upstream(或origin,极特殊情况)的代码
- 实际上,origin/master是不需要单独更新的,因为只要将local/master更新至upstream/master,就可以在本地master的基础上新建本地分支,基于最新代码进行修改。修改完成后再push至origin上。
git更新本地代码命令
- 拉取上游代码
git fetch upstream - 同步本地分支 local/master -> upstream/master
git rebase upstream/master - 此时使用
git status查看状态
会发现本地代码已经同步了上游的代码,领先了origin的代码,此时已经可以开始开发了。如果你非要让origin也同步:git push origin master
接下来就可以进行开发了~
分支
需求分析:
- 需要开发多个独立的功能,并以pr的方式逐一提交。
- 需要保留master上的代码。
注:
- 分支同样分为本地(local)分支、origin分支、upstream分支。
- 一般在本地,与上游代码同步后,基于local/master新建本地分支,该分支中的代码继承master,且在该分支上的改动不会影响local/master中的代码。
- 建议开发时,尽量将不同分支上开发无互相依赖的不同功能,如在branch A上开发A功能,切换到branch B上开发B功能……
- 分支之间互不影响,但仍然要注意是否有依赖,否则会在合并时出现冲突。尽量使各功能的开发独立。
git分支常用命令
git checkout branch_name
切换至branch_name分支git checkout -b new_branch
新建并切换至new_branch分支git branch -a
查看所有分支(带*等标记的为所在分支)git branch -D branch_name
删除branch_name分支(请不要直接在该分支上做这种过河拆桥的事情)
提交本地代码
需求分析:
- 保存,防止电脑突然歇菜
- 暂存,以便之后放弃修改回退到该状态
- 开发完成,准备回馈上游社区
git提交命令
本地代码的提交分为三步:推到暂存区、添加提交内容描述、推到origin仓库的新分支上
- 建议先确认下修改内容,是不是在正确的分支上,因为如果搞错了,这里没有新修改的内容,是推不上去的
git status - 将本地修改推到暂存区
git add -A
-A的意思是全部 - 添加提交描述,这个commit会显示在仓库首页,即最近一次修改,请用简洁正常语句撰写,之前的所有commit也都会保留在github的仓库里,这样比较好看版本修改内容
git commit -m "simple normal words" - 推送至origin仓库新分支,建议跟本地分支同名
git push origin new_branch
然后就可以打开github网页,自己的仓库首页就会提醒你是否根据这个branch创建pr。
合并多个提交commit
需求分析:
- 发现了很多typo,分了好几次才全部修改完成,自己看不下去
- 热爱提交,commit琐碎重复,被老大要求合并成一个commit
- 根据网上教程进行了同步或合并,结果不仅merge了别人的commit,还没有合并成功自己的commit
git合并多个提交命令
- 查看log
git log
这里会出现很多个commit,找到你需要合并的commit,比如将最新一个(HEAD所指)commit和第二个合并为一次提交,复制作为父亲的提交后面那一串 c47e54a3c35b6cec9f5fd2be0fc3905785df6df0之类的 - 重置提交状态到父提交时,之后会在这个基础上提交一次新的、合并了所有需要合并的提交的提交
git reset xxxxx - 重新推到暂存区
git add -A - 对提交内容描述进行修改
git commit --amend
会进入文本编辑,修改描述,之后的commit就只有这次描述了,合并的commit里的旧描述可以注释掉 - push到origin
git push origin xxx
刷新github看看commit记录
代码版本回退、合并
需求分析:
- 开发到一半,upstream突然更新了
- 开发前忘记更新本地分支
git回退与合并命令
- 先拉取upstream
git fetch upstream - 需要版本回退,用upstream/master更新本地代码
git rebase upstream/master - 或者需要合并本地代码和上游代码
git merge upstream/master - 可能会遇到各种冲突,根据git提示来就行,直接打开vscode也会给你标出冲突的地方,选择就行
修改pr
直接修改对应的本地分支再push到origin对应分支就行了,pr会自动跟着branch的commit变
总结
综上,一套完整的开发、提交pr流程一般为:
- 新建本地目录,后续操作都需要在这个目录下进行
- 在该目录下,
git init初始化本地git仓库,这个命令用一次就行了,之后基于该仓库的操作请勿再使用init命令,人生没有重来,本地仓库也是 -
git remote add origin ssh_urlssh_url是复制fork的仓库的ssh,将本地仓库关联fork的仓库 -
git remote add upstream ssh_url同上,关联上游仓库 -
git remote -v查看关联的仓库 -
git clone ssh_url将代码下载下来,建议使用fork的origin仓库 -
git fetch upstream+git rebase upstream/master开发之前一定要确保本地代码与上游同步,是最新的 -
git checkout -b feature-A基于local/master,新建本地分支,开发功能A - 开发ing……
- 开发完成后,
git status看看修改的文件是不是那几个,确认后git add -A把所有的文件(代码)加入暂存区 -
git commit -m "the changes"添加一次提交,""内填写本次提交概述 -
git push origin branch_name将刚才加入暂存区的文件(代码)和提交内容推到origin的branch_name分支中 - 在github网页上,将origin/branch_name分支以pr形式提交给上游仓库
- 如若需要进行下一个功能的开发,记得切换回master分支,再新建本地feature-B分支进行B功能的开发
注意!
为国争光,禁用pull,从我做起。
流程链接
Collaborating with issues and pull requests