Git修改提交记录的提交信息

修改前提交历史记录如下图:
修改前

修改提交记录的提交信息有两种情况:

  • 修改最近一次提交的提交信息
    使用命令git commit --amend,进入到下图:
    改前
    修改提交信息,然后保存退出,
    使用命令git log,查看历史提交记录,可以发现最近一次提交信息已被修改,如下图:
    修改后提交信息

如果想要修改最近三次提交信息,或者那组提交中的任意一个提交信息呢?那就是我们要说的第二种情况了:

  • 修改多个提交信息
    使用命令git rebase -i 节点,节点即HEAD~2^HEAD~3或某一次的提交记录的哈希值;
    例:git rebase -i HEAD~3进入下图:
    进入rebase -i交互界面

注意:
1. 上面列出的历史提交记录信息正好和我们提交的时间是相反的,我们最近一次的提交反而在最下面;
2. 可以看到,这个文件相当于一个与Git的交互界面,你可以使用不同的命令达到后续不同的操作;
3. 上图中命令在附录1中说明.

第一方法,使用reword操作:
如果只需要修改提交历史信息,把pick修改为reword即可,在列出的记录里,需要修改哪个提交信息,就把这条记录前的pick修改为reword,保存退出后,Git就会弹出每个提交信息的编辑信息的编辑器,编辑完成退出后,就会弹出下一个,直到全部完成。

第二方法,使用edit操作,这个方法能使用所有git commit --amend的功能,比如修改提交者的邮箱信息等等:
这里我们只修改倒数第二次的提交信息,把第二个pick修改为edit,如果你要修改这三次所有的提交信息,可以都把pick都修改为edit,如下图:
修改你要使用的操作命令

保存并退出编辑器后如下图:
Git提示

接下来,使用命令git commit --amend来修改提交信息,你发现了么,是不是和上一种情况很像!
修改提交信息,然后退出编辑器。最后,运行git rebase --continue,这个命令将会自动地应用另外两个提交,然后就完成了。
如果需要将不止一处的pick改为edit,需要在每一个修改为edit的提交上重复这些步骤。每一次,Git都将会停止,让你修正提交,然后继续直到完成。

使用命令git log,查看历史提交记录,可以发现倒数第二次的提交信息已被修改,如下图:
修改后提交信息


警告:这是一个变基命令-在HEAD~3..HEAD范围内的每一个提交都会被重写,无论你是否修改信息。不要涉及任何已经推送到中央服务器的提交-这样做会产生一次变更的两个版本,因而会使他人困惑。

附录1

命令名称 说明
pick 使用提交,不做修改
reword 使用提交,但编辑提交信息
edit 使用提交,但会为了使用amend命令停止
squash 使用提交,但会把列表里后面的提交压缩到第一次合并成一次提交
fixup 和使用squash类似,但不会保留提交信息
exec 使用shell命令,待测试
drop 删除掉某一次提交,此次修改将全部消失(危险)

自动化检测PHP语法和编程规范(Git pre-commit)

自动化检测PHP语法和编程规范

使用到的知识点:

  • 命令php -l检测文件语法,可以通过php -h查看PHP CLI支持哪些操作,如下:.
[:~]$ php -h
Usage: php [options] [-f] <file> [--] [args...]
   php [options] -r <code> [--] [args...]
   php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
   php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
   php [options] -S <addr>:<port> [-t docroot] [router]
   php [options] -- [args...]
   php [options] -a

  -a               Run interactively
  -c <path>|<file> Look for php.ini file in this directory
  -n               No configuration (ini) files will be used
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -f <file>        Parse and execute <file>.
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -r <code>        Run PHP <code> without using script tags <?..?>
  -B <begin_code>  Run PHP <begin_code> before processing input lines
  -R <code>        Run PHP <code> for every input line
  -F <file>        Parse and execute <file> for every input line
  -E <end_code>    Run PHP <end_code> after processing all input lines
  -H               Hide any passed arguments from external tools.
  -S <addr>:<port> Run with built-in web server.
  -t <docroot>     Specify document root <docroot> for built-in web server.
  -s               Output HTML syntax highlighted source.
  -v               Version number
  -w               Output source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

  args...          Arguments passed to script. Use -- args when first argument
                   starts with - or script is read from stdin

  --ini            Show configuration file names

  --rf <name>      Show information about function <name>.
  --rc <name>      Show information about class <name>.
  --re <name>      Show information about extension <name>.
  --rz <name>      Show information about Zend extension <name>.
  --ri <name>      Show configuration for extension <name>.


  • 安装PHP编程规范工具php-cs-fixer,可以在GitHub上查看详细信息.
    1. 下载:wget http://cs.sensiolabs.org/download/php-cs-fixer-v2.phar -O php-cs-fixer
    2. 给予执行权限:sudo chmod a+x php-cs-fixer
    3. 把文件移动到自己喜欢的目录,我一般是放在/usr/local/bin下:sudo mv php-cs-fixer /usr/local/bin/php-cs-fixer

  • 利用Git的钩子pre-commit达成commit前自动检测功能.
    这个钩子,顾名思意就是在git commit之前会触发,此钩子结合网上和朋友的写法,感谢他们.
    首先,点击查看这个文件,复制文件内容.
    然后,进入到自己的项目下git钩子目录:cd path/to/your/project/.git/hooks,复制pre-commit.sample文件并重命名:cp pre-commit.sample pre-commit,把文件内容替换为上一步复制的内容.
    最后,每次commit时就会先检测语法和规范是否正确,不正确会提示文件名和你需要规范代码格式的命令,简单测试如下图:.
    php-cs-fixer pre-commit

git与git-svn的对比使用

上个公司,在我推广和普及git时,他们使用的是svn进行版本管理,我当时为了配合使用svn,就是选择使用的git-svn.

git及git-svn使用:

下载svn源码:git svn clone http://xxxx myproject (相当于svn checkout)

建立临时分支:git branch aaa
切换到临时分支:git checkout aaa
提交:git add .
提交确认:git commit
提交及确认:git commit -a (git add . + git commit,但新增文件必须要git add .)

切换回master分支:git checkout master
合并临时分支:git merge aaa
删除临时分支:git branch -d aaa

从svn更新: git svn rebase (相当于svn update)
提交至svn: git svn dcommit (相当于svn commit)

查看状态:git status
查看分支:git branch (*号代表现在在哪个分支上)
查看diff:git diff,git diff head