我的git使用心得

小推荐

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 (回滚未提交的代码)

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值>,会出现以下界面

我的git使用心得_第1张图片
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使用心得_第2张图片
谢谢老板

不要再往下看了。

这篇文章主要阐述了git在工作中的使用,git有很多的命令,用的时候去网上查即可,另外几个git的概念,感觉还是要阐述一下

git有几个动作跟别的版本控制不同的概念,比如index暂存区。某同学推荐的一图胜千言

我的git使用心得_第3张图片
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使用心得)