• git grep <关键词> :搜索含有关键词的文件
  • git blame <文件名>:查看指定文件每一行的提交人和提交时间
  • git log -p <文件名>:查看指定文件的每一次提交和改动

撤销提交

教程:如何撤销 Git 操作?

  1. 撤销提交:在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化。它不会改变过去的历史,所以是首选方式,没有任何丢失代码的风险。

    语法:git revert [倒数第一个提交] [倒数第二个提交]

    参数:

    • --no-edit:执行时不打开默认编辑器,直接使用 Git 自动生成的提交信息。
    • --no-commit:只抵消暂存区和工作区的文件变化,不产生新的提交。

    例子:

    # 
    git revert HEAD
    
  2. 丢弃提交:让最新提交的指针回到以前某个时点,该时点之后的提交都从历史中彻底消失。

    语法:git reset [last good SHA]

    参数:

    • --hard:reset 默认不改变工作区的文件(但会改变暂存区),--hard 参数可以让工作区里面的文件也回到以前的状态。
  3. 替换上一次提交:产生一个新的提交对象,替换掉上一次提交产生的提交对象。如果暂存区有发生变化的文件,会一起提交到仓库。

    语法:git commit --amend -m <message>

  4. 撤销工作区的文件修改:将文件在工作区的修改撤销到最近一次暂存区或版本库的内容。先找暂存区,如果该文件有暂存的版本,则恢复该版本,否则恢复上一次提交的版本。

    语法:git checkout -- [filename]

    注意:工作区的文件变化一旦被撤销,就无法找回了。

  5. 从暂存区撤销文件

    语法:git rm --cached [filename]

  6. 撤销当前分支的变化

    # 新建一个 feature 分支,指向当前最新的提交
    # 注意,这时依然停留在当前分支
    $ git branch feature
    
    # 切换到这几次提交之前的状态
    $ git reset --hard [当前分支此前的最后一次提交]
    
    # 切换到 feature 分支
    $ git checkout feature
    

    上面的操作等于是撤销当前分支的变化,将这些变化放到一个新建的分支。

问题代码定位

教程:git bisect 命令教程

git bisect: 将代码提交的历史,按照二分法不断缩小定位,直到范围缩小到某一次代码提交。

# 1.启动查错
git bisect start [终点] [起点]

# 2.1.标识本次提交没有问题,并自动切换到后半段的中点
git bisect good
# 2.2.标识本次提交有问题,并自动切换到后半段的中点
git bisect bad
# 直到出现成功找出有问题的那一次提交为止,提示:b47892 is the first bad commit

# 3.退出查错,回到最近一次的代码提交
git bisect reset

YOLO