查看提交历史

  1. git log
  2. git log -p # 显示每次提交的内容差异
  3. git log -2 # 显示最近的 n 条提交
  4. git log --stat # 在底部显示简要的增改行数统计
  5. git log --pretty=oneline|short|full|fuller # 指定使用完全不同于默认格式的方式展示
  6. git log --oneline # --pretty=oneline --abbrev-commit 的简化用法,--abbrev-commit仅显示 SHA-1 的前几个字符,而非所有的 40 个字符
  7. git log --since='2018-01-20' # 显示指定时间之后的提交
  8. git log --until, --before # 显示指定时间之前的提交
  9. git log --author # 显示指定作者相关的提交
  10. git log -p --filepath # 某个文件或者路径的提交情况

显示文件中对每一行进行修改的最近一次提交

  1. git blame file

版本回退与撤销提交

git reset 回退本地仓库,将HEAD指向历史中的某次提交,HEAD会往后移动。

  1. git reset HEAD~n # 撤销最近n次提交 默认为--mixed
  2. git reset --soft HEAD~1 # 回退1个版本, 且将这次提交的所有变更都移动到暂存区
  3. git reset --mixed HEAD~1 # 回退1个版本,会重置暂存区,将这次提交的所有变更都移动到未暂存阶段
  4. git reset --hard HEAD~1 # 回退1个版本,会重置暂存区,将这次提交的所有变更都重置到上次提交的版本

git revert 产生一个新的提交来撤销某次提交的修改,HEAD会往前移动。

  1. git revert HEAD 撤销前一次 commit
  2. git revert HEAD^ 撤销前前一次 commit
  3. git revert {commit} 撤销指定的commit

revertcommit是一个merge commit时,需要设置-m参数指定出保留哪条分支上的内容,因为merge合并时是将两个分支合并。使用git log可以查看合并的commit的两个父commit

  1. git log
  2. ---------------------------------------------------------------------------------------------------
  3. commit 6ac7525a897529bf8c6cbb87ec41628f87421975 (origin/develop)
  4. Merge: 1bdc2073 81de5e42 # 两个父commit
  5. Author: xstoop <xstoop.xu@islide.cc>
  6. Date: Mon Jun 29 10:29:24 2020 +0800
  7. Merge branch 'feature/update_embed' into develop
  8. ....
  9. -----------------------------------------------------------------------------
  10. git revert -m 1 6ac7525a897529bf8c6cbb87ec41628f87421975 # 保留第一个父commit的内容
  11. # git revert -m 2 6ac7525a897529bf8c6cbb87ec41628f87421975 保留第二个父commit的内容
  12. -----------------------------------------------------------------------------
  13. [develop 12798294] Revert "Merge branch 'feature/update_embed' into develop" # 产生一个新的提交
  14. 2 files changed, 8 deletions(-)
  15. -----------------------------------------------------------------------------

注意:当使用了git revert撤销一个merge commit并保留一个分支内容后,如果需要再次合并另一个分支的内容,直接合并只会得到另一个分支在使用git revert后提交的新的commit,因为之前的commit已经被撤销合并了。如果仍然需要全部合并,需要将使用git revert产生的那个commit给撤销掉,即需要撤销之前的撤销。