设置 git alias
使用 git alias 可以极大地提高效率,我常用的有
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.logl 'log --oneline'
工作场景一 —— 新任务(开发新特性 / 修bug)
- git status 查看当前项目的状态,如果有未保存的修改,就git add . 和 git commit -m “” 保存下来
- 切换到开发主分支,假如项目的主分支叫develop 就使用 git checkout develop
- 确保主分支是最新版本 git pull origin develop
- 创建新分支 git checkout -b feat-1 (创建一个叫做 feat-1的新分支)
- 开始写代码
- 如果当前任务比较复杂,代码量比较多,我通常会多次使用 git add . 和 git commit -m “xxx” 保存当前代码 (记得把 xxx 换成更有意义的文字, 如 git commit -m “init feature-1” )
- 代码开发结束,整理 commit message
首先仍然是用 git status 确保所有代码都commit了(没有就 git add 和 git commit )
第二步 git log –oneline 查看当前分支下最近的 commit message,如
1d23813 (HEAD -> feat-1) develop feat-1 phase 3
a7e5705 develop feat-1 phase 2
2685240 init feat-1
假设我开发 feat-1 中 commit 了3次,三次的commit message如上所示。
前面说过 commit 是为了防止意外丢失代码,但是在推到远端之前,最好把一次开发的 commit 合并成一个,避免污染远端的 git commit message
因为这个例子中有3个 commit,所以执行 git rebase -i HEAD~3
然后就会看到一个 vim 界面 (不熟悉 vim 基础操作的读者请自行查阅搜索)
pick 2685240 init feat-1
pick a7e5705 develop feat-1 phase 2
pick 1d23813 develop feat-1 phase 3
记住不要动最上面的那行,把下面几行开头的 pick 换成 s , 然后保存
这时会显示另一个 vim 界面
删除所有内容( #开头的可以忽略),然后写一句简短、准确的句子作为这次开发的 commit message
然后保存
如果成功了就能看见这么一些文字
最后使用 git log –oneline 确认所有这次开发中的 commit message 都被压缩成了一个
(这边只介绍了 git rebase的最简单直接的用法,有兴趣的读者可以去阅读官方文档,了解更详细、高级的用法,如第一次vim界面里使用 f 替代 s 有时候更方便)
- 最后 git push origin feat-1 把本地仓库推到远端仓库
工作场景二 —— 开发进行一半,需要远端主分支的最新代码
有些时候,你在本地开发某个功能,代码写到一半,某个同事将某些重要代码合进了远端的主分支(如 develop 分支)里。这些重要代码可能是可以极大提升本地开发效率,可能是加入了某些规范检查或者是跟你当前开发相关的代码 —— 总之需要你将那部分代码融入你当前的本地开发环境里。
这种情况下,我会
- git status 查看当前项目的状态,如果有未保存的修改,就git add . 和 git commit -m “xyz” 保存下来
- git pull –rebase origin develop 使用这个指令将远端的主分支以 rebase 的形式 “合进”当前分支
- git log –oneline 查看当前分支下的 commit message 是否符合预期
为什么用 –rebase 呢?
因为这么做,可以让git历史最干净、整洁 —— 所有本地开发的 commit 都会出现在远端主分支里的 commit 之后;并且可以避免额外引入一次 merge 的 commit
工作场景三 —— 希望把某个分支中的某个 commit 对应的代码复制到当前分支
有时我会创建一些实验性的分支,写一些实验性的代码,如果代码不可行,我可以直接废弃掉这个分支,返回原本的开发分支中;如果这些实验性代码可行,我会返回开发分支中,然后把实验性分支的那部分代码“复制”过来,具体操作如下:
- git status 查看当前项目的状态,如果有未保存的修改,就git add . 和 git commit -m “xxx” 保存下来
- 假设我们需要的是 feat-1 这个分支的某个 commit ,使用 git log –oneline feat-1 查看最近这个分支的所有 commit 记录,如
c843c37 (feat-1) enable user to login with phone number
492bbb6 (HEAD -> master, origin/master) update readme
记下对应的 commit 的 hash 值,即开头的7个字符乱码 如上图的 c843c37
- 使用 git cherry-pick c843c37 将这个 commit 对应的代码复制到当前分支
另外 git cherry-pick 有时还可以用来救场 —— 找回“丢失”的代码,前提是能找到对应的 commit hash 值。
使用git的一些原则
- 永远记得 git status 和 git log –oneline 来确认当前分支的状态
- 宁愿临时制造一些无用的 commit 来保证代码不会丢失,也不要轻信自己的记忆力
- 谨慎(最好能避免)使用 git stash ,极易造成代码丢失
- 认真对待、编写每次的 commit message —— 它们能在关键时刻救你一命
- 必要的时候可以创建一些临时的分支写实验性的代码,而不是依赖 git reset 撤销 commit —— 大多数人在 git reset 的时候容易犯错误