git的基本使用
修改Github历史提交记录中的username和email信息
GitHub提交时,发现github没有统计贡献值,多半是由于邮箱没有关联。
下面是解决方法的具体步骤。
克隆项目,并切换到项目根目录下:
1
2
| $ git clone git@github.com:meizhaohui/vueblog.git
$ cd vueblog
|
1
2
3
4
5
6
7
8
| $ git config --global user.email
mistake@email.com
$ git config user.email
mistake@email.com
$ git config --global user.name
Zhaohui Mei
$ git config user.name
Zhaohui Mei
|
可以发现全局的和本项目的邮箱都是错的邮箱。
将本地邮箱地址改成正确的邮箱。
1
2
3
4
5
6
| $ git config --global user.email "mzh.whut@gmail.com"
$ git config user.email "mzh.whut@gmail.com"
$ git config --global user.email
mzh.whut@gmail.com
$ git config user.email
mzh.whut@gmail.com
|
项目根目录下面修改脚本文件,脚本内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ cat change_history_commit_username_email.sh
##!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="mistake@email.com" # 填入旧的、错误的email
CORRECT_NAME="Zhaohui Mei" # 填入修改后的username
CORRECT_EMAIL="mzh.whut@gmail.com" # 填入修改后的email
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
|
下载脚本 change_history_commit_username_email.sh
修改脚本中的OLD_EMAIL、CORRECT_NAME、CORRECT_EMAIL等参数
1
2
3
| $ sh change_history_commit_username_email.sh
Rewrite 3473c357c13a91716e97e9ae572a8db195fafbdf (22/25) (1 seconds passed, remaining 0 predicted)
Ref 'refs/heads/master' was rewritten
|
::: tip 提示
脚本需要放置在项目的根目录下面,否则会提示如下异常:
1
2
| $ sh change_history_commit_username_email.sh
You need to run this command from the toplevel of the working tree.
|
:::
1
2
3
4
5
6
7
8
9
10
| $ git push --force --tags origin 'refs/heads/*'
Enumerating objects: 321, done.
Counting objects: 100% (321/321), done.
Delta compression using up to 8 threads
Compressing objects: 100% (178/178), done.
Writing objects: 100% (321/321), 2.56 MiB | 569.00 KiB/s, done.
Total 321 (delta 125), reused 181 (delta 87)
remote: Resolving deltas: 100% (125/125), done.
To https://github.com/meizhaohui/vueblog.git
+ 3473c35...1e6ed60 master -> master (forced update)
|
提交完成后,可以发现Github个人页面上面的贡献图示位置已经变成绿色,说明修改成功。
参考: 修改Github历史提交记录中的username和email信息
github合并分支到master
在写项目的时候习惯创建一个dev分支用于更新代码,等到整个或者阶段性完成的时候再合并到master上
步骤如下:
1
2
3
4
5
6
7
8
9
10
11
| ## 切换到master分支
$ git checkout master
Switched to branch 'master'
## 将dev分支的代合并到master
$ git merge dev
## 查看状态
git status
## 推送
git push origin master
|
github设置免密上传文件
生成密钥
生成密钥:
1
| ssh-keygen -t rsa -C "mzh.whut@gmail.com"
|
你运行时,将命令中的mzh.whut@gmail.com替换成你自己的邮箱即可。运行以上命令生成密钥,运行过程中一路按回车键(Enter)。命令执行完成后,会在家目录中生成.ssh目录,并生成两个文件:id_rsa(密钥)和id_rsa.pub(公钥),复制公钥id_rsa.pub文件中的内容复制。
将公钥保存到github中
- 登陆
github后,依次打开 Settings-> SSH and GPG keys,点击 New SSH key ,将刚才复制的公钥id_rsa.pub内容粘贴到Key输入框中,并指定一个Title标题,并点击Add SSH Key保存。
本地git环境配置
设置用户名和邮箱
1
| $ git config --global user.name "Zhaohui Mei"
|
你执行时请将Zhaohui Mei替换成你的名字,建议使用英文字符组成的名字。
1
| $ git config --global user.email "mzh.whut@gmail.com"
|
你执行时请将mzh.whut@gmail.com替换成你的邮箱地址,建议与github上面你配置的邮箱地址保持一致。
设置git凭证存储
如果你使用的是SSH方式连接远端,并且设置了一个没有口令的密钥,这样就可以在不输入用户名和密码的情况下安全地传输数据。 然而,这对HTTP协议来说是不可能的——每一个连接都是需要用户名和密码的。 “store“模式会将凭证用明文的形式存放在磁盘中,并且永不过期。 这意味着除非你修改了你在Git服务器上的密码,否则你永远不需要再次输入你的凭证信息。
新建存储凭证数据的文件,使用以下命令新建凭证存储文件:
1
| $ touch ~/.git-credentials
|
1
| $ git config --global credential.helper store
|
注:git配置文件存放路径为:~/.gitconfig
~/.git-credentials文件中,如果密码中包含特殊字符,需要进行urlEncode转义,如@符号需要写作%40,列举部分转换规则:
| 字符 | urlEncode |
|---|
| # | %23 |
| $ | %24 |
| + | %2b |
| @ | %40 |
| : | %3a |
| = | %3d |
| ? | %3f |
下载远程仓并测试修改上库
1
| $ git clone https://github.com/meizhaohui/vueblog.git
|
- 下载完成后,对下载的文件做一些修改,并保存
- 使用
git diff查看修改差异:
1
| $ git commit -m"commit log" (注:此处不要使用单引号包裹commit log信息)
|
-查看远程仓信息:
1
| $ git push origin master:master (注:第一个master为本地分支,第二个master为远程分支)
|
检查某个文件是否被git忽略
检查change_history_commit_username_email.sh文件是否被git忽略,被忽略的文件不会被git提交到仓库中:
1
2
| $ git check-ignore -v change_history_commit_username_email.sh
.gitignore:112:change_history_commit_username_email.sh change_history_commit_username_email.sh
|
以上结果可知.gitignore的第112行规则忽略了该文件。我们对该文件做的任何修改都会被git忽略掉。