一直使用 Sourcetree 傻瓜化操作 Git,确实方便,不过日常也会遇到一些使用图形化界面无法解决的问题,汇聚在此,不定期更新。
修改提交用户名与邮箱
公司 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