刚参加工作时主要使用GitGUI+Tortoise git工具+GitLab进行Git的代码协同,可视化的操作界面使刚毕业的我不必记录复杂的Git指令,使我能更专注于代码本身。而入职新公司后,将近半G的代码量的庞大项目取代了老东家200k的代码量的逻辑项目,版本管理也自然而然使用更适合多人协同的Repo+Git Bash+Gerrit的方式,在简单试用一段时间后,感叹在命令行下才可以深入理解Git的设计内核。
1、Repo
Repo全程是repository,是谷歌开发的用于管理Android 版本库的一个工具。Repo并不是取代Git,而是用python对Git进行了一定的封装,简化了对Git版本库的管理。用Repo管理的版本库都需要使用Git命令来操作。
常用的Repo命令如下:
【repo init -u [url] -b [brach] --depth = 1】:完成repo工具的完整下载,相当于对repo配置以及repo脚本集进行git pull。url为代码库的URL链接,brach为具体分支名。 depth = 1,表示目录层级为1层,即git log时的commit仅有最近一次提交,不包含历史版本,可以通过配置commit深度为1加快配置速度。repo init仅做环境相关配置,下载完成后会在根目录下生成.repo的隐藏文件。
【repo sync -c -j32】:默认同步Android 所有的git代码库,j32表示使用32线程进行同步,加快代码下载速度,默认情况下使用4线程并发进行下载。-c表示只同步当前分支,默认情况下会更新所有的分支。repo sync -c -j32 [name] 表示下载分支名位name的分支,name可以从根目录下的.repo/manifest下查看。若单独下载某一个库的代码空间需要先进行对应代码空间的repo init。
【repo start XXX .】如果只git pull了一个远端仓库的一部分,那么可以使用此指令,创建一个默认的本地分支。
【repo upload . --cbr】:指向检出并上传当前的git分支,cbr含义为current branch。作用和git push ××× 一样,建议使用git。
Repo介绍好文推荐:
repo总结_绿tree的博客-CSDN博客_repo sync 参数
2、Git Bash
Git有一套叫做打包文件的存储机制,会定位内容非常相似的全部文件,然后为他们之一存储整个内容,之后计算相似文件之间的差异只存储差异。
【git status】:对比上次提交是否有文件及其内容的删改。
【git diff】:比较文件在暂存区与未写入暂存区的差异,若文件已git add至暂存区,则无法捕获到diff。
git diff commit1 commit2 可以比较两个commit之间的差异。
【git branch】:列举当前的本地分支,git branch -a可列举出所有本地和远端分支,最后一列表示当前本地分支对应的远端分支,为repo仓库拉下来后的分支,本地分支切换后就不是这个了(没有git branch -vv精确,建议采用git branch -vv);git branch -d test_branch可删除本地分支test_branch。
【git checkout -b new_branch url_name】:new_branch表示新分支名,url_name表示链接到的远端分支名。若new_branch存在,则直接切换。否则,将先创建再切换。分支切换完成后,建议git pull一下,可以对分支进行更新。
【git pull】:拉取(更新)远端分支到本地,git pull = git fetch(获取远端分支到本地,不会merge) + git merge(同步)。有时候git pull失败,总会显示某些分支merge失败,此时可以先git fetch --depth=100,先进行分支同步,再merge。
【git add】:将文件添加到暂存区。
【git reset】:取消暂存区缓存。
【git commit】:将暂存区的内容添加到本地仓库,并自动弹窗进行commit备注,备注完成退出时需先按ctrl+k,再按x。commit中的信息需填写完全,否则服务器端会检查出错误。
commit使用vim编译器方法:在shell下输入git config --global core.editor "vim"
【git config --list】:获取全部本地分支配置,包含对应的远端分支(.merge对应的右值),也可通git branch -a查看本地分支对应的远端分支。
【git push url】:推送代码到远端分支url。将一个new branch推送到远端仓库时,可能会被远端仓库阻止,若出现提交不上去的情况,可以加入--no-thin。若出现commit异常,则可执行git pull --unshallow/git pull --depth=10进行commit的对齐。若对齐后上传代码扔存在问题,可能是远端有commit数据类型检查,git commit的格式出现问题。
【git rev-parse --abbrev-ref local_branch_name】:查看本地分支在远端分支的对应关系,local_branch_name即分支名。
【git log】:显示历届的版本信息,其中包含历届的commit信息。
【git apply】:git apply xx.diff / git apply xx.patch,二者都是对打补丁的方式,可以使用git apply将补丁直接应用于代码中。
【git revert】:撤销某次提交同时不影响其他提交。如果有冲突,则解决冲突后,重新commit提交,此时已把冲突解决了。
【git remote update】:当发现远程的分支可以在网页上显示,但是本地git branch -a看不到时,一般需要在本地使用git remote update更新
【git clean】:对于未追踪的文件(untracked files),即新文件,使用git reset --hard HEAD无法清除,使用git clean -f -d 删除对应的文件以及路径。
【git blame】:查找文件中每一行的最后修改时间,若要追溯更早谁修改的,可以检索出最后一次修改时间后,继续向前推。
【git log -Sstring】:可以直接检索出某一行代码是什么时候添加/删除的,属于暴力考古的一种。
3、Gerrit
Gerrit是一个免费、开源的代码审查软件。相对于GitLab丰富且友好的UI界面,Gerrit第一次使用时感觉非常简陋,但随着逐渐上手,也被其简单的设计吸引。
---每份提交都会生成一个patch(补丁)号,可以直接根据此patch号全局查找此次变更。通过界面,可直接查看到此次变更点与变更的commit信息,且commit支持修改。
---代码变更提交后,可以交由多人做review审核。审核历史记录可见。
---可以将此分支上的代码cherry pick到另一个分支,此次的更改也可以revert撤销。因为任意的代码变动都需要审核,所以涉及到合并与撤销操作,可先于远端完成,待审核通过后,再通过push到本地。
常用搜索框内容为owner:xxxx(name) status:xxxx(merged) commit(使用commit检索更精确) message(单字节搜索,多字节时老出错)。