本文作者:IMWeb 何璇 原文出处:IMWeb社区 未经同意,禁止转载
在日常工作中,也许你会使用类似svn、git这样的版本控制,协同开发工具。但是当项目不够大,不够复杂,或者说需求重要程度没有那么高时,我们常常只是简单地使用这类工具。
就比如我现在开发的需求,实际上就是用svn部署一个中心仓库,我直接checkout下来主干,开发提交。用git的话,实际上就是利用github或者部署的gitlab上新建远程仓库,再clone下来开发提交加push。
所以我们真的是在使用git嘛?其实在我的开发工作中,我还是需要git来为我完成一些特殊的工作的。下面我们来列举一些装X的命令吧(什么!你不会告诉我你不是用gitbash
等命令行的工具吧)~
Situation: 在遇到项目具有多个独立的功能时,在本地你可能会存在几条类似feature-*命名的分支,那么当你在开发其中一条功能分支A的时候,修改了一下此功能依赖的,且tracked by另一条功能分支B的文件(实际上这是常有的事),那么为了做好版本控制你不会将这个文件的修改提交到分支A上,但是在这种情况在git中,你还未提交时git实际上是不允许你切换分支的。
commands:
$ 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
Situation:
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
Situation:我们知道git checkout是用于切换分支的一个命令,但是我们却可以用它来干一些常用的事~比如:
commands:
$ 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
// 自动保存相应url对应的账号密码
git config --global credential.helper store
git config --global http.proxy http://proxy.com
git config --global https.proxy http://proxy.com
$ 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 rebase等的命令 ,git远不止这些,一个版本控制工具的原理,或者说分支策略的最佳实践等等,还是可以了解一下的,还有不少可以挖掘!