本文作者:IMWeb 何璇 原文出处:IMWeb社区 未经同意,禁止转载
你真的在使用Git嘛?
在日常工作中,也许你会使用类似svn、git这样的版本控制,协同开发工具。但是当项目不够大,不够复杂,或者说需求重要程度没有那么高时,我们常常只是简单地使用这类工具。
就比如我现在开发的需求,实际上就是用svn部署一个中心仓库,我直接checkout下来主干,开发提交。用git的话,实际上就是利用github或者部署的gitlab上新建远程仓库,再clone下来开发提交加push。
所以我们真的是在使用git嘛?其实在我的开发工作中,我还是需要git来为我完成一些特殊的工作的。下面我们来列举一些装X的命令吧(什么!你不会告诉我你不是用gitbash
等命令行的工具吧)~
git stash
Situation: 在遇到项目具有多个独立的功能时,在本地你可能会存在几条类似feature-*命名的分支,那么当你在开发其中一条功能分支A的时候,修改了一下此功能依赖的,且tracked by另一条功能分支B的文件(实际上这是常有的事),那么为了做好版本控制你不会将这个文件的修改提交到分支A上,但是在这种情况在git中,你还未提交时git实际上是不允许你切换分支的。
commands:
代码语言:javascript复制$ git status
# on branch feature-1
# changes to be committed:
#
# modified: xxx.js
// 将当前修改储存
$ git stash
# save working ...
$ git checkout feature-2
$ ...
// 查看当前储存的修改
$ git stash list
stash@{0}: WIP on feature-1: xxx
stash@{1}: WIP on feature-1: xxx
stash@{2}: WIP on master: xxx
// 查看某个储存修改的具体
$ git stash show stash@{`index`}
// 将某个储存的修改应用到当前分支
$ git stash apply stash@{`index`}
// 将储存在栈顶的修改应用到当前分支
$ git stash pop
// 清除所有储存的修改
$ git stash clear
git reset / git revert
Situation:
- 产品开发过程中不可避免的总是会发生一些需求调整或者变更,这种现象的解决常常反映称舍弃某个文件的修改,那么这时候就是版本控制工具的天下了!想想以前还是将整个目录打包成压缩文件并给个label...
- 可能对于git新手来说,并不能很好地使用版本控制,往往将一堆文件的修改一次性地提交。那么当需要回滚的文件在那次提交或者需要将发布的版本回滚时,就非常麻烦了...
commands:
git reset
$ git status
# on branch master
# changes to be committed:
#
# modified: xxx.js
# modified: xxx
// 将当前分支的状态恢复为最近的提交(HEAD),重置所有已经add的修改
$ git reset
$ git status
# on branch master
# changes not staged for commit:
#
# modified: xxx.js
# modified: xxx
$ git log -4 --pretty=format:"%h %s"
1c002dd added cat-file
9b29157 added blame
35cfb2b updated README formatting
f3cc40e changed my name a bit
// 将当前分支的状态重置为从HEAD数第三个提交
// 如果加上--hard参数,那么下面的git status则为空,因为git reset会丢弃修改
// 相当于发布回滚
$ git reset HEAD~3
$ git log
35cfb2b updated README formatting
f3cc40e changed my name a bit
...
$ git status
# on branch master
# changes not staged for commit:
# ...
git revert
$ git log -4 --pretty=format:"%h %s"
1c002dd added cat-file
9b29157 added blame
35cfb2b updated README formatting
f3cc40e changed my name a bit
// 恢复某个提交所做的修改,并把撤销之后的修改提交
$ git revert HEAD~`index`
$ git revert `commit`(例如9b29157)
$ git log -4 --pretty=format:"%h %s"
d2912jn ...
1c002dd added cat-file
9b29157 added blame
35cfb2b updated README formatting
git checkout
Situation:我们知道git checkout是用于切换分支的一个命令,但是我们却可以用它来干一些常用的事~比如:
- 当我们想放弃一些还未提交的无用修改时,可以用checkout来还原文件的内容
- 当我们需要将版本回滚到比较久远的一个状态,或者说在分支合并之前的状态时,可以用git checkout来回滚。
commands:
代码语言:javascript复制$ git status
# on branch master
# changes not staged for commit:
# modified: index.html
// 丢弃某个文件还未提交的修改
$ git checkout index.html
$ git status
# nothing to commit, working directory clean
$ git log -4 --pretty=format:"%h %s"
1c002dd added cat-file
9b29157 added blame
35cfb2b updated README formatting
f3cc40e changed my name a bit
// 'detached HEAD' 将当前状态切换到35cfb2b这个提交的状态
$ git checkout 35cfb2b
# Note: checking out '35cfb2b'
# ...
$ ... (你甚至可以做些修改并提交)
// 保留当前的状态,在一个新建的分支上
$ git checkout -b hotfix
// 强行回滚远程master到本地的hotfix分支的状态
$ git push -f origin hotfix:master
常用技巧
- 有时候是不是觉得每次使用https协议跟github连接时,都要输入账号密码,很烦呀。用过svn的都知道,svn是存在一个文件来存储账号密码的,那么在git中也是可以这么做的,只需要轻松的一次命令。
// 自动保存相应url对应的账号密码
git config --global credential.helper store
- 有时候可能你需要配置代理~,当然如果公司中有自己的gitlab的话,可以为某个具体的项目(--local,存在于.git/config)配置,覆盖全局的配置(--global,存在于~/.gitconfig)。
git config --global http.proxy http://proxy.com
git config --global https.proxy http://proxy.com
- 为命令配置别名,可能这个不是特别需要~但是还是可以装一下X!
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
- ... and so on
Reference
文中提到操作可能对于我来说还是比较经常的操作,可能有些经常使用git rebase等的命令 ,git远不止这些,一个版本控制工具的原理,或者说分支策略的最佳实践等等,还是可以了解一下的,还有不少可以挖掘!
《Pro Git》