如何优雅地使用 Git

版本树 / graph / network

  • 干净简洁清晰
  • 提交信息明确
  • 易维护易读

举个反例:

1.png

举个正例:

2.png

Git 文件状态

通过 git status 查看

  • untracked 新文件未加入版本管理
  • unmodify
  • modified
  • staged 用 git add 暂存

git diff --stagedgit diff --cached 可查看已暂存文件和上次提交的区别

分支和 tag

合理使用分支,分支的好处:

  • 同时开发不同功能不冲突,可独立测试
  • 可集中解决冲突
  • 区分功能或未来某一版本

tag 的作用是对某个提交点打上标签,发布版本后打 tag,便于以后回滚特定版本,而不需要 revert。

tag 是对某一版本的记录。

开发新功能步骤

  1. 从开发分支拉一个功能分支
  2. 功能分支开发和测试
  3. 功能分支 rebase 开发分支(为什么)
  4. 功能分支合并到开发分支

注意:

  • 一次提交做一件事,写清楚 comment
  • 每次 pull 远程分支时使用 git pull --rebase
  • 分支从哪拉出来,最后合到哪回去
  • 合并之前先 rebase

fix bug 步骤

测试线bug的修复

和开发步骤类似

线上bug的修复

  1. 从master拉一个fix分支(为什么是master)
  2. 测试完后 rebase master
  3. 合并回master

Git 使用技巧

rebase 和 merge

git rebase一般解释为变基,也有解释为衍合

git mergegit rebase 都可以整合两个分支的内容,最终结果没有任何区别,但是变基使得提交历史更加整洁。

例如现在 dev 提交了一次,master 在此之后也提交了一次,两个分支的状态如下:

3.png

git merge 的结果:

4.png

git rebase 的结果:

5.png

提交点顺序

  • git merge后,提交点的顺序都和提交的时间顺序相同,即 master 的提交在 dev 之后。
  • git rebase后,顺序变成被rebase的分支(master)所有提交都在前面,进行rebase的分支(dev)提交都在被rebase的分支之后,在同一分支上的提交点仍按时间顺序排列。

分支变化

  • dev 在 rebase master 后,由原来的两个分岔的分支,变成重叠的分支,看起来 dev 是从最新的 master 上拉出的分支。

什么时候使用 rebase / merge

假设场景:从 dev 拉出分支 feature-a。那么当 dev 要合并 feature-a 的内容时,使用 git merge feature-a;反过来当 feature-a 要更新 dev 的内容时,使用 git rebase dev

使用时主要看两个分支的"主副"关系。

注意

一般来说,rebase后的 dev 和远程的origin/dev会发生分离,在命令行界面中会提示:

Your branch and 'origin/dev' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

这时需要用git push -f强制推送,覆盖远程分支。若使用了提示中的git pull,结果会变成合并,并产生一个合并提交点。

慎用git push -f!

————————————————————

git merge --no-ff

--no-ff 是不快速合并的意思

与 git merge 的区别

git merge的结果:

被merge的分支和当前分支在图形上并为一条线,被merge的提交点逐一合并到当前分支。

6.png

git merge --no-ff的结果:

被merge的分支和当前分支不在一条线上,被merge的提交点还在原来的分支上,同时在当前分支上产生一个新的提交点。

7.png

————————————————————

git rebase -i 操作

用于整理提交和提交信息,貌似不太好用,看演示:

git rebase -i dev 后进入如下界面。

1 pick ffc75a4 修改
2 pick 6c2217f bbb
3 pick a615960 修改a 1
4 pick e4817b3 修改a 2
5 pick 8550690 修改a 3
6
7 # Rebase 3190ea4..8550690 onto 3190ea4 (5 command(s))
8 #
9 # Commands:
10 # p, pick = use commit
11 # r, reword = use commit, but edit the commit message
12 # e, edit = use commit, but stop for amending
13 # s, squash = use commit, but meld into previous commit
14 # f, fixup = like "squash", but discard this commit's log message
15 # x, exec = run command (the rest of the line) using shell
16 # d, drop = remove commit
17 #
18 # These lines can be re-ordered; they are executed from top to bottom.
19 #
20 # If you remove a line here THAT COMMIT WILL BE LOST.
21 #
22 # However, if you remove everything, the rebase will be aborted.
23 #
24 # Note that empty commits are commented out

修改commit注释前面的pick,达到合并提交的目的,其中r是保留提交,修改提交信息,f是保留提交但是丢弃这次提交信息。

1 r ffc75a4 修改
2 f 6c2217f bbb
3 r a615960 修改a 1
4 f e4817b3 修改a 2
5 f 8550690 修改a 3

然后进入编辑两个打了r的提交信息的界面,修改提交信息保存即可。

这时候再看log,刚才的5次提交已经变成2次提交。

commit 94784f0c163bc4b2970f73066c91fac16b64be32
Author: ***
Date:   Mon Jan 8 17:01:57 2018 +0800

    修改a

commit 52907b261821afb0c38754ba95545ff8826910db
Author: ***
Date:   Mon Jan 8 16:28:05 2018 +0800

    修改b

————————————————————

git pull --rebase

与 git pull 的区别

在一般情况下,加与不加 --rebase 是没有区别的。

然而,从上面说的 git rebase 功能得知,某个分支可能与其远程分支发生分离,而当你 pull 时使用 git pull,则会变成你的本地分支和远程分支合并。

正确的做法是git pull --rebase,才会拉取到最新的分支。

因此推荐在任何时候 pull 远程分支,最好加上 --rebase 参数。

————————————————————

reset 和 revert

  • git reset 修改 HEAD 指向的位置
  • git revert还原某一个提交,并产生新提交来记录本次还原

git reset 常用命令

  • git reset HEAD {filename}: 取消暂存文件,恢复到已修改未暂存状态。

  • git reset HEAD~{n}: 表示回退到n个提交之前。它也可以用来合并提交,下面的写法与 git commit --amend 结果是一样的。

git reset HEAD~1
git commit

  • git reset {version}: 后面带版本号,直接回退到指定版本。

  • git reset的三种参数:

    1. 使用参数--hard,暂存区、工作区和 HEAD 指向的目录树内容相同。
    2. 使用参数--soft,只更改 HEAD 的指向,暂存区和工作区不变。
    3. 使用参数--mixed或者不带参数(默认为--mixed),更改引用的指向及重置暂存区,但是不改变工作区。

————————————————————

git reflog

查看提交记录的命令是git log,而git reflog的功能是查看本地操作记录,可以看到本地的commit, merge, rebase等操作记录,并带有版本号。

b3bf634 HEAD@{0}: rebase -i (finish): returning to refs/heads/feature-rebase-i
b3bf634 HEAD@{1}: rebase -i (fixup): 完善a中的判断和输出
dd19de3 HEAD@{2}: rebase -i (fixup): # This is a combination of 2 commits.
c138acf HEAD@{3}: rebase -i (reword): 完善a中的判断和输出
a7f47b2 HEAD@{5}: rebase -i (start): checkout dev
a472934 HEAD@{6}: rebase: aborting
a7f47b2 HEAD@{7}: rebase -i (start): checkout dev
a472934 HEAD@{8}: commit: 添加a输出
c84d5b7 HEAD@{9}: commit: 添加a中的判断
a5a6e64 HEAD@{10}: commit: 修改a内容
a7f47b2 HEAD@{11}: checkout: moving from dev to feature-rebase-i

————————————————————

git stash

把工作区内容缓存到一个栈里,之后用 git stash pop取出。在未提交工作区内容,但是想切到其他分支时非常有用。

注意

不建议同一时间段在不同分支都使用 git stash,涉及到多个分支的情形还是先 commit 较好,不push到远程,下次 commit 时可用 --amend 合到上次提交中。


原文:https://juejin.im/post/5a54386af265da3e3b7a6317

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容