Git操作之高手过招

在使用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:[email protected]
新的:author:New-Author email:[email protected]
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" = "[email protected]" ]
then
    cn="New-Author"
    cm="[email protected]"
fi
if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ]
then
    an="New-Author"
    am="[email protected]"
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

忽略已提交的文件(.iml)

  1. 删除已提交的文件
# 删除项目中所有的.iml后缀的文件
$ find . -name "*.iml" | xargs rm -f
  1. 添加.gitignore文件
*.iml
/**/*.iml

统计某段时间内每个人的提交量

# 查询分支: pgsql-master
# 查询日期: 2023-11-30 ~ 2024-11-04
# 排除 Merge 的 commit: --no-merges
# 按 commit 数量进行排序
git log pgsql-master --since="2023-11-30" --until="2024-11-04" --no-merges --pretty="%an" | sort | uniq -c | sort -nr

持续更新中~~~


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [email protected]

×

喜欢就点赞,疼爱就打赏