Git 使用小技巧

一直使用 Sourcetree 傻瓜化操作 Git,确实方便,不过日常也会遇到一些使用图形化界面无法解决的问题,汇聚在此,不定期更新。

git logo

修改提交用户名与邮箱

公司 git 提交设置了限制,类似 xxx@example-inc.com 这样的邮箱才可 push,这里总结了下修改 git 提交的各种方式。

修改全局设置

这是最一劳永逸的方式,直接全局修改即可。

git config --global user.name username
git config --global user.email username@example.com

修改本地设置

当然更加灵活的方式是修改本地项目的配置,这里提供两种方式,其实也都大同小异。

方法一:修改配置文件

cd 到当前项目目录下 .git 隐藏目录,编辑 config 文件:

cd your_project_floder/.git
vim config
[user]
    name = username
    email = username@example.com

方法二:命令行修改

进入项目的 .git 目录,类似修改全局配置,需要去掉 --global 参数:

cd your_project_floder/.git
git config  user.name username
git config  user.email username@example.com

修改上一次提交

不过跟多的情况是,已经提交的代码 push 的时候被拒绝提交,那我们需要修改上一次提交的用户名与邮箱,使用如下命令即可。

git commit --amend --author="username <username@example.com>"

修改本地所有提交

假如本地不止上一次的提交都是错误的,那么需要修改所有不符合提交规则的邮箱。在项目根目录创建文件 git-author-rewrite.sh,并在其中填入以下内容:

#!/bin/sh
git filter-branch --env-filter '
    OLD_EMAIL="your-old-email@example.com"
    CORRECT_NAME="Your Correct Name"
    CORRECT_EMAIL="your-correct-email@example.com"
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
' --tag-name-filter cat -- --branches --tags

将相关变量修正为你实际的值

  • OLD_EMAIL – 旧的邮箱
  • CORRECT_NAME – 新的用户名
  • CORRECT_EMAIL – 新的邮箱

执行该脚本:

sh git-author-rewrite.sh

得到如下输出:

Rewrite 74d600cb62c4a8b7ceceacf1c0ef60ca2fe194f8 (1/2) (0 seconds passed, 
remainRewrite 478b07c3450bedd3820ba7cde2efadc4ee285587 (2/2) (0 seconds passed, 
#...  
Ref 'refs/heads/blog' was rewritten
Ref 'refs/heads/master' was rewritten

最后 git log 下看下修改确认无误后就能愉快的 git push 了。

https://help.github.com/articles/changing-author-info/

恢复已经删除的 stash

如果运行了 git stash drop 错误删除了 stash 暂存区中的记录可以用如下方式找回。

查找悬空对象(dangling object)

git 中把 commit 或者 stash 删了后,并不是真正的删除,而是变成了悬空对象(dangling object)。我们只要把把这悬空对象找出来。

git fsck 命令可运行仓库的一致性检查,展示所有未被其他对象引用的所有对象,也就是“悬空对象” 。关于 git fsck 命令完整参数在此:https://git-scm.com/docs/git-fsck。这里我们使用 git fsck --lost-found 命令,这个命令可能需要点时间,随后可列出所有悬空对象的列表。

git fsck --lost-found

Checking object directories: 100% (256/256), done.
dangling commit 3471f3016af43b053849b3d9baebe5e407fd5d93

至于那个才是误删的 stash ,需要 git show + 完整哈希字串查看校验一下。

git show 3471f3016af43b053849b3d9baebe5e407fd5d93

commit 3471f3016af43b053849b3d9baebe5e407fd5d93
Merge: 481dbcf faf6542
Author: username <username@example.com>
Date:   Fri Jul 27 10:53:44 2018 +0800
    
    WIP on master: 481dbcf init
    
diff --cc test.txt
index 3b18e51,3b18e51..23f0c5c
--- a/test.txt
+++ b/test.txt
@@@ -1,1 -1,1 +1,4 @@@
  hello world
++
++
++sssss

恢复 stash

上文通过 git show 确认了 674c0618ca7d0c251902f0953987ff71860cb067 即为我们误删的 stash 暂存,那么可使用 git merge 将其恢复。

git merge 674c0618ca7d0c251902f0953987ff71860cb067

Updating 481dbcf..3471f30
Fast-forward
 test.txt | 3 +++
 1 file changed, 3 insertions(+)

git log 一下确认操作没有问题。

git log
commit 3471f3016af43b053849b3d9baebe5e407fd5d93 (HEAD -> master)
Merge: 481dbcf faf6542
Author: username <username@example.com>
Date:   Fri Jul 27 10:53:44 2018 +0800

    WIP on master: 481dbcf init

commit faf6542e9747f4fd63a64ac200d6f3f8dc5fce28
Author: username <username@example.com>
Date:   Fri Jul 27 10:53:44 2018 +0800

    index on master: 481dbcf init

commit 481dbcf3fb68cdec2491bfb543ec3279ab83ab5d
Author: username <username@example.com>
Date:   Fri Jul 27 10:53:19 2018 +0800

    init

多平台换行符号的问题 (LF or CRLF)

TODO

发表评论

电子邮件地址不会被公开。 必填项已用*标注