文章目录
Github 与Gerrit
要说的话,两者都是代码托管平台,大家都能共同开发并上传同步然后merge自己的代码。两者的区别是Gerrit提供了方便的网页工具能够进行review代码,并且在开发者push时就提供了这一套区分支持。
Git
Git是所有托管平台的优秀管理工具,git有自己的很多指令,学习并实践指令是用好代码管理平台的第一步。
git init
是所有git管理的开始,此时就会创建一个git的管理分区,在里面就会有你当前的工作区,代码的版本区,代码的暂存区。
git remote add
如果你是项目的发起者,那么就需要将你的工作区与远程托管平台的版本库进行绑定,然后你就可以提交你的代码到远程平台了。
git remote add origin https://github.com/xxxxx/xx.git
此处origin则是远程的别名,以后对远程的操作都可以使用origin来代替。比如git push origin 或git fetch origin
- tip:如果你不是项目的发起者,你直接pull gerrit或github那么上面步骤可以直接跳过
git status
可以说是非常常用的命令了,查看当前工作区的管理状态,能够显示当前的修改状态,文件的状态等,操作都是根据状态来进行的,比如如果需要cherry-pick等对本地代码更新,都需要保证工作区代码是相对远程没有改动的。
git add
开发者可以用来用这个命令创建文件并将文件添加到暂存区,比如
git add Readme.txt
或者用来将改动文件添加到暂存区
git add hello.c / git add .
分别是将hello.c文件添加或将所有改动文件添加到暂存区。
- tip:对于开发者是直接通过创建文件方式在工作区,文件是untrack的,需要先 git add .然后才能成功提交
git checkout
上面add是添加到暂存区,那么checkout就是丢弃修改的文件
git checkout hello.c
是将hello.c文件的修改给丢弃,这个用于你一个CL修改的方面多了,需要拆分为多个commit时就很有用。
git commit
用来将改动文件保存到暂存区,并且创建commit记录,如果你的commit记录是空,那么是不允许提交的。比较常用的有两个指令
git commit -a "commit的描述"/git commit --amend
第一个是将所有改动保存并创建commit记录,第二个是对commit进行追加修改
git config
这个是提交必须做的配置,需要配置你的用户名与用户邮箱,用来表明你的开发身份。在commit中会自动记录你的信息然后生成标识。当然如果你不配置的话你也没有权限提交代码到远程。
git config user.name="xxx" / git config user.email="xxx"
- tip:如果你已经commit了,然后修改config,是不会修改commit记录里的配置信息的,需要用户–amend去追加修改配置
git branch
对于提交到远程,这个是非常有效的,git branch -a
能够显示当前工作区属于远程哪个分支,免得新手提交错了地方。如果代码项目分支比较多一直enter到最后红色的就是当前你下载的代码的所在远程分支。
- tip:自己本地的分支有一个默认变量有记录
HEAD
git push remote local-branch:remote-branch
对于github就比较简单了,直接push到远程分支就可以,比如git push github HEAD:master
如果远程设置了merge之前必须review那么就可以提醒项目开发者review代码。
着重说一下gerrit:在gerrit远程提供了默认解析变量 refs/for/ and refs/head/
这两个用来区分提交到gerrit的代码是否主动需要review,前一个是需要review之后,由选定的reviewer决定是abort还是merge;后一个则是直接merge;
git push gerrit HEAD:refs/for/xxx/master
git push gerrit HEAD:refs/head/xxx/master
git stash
在本地有更改,但是又不想丢弃的情况下要cherry-pick远端的代码,那么就可以将更改保存到暂存区的栈中,然后还能够随时提取出来。首先git add .
或git commit -a
然后 git stash push
此时工作区就会恢复到修改之前,需要的时候可以 git stash pop
- tip:stash是入栈操作,栈是先进后出,因此要注意你pop的是最近一次入栈的改动。
分支管理
git checkout
在多用户开发时就会涉及到branch分支问题,github的协同是是通过新开发者创建branch或fork的方式来修改后pull request的,因此管理者就需要对分支进行管理。
git checkout本是用来切换分支的,但当切换的分支有修改时也会提交修改到暂存区;创建分支则是通过协同指令 git checkout -b new_branch
,没有这个分支就会创建,有的话就会提示已经存在。切换已有分支则是 git checkout master
。
这个功能我觉得比reset要好用那么一丢丢,你可以在不同commit版本里任意切换。
git merge
那么那么多的分支,作为管理者是需要考虑对分支进行处理的。如果删除的话可以通过 git checkout -d new_branch
来删除这个分支。如果查看了分支新功能是没有问题的,可以合并到开发代码可以使用merge指令。
首先需要切换到被合并的分支中去 git checkout master
然后将要合并的分支merge到master来 git merge new_branch
然后就可以按照提交流程进行 git commit 与git push
git fetch
在分支管理中,更新拉取是最核心的。用户每次在开发前都需要保证当前本地分支与远程是保持一致的,自己的分支可以使用git pull
指令来拉取远程最新的代码。但如果存在其余分支或则正在被review的代码你就需要去fetch拉取。
首先你要知道你fetch的远程地址,如同上面git remote add
使用时,为远程地址创建了别名,可以直接通过别名的方式来拉取git fetch origin
。也可以不那么麻烦,直接通过远程地址拉取git fetch "远程链接地址"
git reset
对代码版本管理也是一个必要技能。用户能够通过 git reflog
查看每个commit的哈希值,复制这个哈希值就能切换分支版本。比如 git reset --hard 83b0b94
这样做的问题点在于,你如果修改后想要merge到另一个版本,就会存在冲突,冲突会在文件中使用 >>>>HEAD 表示出来,用户只能手动去删除不需要的内容然后按照提示 continue。
其实reset命令的好用点在于 --soft,你可以用来回退版本,然后git reset HEAD .
你就可以在本地对比刚刚相对于当前的修改了。
git rebase
在用户开发过程中如果多次拉取cherry-pick或多次进行commit更新,那么就会生成多个版本文件,在你进行push的时候会一次性全部更新到远程,如果你是在别人代码上开发,那这就会增加审核的复杂度。
因此你需要对你的代码版本进行管理,将本地所有commit的版本可以合成一个commit版本。使用命令 git rebase -i HEAD~N
其中N代表你需要合并几个版本为一个。
在命令之后首先会弹出一个文件文件,你需要确定合并的几个版本,默认是所有的都会pick ***(head) ***
一般情况是你需要保留最顶上的版本号,然后将后面版本进行合并。你可以将后面的pick
修改为s
,然后ctrl x
就能跳转到你的commit信息文件。
git log
查看提交日志,能够查看各个版本的关系图 git log --graph