每日一剂—mysql事务锁 & git reflog

查找mysql事务锁

  • 查看事务和锁的信息mysql

    show engine innodb status;
  • explain内容解析git

    mysql> explain select * from t where cell="111111111111";
    +----+-------------+-------+-------+---------------+------+---------+-------+------+-------------+
    | id | select_type | table | type  | possible_keys | key  | key_len | ref   | rows | Extra       |
    +----+-------------+-------+-------+---------------+------+---------+-------+------+-------------+
    |  1 | SIMPLE      | t     | const | cell          | cell | 83      | const |    1 | Using index |
    +----+-------------+-------+-------+---------------+------+---------+-------+------+-------------+
    1 row in set (0.00 sec)
    • select_type:SIMPLE,这是一个简单类型的SQL语句,不含子查询或者UNION。sql

    • type:index,访问类型,即找到所需数据使用的遍历方式,潜在的方式:bash

      • ALL(Full Table Scan):全表扫描;
      • index:走索引的全表扫描;
      • range:命中where子句的范围索引扫描;
      • ref/eq_ref:非惟一索引/惟一索引单值扫描;
      • const/system:常量扫描;
      • NULL:不用访问表;

      上述扫描方式,ALL最慢,逐步变快,NULL最快。测试

    • possible_keys:NULL,可能在哪一个索引找到记录。code

    • key:PRIMARY,实际使用索引。(画外音:使用PK进行的全表扫描。)索引

    • ref:NULL,哪些列,或者常量用于查找索引上的值。事务

    • rows:1,找到所需记录,预估须要读取的行数。it

git-reflog

reflog 是一个很是实用的命令,你可使用这个命令去找回无心间删除的代码,或者去掉一些刚刚添加的却把仓库里的代码弄坏的内容。同时也能够拯救一下失败的 merge,或者仅仅是为了回退到以前的版本。innodb

  • 情景1:我刚恰好像搞错了一个很重要的东西,可是 git 有个神奇的时间机器能帮我复原!

    $ git reflog
    # reflog 能够查看在全部分支上所作的所有改动
    # 每个改动都会有一个编号 HEAD@(index)
    # 找到问题所在
    
    $ git reset HEAD@(index)
    # git 神奇的时间机器,将代码重置到指定位置
  • 情景2:我 commit 完才想起来还有一处小地方要修改!

    # 先作好修改
    $ git add . # or add 相关文件
    $ git commit --amend
    # 而后选择要不要保留或者更高 commit message
    # 如今你的 commit 已经包含最新的修改内容

    当我 commit 完而后跑测试的时候,常常忽然发现忘了在等于号前面加空格。虽然能够把修改过的代码再从新 commit 一下,而后 rebase -i 将两次揉在一块儿,不过上面的方法会比较快。

  • 情景3:我要改一下上一个 commit message!

    $ git commit -amend 
    # 而后能够更改 commit message

    当大家组对 commit message 有格式要求时,或者当你忘了中英文间要加空格,这个命令能救你狗命。

  • 情景4:我不当心把本应在新分支上的内容commit 到 master 了!

    # 先以现有 master 的状态建立一个新的分支
    $ git branch some-new-branch-name
    # 移除错误的 commit
    $ git reset HEAD~ --head
    
    $ git checkout some-new-branch-name
    # 如今的分支就含有全部你所须要的东西了

    注意: 这个指令必须在错误的 commit 后直接执行,若是你已经试了其余的方式,你可能就须要用 git reset HEAD@{number} 来代替 HEAD~ 了。

  • 情景5: 我不当心 commit 到错误的分支上了!

    # 撤回上一次 commit 可是保留改动
    $ git reset HEAD~ --soft
    $ git stash
    
    # 将改动提交到正确的分支
    $ git checkout name-of-the-correct-branch
    $ git stash pop
    $ git add . # or add individual files
    $ git commit -m "提交信息"
    # 如今的你改动已经成功 commit 到正确的分支上了

    也有不少人推荐了 cherry-pick 的解决方案,因此选哪一个就看你心情了。

    $ git checkout name-of-the-correct-branch
    
    # 将改动从错误的分支上摘取下来放到正确的分支上
    $ git cherry-pick name-of-the-wrong-branch
    
    # 而后再错误的分支上删除相应的改动
    $ git checkout name-of-the-wrong-branch
    $ git reset HEAD~ --hard
  • 情景6:我执行了 diff 可是啥也没出现

    $ git diff --staged

    Git 不会给经过 add 加入到 staging 区域里面的文件作 diff ,除非你加了 --staged 的标签,别怀疑了这是一个 feature 不是一个 bug,固然对于第一次碰到这个问题的人来讲仍是有些很差理解的。

    $ git checkout name-of-the-correct-branch
    
    # 将改动从错误的分支上取下来放到正确的分支上
    $ git cherry-pick name-of-the-wrong-branch
    
    # 而后再错误的分支上删除相应的改动
    $ git checkout name-of-the-wrong-branch
    $ git reset HEAD~ --hard
相关文章
相关标签/搜索