设置用户名和邮箱
全局设置方式:1
2$ git config --global user.name "hewentian"
$ git config --global user.email "wentian.he@qq.com"
单独对某个仓库设置方式:1
2$ git config user.name "hewentian"
$ git config user.email "wentian.he@qq.com"
可以通过如下方式查看设置结果:1
2$ git config user.name
$ git config user.email
创建SSH KEY
1 | $ ssh-keygen -t rsa -C "youremail@example.com" |
下面记录一些经常会用到的命令:
查看远程分支, 加上 -a 参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话),不加 -a 则查看本地分支:1
2
3
4
5
6$ git branch -a
dev
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/prod
删除远程分支和tag, 在Git v1.7.0 之后,可以使用这种语法删除远程分支:1
$ git push origin --delete <branchName>
删除tag这么用:1
$ git push origin --delete tag <tagname>
否则,可以使用这种语法,推送一个空分支到远程分支,其实就相当于删除远程分支:1
$ git push origin :<branchName>
这是删除tag的方法,推送一个空tag到远程tag:1
2$ git tag -d <tagname>
$ git push origin :refs/tags/<tagname>
两种语法作用完全相同。
将远程git仓库里的指定分支拉取到本地(本地不存在的分支)
当我想从远程仓库里拉取一条本地不存在的分支时:1
$ git checkout -b 本地分支名 origin/远程分支名
这个将会自动创建一个新的本地分支,并与指定的远程分支关联起来。
例如远程仓库里有个分支dev2,我本地没有该分支,我要把dev2拉到我本地:1
$ git checkout -b dev2 origin/dev2
若成功,将会在本地创建新分支dev2,并自动切到dev2上。
如果出现提示:
fatal: Cannot update paths and switch to branch 'dev2' at the same time.
Did you intend to checkout 'origin/dev2' which can not be resolved as commit?
表示拉取不成功。我们需要先执行1
$ git fetch
然后再执行下面的命令即可1
$ git checkout -b 本地分支名 origin/远程分支名
Git 比较不同版本文件差异的常用命令格式:1
2
3
4
5
6
7$ git diff 查看尚未暂存的文件中更新了哪些部分
$ git diff filename 查看尚未暂存的某个文件更新了哪些部分
$ git diff –-cached 查看已经暂存起来的文件中和上次提交的版本之间的差异
$ git diff –-cached filename 查看已经暂存起来的某个文件和上次提交的版本之间的差异
$ git diff <commitId1> <commitId2> 查看某两个版本之间的差异
$ git diff <commitId1>:filename <commitId2>:filename 查看某两个版本的某个文件之间的差异,方式一
$ git diff <commitId1> <commitId2> -- filename 查看某两个版本的某个文件之间的差异,方式二
在git中查看历史的命令主要是git log,要查看某个文件的修改历史:1
$ git log -- begin.txt
可以添加不同的选项让输出的内容或格式有所不同。1
$ git log -p -- begin.txt
-p 选项可以输出每次提交中的diff, -p会把输出搞得很长、很乱,不容易找到重点。
还有另外一种方式是:1
$ git log --pretty=oneline -- filename
在log 命令中加入 –pretty=oneline 选项只能看到comments,看不到提交的用户和日期。
这也能够让我们集中注意力快速找到关注的提交记录。
然后使用 git show命令查看完整的提交内容。
当然,除了命令行工具您也可以使用GUI程序查看文件的历史记录:
gitk filename
查看历史中的文件内容
当我们使用 git log 命令找到了某次提交,并且想看看这次提交时文件的完整内容。
这时,我们需要使用 git show 命令:1
$ git show <commitId>:filename
也许此时你并不是看看就算了,你想要使用这个版本的文件更新工作区中的文件。
直接从 git show 命令的输出中拷贝内容是个不错的选择。
但也可以通过组合使用不同的命令来实现:1
2$ git checkout <commitId> --filename
$ git reset filename
此时只有工作区被更新了(你也可以把他当做是一次回滚操作)。
git 将单个文件恢复到历史版本的正确方法如下:
1 | $ git log 要恢复的文件路径 |
git的.gitignore规则不生效的解决办法
有时候定义了规则后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
1 | $ git rm -r --cached . |
在开发的过程中,想知道远程的仓库是否有同事提交代码可以使用如下命令
1 | $ cd {your_repo_dir} |
git远程删除分支后,本地 git branch -a 依然能看到的解决办法
远程删掉 release/1.1 分支后,本地使用如下命令依然还能看到它,如下:1
2
3
4
5
6
7
8
9
10$ git fetch
$ git branch -a
develop
* developLocal
master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/feature/develop_1.1
remotes/origin/master
remotes/origin/release/1.1 # 看,它还在
此时我们使用如下命令,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16$ git remote show origin
* remote origin
Fetch URL: ssh://git@gitlab.hewentian.com:12022/hexo.git
Push URL: ssh://git@gitlab.hewentian.com:12022/hexo.git
HEAD branch: master
Remote branches:
develop tracked
feature/develop_1.1 tracked
master tracked
refs/remotes/origin/release/1.1 stale (use 'git remote prune' to remove) # 提示该分支已经不存在了
Local branches configured for 'git pull':
develop merges with remote develop
master merges with remote master
Local refs configured for 'git push':
develop pushes to develop (up to date)
master pushes to master (local out of date)
根据提示,使用如下命令,删掉本地的远程不存在的分支1
2
3
4$ git remote prune origin
Pruning origin
URL: ssh://git@gitlab.hewentian.com:12022/hexo.git
* [pruned] origin/release/1.1
这样就删除了那些远程仓库不存在的分支
git status 显示中文和解决中文乱码
在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码。
解决方案,在bash提示符下输入:1
$ git config --global core.quotepath false
core.quotepath设为false的话,就不会对0x80以上的字符进行quote,中文显示正常。
修复生产问题的方法
在某些情况下,本地可能提交了很多次代码,但此时发现生产有个严重BUG需马上修复,但本地的代码还不能推到生产。此时的解决方法是:
- 先找到生产上面最新的
commit id
,然后在本地以此commit id
创建一个新分支; - 在新分支修复,然后将此分支推到生产;
- 在生产构建该分支。
相关操作如下:1
2
3
4
5
6$ git pull origin master
$ git log
$ git checkout -b fix20191106 03b361719f93a74bb5a5cdc22fd4f621adc2822a
$ git add {修改过的文件}
$ git commit -m "修改原因说明"
$ git push origin fix20191106
将本地仓库提交到多个远程仓库
一般情况下,在本地有一个gitLab,在生产也有一个gitLab。我们要将本地代码提交到生产的gitLab,方法如下:
将本地仓库和生产的远程仓库绑定:
cd ~/ProjectD/gitHub/bigdata
git remote add prod git@github.com:hewentian/bigdata.git
在本地切换到和生产仓库一样的分支,然后提交到生产:
git checkout develop
git push prod develop
git本地分支和远程分支建立追踪关系的三种方式
手动建立追踪关系
$ git branch --set-upstream-to=<远程主机名>/<远程分支名> <本地分支名>
push时建立追踪关系
$ git push -u <远程主机名> <本地分支名>
加上-u参数,这样push时,本地指定分支就和远程主机的同名分支建立追踪关系。
- 新建分支时建立跟踪关系
$ git checkout -b <本地分支名> <远程主机名>/<远程分支名>