我的git使用心得

作者: 栉风沐雨1314 | 来源:发表于2016-12-10 17:30 被阅读592次

    小推荐

    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

    相关文章

      网友评论

      本文标题:我的git使用心得

      本文链接:https://www.haomeiwen.com/subject/xdqlcttx.html