小推荐
Linux的shell配置,参考oh-my-zsh
git alias的配置,可以参考这里
git alias是爱上命令行的终极杀器,配置了之后比用客户端更爽更快,git alias虽然依个人习惯而异,但是有些公共的最好还是遵从大家的习惯。
Today I Learned的git专题,每天练习一个,蛮有意思。
也推荐廖雪峰的git教程
几乎所有的git托管站上都可以配置ssh key,clone的时候使用ssh地址,也是极大提高幸福感的方式。
以下是正文
主库在本地命名为upstream,自己fork的远程库命名为origin
一个典型的开发过程:
1. 更新自己本地的master分支: git pull upstream/master --rebase(通常我名设置为alias.up,这样每次git up即可)
2. 创建自己的分支: git co -b my_br
3. 查看自己的修改: git diff (or git st)
4. git add . , git ci -m "some comment"
5. 推到远端前查看修改: git diff master..my_br
6. 进行rebase: git rebase master(or upstream/master)
7. 推送代码到远端: git push origin my_br
怎么协作呢?
首先需要增加协作人的remote库,命名为b_fork,对方已经建好分支的情况下
1. git fetch b_fork
2. 跟踪他的远程分支:git co -b his_br b_fork/his_br
3. 如果对方有更新: git pull b_fork his_br
4. 提交代码: git push b_fork his_br
5. 进行rebase: git rebase upstream/master
6. 因为已经推送到远端,rebase之后必须要覆盖远端代码: git push b_fork his_br -f
这里有几个常见问题:
1. 开发途中,对方rebase了并且推送到了远端怎么办?
一般来说,不要跟有强迫症的同事一起开发(=-=),如果发生了这种事,只能是删掉自己的本地分支,然后继续建分支跟踪远端分支
git reset <sha1>(回滚未提交的代码)
git stash
git br -D his_br
git fetch b_fork
git co -b his_br b_fork/his_br
git stash pop
2. 他的分支名跟我的冲突了怎么办?
可以在本地命名为其他名字,比如我们遇到了一个喜欢在master分支上开发的同事
1. git fetch b_fork
2. git co -b b_master b_fork/master
...
3. git push b_fork b_master:master
3. 两个人开发产生了过多的commit怎么合并?
使用 git rebase -i <你想保留的最早的commit sha1值>,会出现以下界面
rebase -i 出现的界面上面的说明也都一目了然,一般选择squash,会跟前面的commit合并在一起。
另外,如果是linux系统,需要配置默认git编辑器,windows没测过
亲测,如果中间有merge master的状况,可能会出现冲突。
以下就是一些很私人的东西。git功能很强大,每个人的习惯也不同,我有自己的习惯,用着一直很顺利,也避免了很多坑
我的几条准则
1. 更新maser使用 git pull upstream/master --rebase(git up), 被某同学反驳说这不是rebase,在我看来rebase其实是pull的一种方式,或者不同的途径做到了同一件事。另外被老司机反驳说,这次rebase没有必要。我倒是觉得提交代码前的rebase其实不是那么必要,因为你不能决定下一个被合的pr就是自己的pr,总之,各自的习惯吧。
2. 永远不在master上开发。一般来说,git分支的好处是,你可以多任务一起做,而且,不在master上开发,你可以随时切换到紧急改bug的状态,也可以避免git pull 时的冲突。(使用upstream/master 当然也可以。)
3. 一个分支只做一件事。可以避免上一个pr没合,又染进别的代码
4. 分支归类。通常我们会把分支命名为 feature/xxx,bugfix/yyy,某些强迫症同学,更会命名为三层,feature/model/xxx,这样的好处在后面会提及
我的习惯就造成了我是个分支狂魔,需要周期性的清理分支,上述的分支归类可以帮到我们。
清理远程分支,backup是我本地的备份分支,这里甚至可以选择只清除bugfix的分支
git br --merged master | grep -v -E "master|backup" | awk '{printf " :%s\n", $1}' | xargs git push origin
清理本地分支,使用-d可以保证没有被merge的pr不会被清除
git br | grep -v -E "master|backup" | xargs git br -d
欢迎交流。
扫码有惊喜哦
谢谢老板不要再往下看了。
这篇文章主要阐述了git在工作中的使用,git有很多的命令,用的时候去网上查即可,另外几个git的概念,感觉还是要阐述一下
git有几个动作跟别的版本控制不同的概念,比如index暂存区。某同学推荐的一图胜千言
git workflow从图中可以很明确看出diff, diff --cached, add 等等命令的含义
附赠我本地的git config
alias.co=checkout
alias.cob=checkout -b
alias.ci=commit
alias.p=push
alias.st=status
alias.stb=status -sb
alias.a=add
alias.lg=log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
alias.rank=shortlog -sn --no-merges
alias.bdm=git rank branch --merged | grep -v '*' | xargs -n 1 git branch -d
alias.up=pull --rebase
alias.br=branch
alias.bd=branch -D
alias.gi=!gi() { curl -L -s https://www.gitignore.io/api/$@ ;}; gi # 生成ignore文件
alias.undo=!f() {git reset --hard $(git rev-parse --abbrev-ref HEAD)@{${1-1}};}; f # 回滚一个commit
网友评论