在使用 git 的过程中,总有一天你会遇到下面的问题:)
这些也是在开发过程中很常见的问题,以下也是作者的经验之谈,有不对的地方还请指出。

# 最后一次 commit 信息写错了

如果只是提交信息写错了信息,可以通过以下命令单独修改提交信息

$ git commit --amend

注意: 通过这样的过程修改提交信息后,相当于删除原来的提交,重新提交了一次。所有如果你在修改前已经将错误的那次提交 push 到服务端,那在修改后就需要通过 git pull 来合并代码(类似于两个分支了)。
通过 git log --graph --oneline 查看就会发现两个分支合并的痕迹

# 最后一次 commit 少添加一个文件

$ git add file1
$ git commit --amend

# 最后一次 commit 多添加一个文件

$ git rm --cached file1
$ git commit --amend

# 移除 add 过的文件

#方法一
$ git rm --cache [文件名]
#方法二
$ git reset head [文件/文件夹]

# 回退本地 commit(还未 push)

这种情况发生在你的本地仓库,可能你 add,commit 以后发现代码有点问题,打算取消提交,用到下面命令

#只会保留源码(工作区),回退 commit (本地仓库) 与 index(暂存区)到某个版本
$ git reset <commit_id>   #默认为 --mixed 模式
$ git reset --mixed <commit_id>
#保留源码(工作区)和 index(暂存区),只回退 commit(本地仓库)到某个版本
$ git reset --soft <commit_id>
#源码(工作区)、commit(本地仓库)与 index(暂存区)都回退到某个版本
$ git reset --hard <commit_id>

当然有人在 push 代码以后,也是用 reset --hard 回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变化。

!!! 可以通过 git push –force 将本地的回退推送到服务端,但是除非你很清楚在这么做,不推荐.

所以,这种情况你要使用下面的方式了。

# 回退本地 commit(已经 push)

对于已经把代码 push 到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致。你要用到下面的命令

$ git revert <commit_id>

注意:

  1. git revert 用于反转提交,执行命令时要求工作树必须是干净的。
  2. git revert 用一个新的提交来消除一个历时提交所做出的修改

# 回退单个文件的历史版本

#查看历史版本
git log 1.txt
#回退该文件到指定版本
git reset [commit_id] 1.txt
git checkout 1.txt
#提交
git commit -m "回退1.txt的历史版本"

# 修改提交历史中的 author 和 email

旧的:author: Old-Author email: old@mail.com
新的:author: New-Author email: new@mail.com
1. 在 git 仓库内创建下面的脚本,如 change.sh

# !/bin/sh
git filter-branch --env-filter '
an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"
if [ "$GIT_COMMITTER_EMAIL" = "old@mail.com" ]
then
    cn="New-Author"
    cm="new@mail.com"
fi
if [ "$GIT_AUTHOR_EMAIL" = "old@mail.com" ]
then
    an="New-Author"
    am="new@mail.com"
fi
export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'

2. 运行脚本

$ sh change.sh

持续更新中~~~