一些实用装X的Git命令

2019-12-04 12:31:27 浏览数 (1)

本文作者: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

  1. git reset
代码语言:javascript复制
$ 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:
    #   ...
  1. git revert
代码语言:javascript复制
$ 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

常用技巧

  1. 有时候是不是觉得每次使用https协议跟github连接时,都要输入账号密码,很烦呀。用过svn的都知道,svn是存在一个文件来存储账号密码的,那么在git中也是可以这么做的,只需要轻松的一次命令。
代码语言:javascript复制
// 自动保存相应url对应的账号密码
git config --global credential.helper store
  1. 有时候可能你需要配置代理~,当然如果公司中有自己的gitlab的话,可以为某个具体的项目(--local,存在于.git/config)配置,覆盖全局的配置(--global,存在于~/.gitconfig)。
代码语言:javascript复制
git config --global http.proxy http://proxy.com
git config --global https.proxy http://proxy.com
  1. 为命令配置别名,可能这个不是特别需要~但是还是可以装一下X!
代码语言:javascript复制
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
  1. ... and so on

Reference

文中提到操作可能对于我来说还是比较经常的操作,可能有些经常使用git rebase等的命令 ,git远不止这些,一个版本控制工具的原理,或者说分支策略的最佳实践等等,还是可以了解一下的,还有不少可以挖掘!

《Pro Git》

0 人点赞