目录
git指南
git常用命令
//do some modification
git diff
git checkout -f //This is used to throw away local changes
//do some modification
git status
git add . //添加changes
git status //可以看到changes to committed
git commit -a -s -m "some info messages about changes"
git show //可以看到commit及用户签名
git log //可以看到他人的commit
git remote -v //origin
git branch //查看分支,例如,在master分支下
git push origin <本地分支>:<远程分支>
----
本地分支重命名
git branch -m old new(不是当前分支)
git branch -m new(是当前分支)
配置局部用户
在代码库git下生成局部用户的git config文件,commit时有user信息。注意不要跟别人用同一个user name来提交(全局用户)。
cd /src/github.com/repo
git config user.name "user"
git config user.email "user@email.com"
cat .git/config
git credential helper 免密配置
起因:每次编译需要从gitlab上拉包都要输入用户密码,很麻烦,用git credential可以保存用户密码
//删除 manager配置
git config --global --unset credential.helper manager/store
//添加manager配置
git config --global credential.helper manager/store
代码提交规范
- 格式
type: description
- 其中type是commit的类别,包括
- fix - 修复bug
- add - 新功能
- update - 更新
- style - 代码格式改变
- test - 增加测试代码
- revert - 撤销上一次commit
- build - 构建工具改动
- description是对本次提交的简短描述。
- 不超过50个字符
- 每行不能超过72个字符
- 推荐以动词开头
- 其中type是commit的类别,包括
- 每个功能的实现作为一个commit
- 例如,单元测试的每一个测试函数都是一个功能,为了便于review,可以每写一个函数就一个commit,防止代码量太大,增加review负担。
- 每次commit的代码行数不要超过300行!10 lines - 10 bugs, 500 lines - looks fine!
push到远程仓库
- 如果在本地的master分支修改,然后在远程仓库:git remote有一个origin,那push到远程仓库的时候,可以不push到master分支,而是push到远程仓库的新建分支。可以把本地的master分支,推到远程的mybranch分支。
git push origin master(本地分支):mybranch(远程分支)
-
一般情况下最好是本地分支和远程分支重名,所以一开始pull的时候就checkout到一个新特性分支。通常情况下,一个分支对应一个新的特性。
-
先rebase再push
git pull --rebase origin master (把当前分支上所有的commit换成基于最新master分支的commit) git push origin 本地分支:远程分支
根据git log修改和抢救
git reset: 恢复到之前的commit(本地代码均未Push)
-
状态恢复到之前的commit,但是现有的修改保留
$git log ---- commit aaaaa (newest) commit bbbbb commit ccccc $git reset ccccc $git log --- commit ccccc (然后git status可以看到aaaa和bbbbb的修改,unstaged)
-
完全撤销,丢弃某一次commit之后的代码,恢复现场
$git reset --hard ccccc
git rebase的各种作用
http://jartto.wang/2018/12/11/git-rebase/
-
case1:多次无用commit可以合并到一条commit。
https://juejin.im/entry/5ae9706d51882567327809d0
- 对于一个小功能,多次无用commit不利于代码review,且会造成分支污染,不利于回滚。
git rebase -i HEAD~4 //合并最近四次提交记录 ---进入vim编辑模式,有相关命令
//pick+s+s+s,确定好每条commit如何处理后,:wq推出,会自动进入commit message编辑的界面
//编辑commit message
git log //查看结果
- case2:分支合并
- 如果两个人在masterd的不同子分支上开发,然后最终要合并,直接merge会污染commit记录。可以先rebase再merge。
- case3:在一个过时的分支上进行开发,先rebase比较好。
- case4:修改某一次commit的内容
但是git rebase是一个危险命令,因为改变了历史,要谨慎使用。
只要分支上需要rebase的所有commits历史都没有被push过,就可以安全使用rebase。
pull解决冲突
- push前,可以先pull,注意pull和pull --rebase的区别
git pull --rebase origin master //把在当前分支上的所有修改rebase到orgin:master分支。
- 冲突解决
- 在IDE中可以直接选择,也可以手动修改。
- head====上半部是我的commit,下半部是pull到的修改。酌情选择。可以直接accept incoming change。
- 解决完了,要git add一下。再git rebase --continue。
修改某一次commit的内容
- 起因:用VScode导致有很多trailing space,别人无法用Patch来合并。要删除某一个commit中的这些无用空格。
- 修复:
- (git stash)
- git rebase -i(–interactive) [需要修改的commit的前一条的commit号]
- 对于需要修改的commit,把pick改成 edit
- 修改文件
- git add
- git commit --amend
- git rebase --continue
- (git stash pop)
强制push到远程分支【高危操作】
-
起因:之前没有rebase,直接push到了B分支。希望rebase后再push到B分支上(覆盖)。(远程仓库的分支只可以更新,不可以覆盖,除非force push)
local: git pull --rebase origin master //xxxx冲突,解决冲突.... git add xxxx git rebase --continue //ok git push [-f] origin 本地分支:远程分支