Re:从零开始的博客生涯 #2 Git

引入 Git 版本管理

Git Verion

准备 Git

配置 Git 代理

1
$ git config --global http.proxy 'socks5://127.0.0.1:10808'

升级 Git

1
$ git update-git-for-windows

配置别名

1
2
3
4
5
6
7
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1'
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

关联本地和远程的仓库

本地已经准备好一个 Hugo 项目。

Github 新建仓库,本地进入项目目录:

1
2
3
4
5
6
$ git init
$ git add .
$ git commit -m "build: Initialize Hugo project"
$ git branch -M main
$ git remote add origin git@github.com:[username]/[reponame].git
$ git push -u origin main

注意自行替换 Github 用户名 username 及 仓库名 reponame

分支管理

使用分支

1
2
3
4
5
$ git checkout -b writing
# 进行写作
$ git add .
$ git commit -m "..."
$ git push -u origin writing

如果有新手看的话,commit 提交的 message 格式建议参考我另一篇博文《Git Commit Message 规范》。好习惯要从娃娃抓起。

合并分支(Merge Branch)

gitGraph: options { "nodeSpacing": 110, "nodeRadius": 9 } end commit commit branch newbranch checkout newbranch commit checkout master commit checkout newbranch commit checkout master merge newbranch

mermaid 的 Git 分支树还在实验阶段,没什么可玩的,只能图一乐。

一般使用分支的情况:

1
$ git checkout -b feature
            D -- E -- F  feature
           /
A -- B -- C  main

feature 开发完成,我想合并到 main 怎么办?

普通 Merge(默认使用 Fast forward)

1
2
$ git checkout main
$ git merge feature
            D -- E -- F  feature
           /             main
A -- B -- C
1
2
3
$ git log --graph --pretty=oneline --abbrev-commit
# main: A -> B -> C -> D -> E -> F
# feature: D -> E -> F

禁用 Fast forward 的 Merge

1
2
$ git checkout main
$ git merge feature --no-ff
            D -- E -- F  feature
           /           \
A -- B -- C ----------- G  main

注意:G 是一个船新版本(merge 时单独创建一个版本再合并)。

1
2
3
$ git log --graph --pretty=oneline --abbrev-commit
# main: A -> B -> C -> G  注意结合上一节观察区别
# feature: D -> E -> F

总结

这样就很好理解了吧,实际使用中最显著的区别就是如果是禁用 Fast forward 的 merge,main 分支回滚上一个版本会回到 C 而不是 E

也就是说 --no-ff 可以隐藏被合并分支中的提交历史,如果不想让开发 被合并分支 时产生的细碎 commit 扰乱 主分支 的提交历史就可以用。
但如果想在主分支上管理每一个 commit,直接 merge 就好了。

另外,如果想忽略任何细碎的提交历史,即专注于主分支,直接根本完全 totally 不 care 其他分支,就要用到神奇的变基(rebase[1]了,懂的都懂这里就不 细说 了。

扩展阅读

Pro Git 中文版(第二版)》《Git 官方文档
菜鸟教程
阮一峰的 Wiki


  1. 变基rebase」这个词就是字面意思(改变基底),但不是那种字面意思(*),望周知。 

updatedupdated2022-05-012022-05-01