Git简介
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git是一个免费的开源分布式版本控制系统,旨在快速高效地管理项目的所有文件。Git中的项目被称为仓库(repository),或者是代码库。
学习工作中,越来越习惯使用Git,本文记录一下常用的Git命令,方便以后查阅。
参考文档:
初始配置
用户名和邮箱
1、全局配置
1 | git config --global --list |
2、针对单独项目配置
1 | git config --list |
提交的时候,如果项目自身没有配置信息就会使用全局配置,有配置就会使用单独的配置信息。
免密上传下载
本节以github为例,gitlab的配置方法类似。
使用ssh密钥
1、生成ssh密钥
1 | ssh-keygen -t rsa -C "voidking@qq.com" |
按3个回车,密码为空。
在C:\Users\Administrator\.ssh
下,得到两个文件id_rsa和id_rsa.pub。
需要注意的是,命令中的-C参数,后面跟的内容是注释。也就是说,内容随意,与github完全无关。
2、在github上添加ssh公钥
打开id_rsa.pub,复制全文。访问github的 settings-ssh 页面,New SSH key,粘贴进去。
3、测试
1 | ssh git@github.com |
提示:
1 | The authenticity of host 'github.com (192.30.252.128)' can't be established. |
4、指定ssh私钥
方法一:
修改 ~/.ssh/config
文件,添加:
1 | host github.com |
方法二:
使用环境变量,比如:
1 | GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_github -F /dev/null" git clone https://github.com/voidking/wecms.git |
使用 access token
1、生成access token
访问github的 Personal access tokens 页面,Generate new token。
Note输入 voidking-pc ,Select scope选择repo,然后点击Generate token。生成了一个token,保存它。
2、开启密码记录
1 | git config --global credential.helper store |
用户家目录下的 .gitconfig 文件末尾会添加:
1 | [credential] |
3、记住密码
再次使用git pull或者git push,系统会提示输入git用户名和密码,这里的密码输入access token即可,不要使用真实密码。
系统会记住用户的access token,存储在用户家目录下的 .git-credentials 文件中。之后就不再需要输入git密码了。
修改 access token
如果access token过期需要替换,那么需要执行以下步骤:
1、清除当前token
1 | git credential reject |
2、使用新token
再次使用git pull或者git push,系统会提示输入git用户名和密码,这里的密码输入access token即可。
或者,使用命令设置新token(不建议,macos上经尝试无效)。
1 | git credential fill |
这时 Git 会提示输入新的密码。输入后保存即可。
使用代理
如果克隆项目特别慢,自己又有科学上网的ssr,那么可以开启代理。
1 | git config --global http.proxy 'socks5://127.0.0.1:1080' |
关闭代理:
1 | git config --global --unset http.proxy |
clone代码
1 | # 普通克隆 |
PS:下载失败问题解决 SSL certificate problem
1 | git config --global http.sslVerify false |
pull代码
pull相关配置
.git/config
文件里,配置了remote和branch,以下为例。
1 | [core] |
拉取项目的时候,会根据这个配置来拉取。
pull相关命令
1 | # 查看本地分支追踪的远程分支 |
解决冲突
问题描述:git pull 之后,出现冲突。
冲突文件中,包含:
1 | <<<<<<< HEAD |
其中,<<<<<<< HEAD 和 ======= 中间的是自己的代码;======= 和 >>>>>>> f406c5e398760c7d9116c8af31ea5748bd344abe 中间的是其他人修改的代码。
解决冲突办法:确定保留哪一部分代码,然后删除标志 <<<<<<< HEAD ,======= ,>>>>>>> f406c5e398760c7d9116c8af31ea5748bd344abe
详情可以参考《git branch》中的代码合并部分,原理是一样的。
分支操作
1、查看分支
1 | git branch -a |
2、切换分支和新建分支
1 | # 切换远程分支 |
commit代码
单行commit
1 | git add . |
多行commit
1 | git add . |
查看commit记录
1、最常用查看commit记录
1 | git log |
只可以查看到当前分支的commit日志,而且不能查看已经删除了的commit操作。
2、查看单个文件commit记录
1 | git log filename |
3、查看全局日志
1 | git reflog |
可以查看所有分支的所有操作记录,包括reset操作、checkout操作、已经删除了的commit操作等等。
4、查看所有分支的commit
1 | git log --graph --pretty=oneline --abbrev-commit |
查看变更
commit之前
执行commit之前,查看修改了哪些文件。
1 | git status |
commit之后
执行commit之后,获取最近一次修改的文件列表
1 | git diff --name-only HEAD~ HEAD |
查看两次commit之间修改的文件
1 | git diff --name-only <commit-1> <commit-2> |
push代码
push分支
push命令格式:
1 | git push <远程仓库名> <本地分支名>:<远程分支名> |
上传代码到唯一远程追踪分支
1 | git push |
上传到指定远程追踪分支
1 | git push origin HEAD:branch_name |
同时push多个git仓库
1、编辑 .git/config,添加
1 | [remote "all"] |
2、push代码
1 | git push all |
push到其他git仓库
需求:已有仓库voidking,包含多个分支。现在想要把该仓库根据不同的分支拆分成多个项目,于是创建项目voidkingA和voidkingB。接下来,该怎么把voidking的不同分支,push到voidkingA和voidkingB呢?
1 | cd voidking |
git push 403
公司电脑(win10系统)以前有一个用户,github账号是haojin。现在电脑分配给我使用,但是,我的github账号是voidking,在我git push的时候报错403。
1 | $ git push |
哪怕重置了全局设置的user.name和user.email,依然会报错。
原因:win10系统自动保存用户凭据,gitpush的时候默认使用以前的用户凭据。
解决办法:Win+X,搜索,控制面板,用户账户,凭据管理器,管理Windows凭据,普通凭据,删除github的凭据即可。
版本回退
版本回退常用git reset
和git revert
命令,这两个命令都是作用于当前分支(HEAD所在的分支)。git reset
是把HEAD向后移动了一下,而git revert
是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
reset
1、每个文件单独版本回退
1 | git status |
2、全部文件版本回退
1 | git reset --hard 1fe37e1bcbb894a1b594cf405ae31880cbaa6cd7 |
3、远程仓库回退
1 | git reset --hard 1fe37e1bcbb894a1b594cf405ae31880cbaa6cd7 |
4、回退后回退
reset后,回退版本之后的commit操作记录,都被删除掉了。
如果回退过之后又后悔了,那么,需要查看全局日志,然后再次执行reset操作。
1 | git reflog |
需要注意的是,版本回退,我们没有使用git checkout
。
假设当前在bugFix分支,使用git checkout
,理论上输入如下命令:
1 | git reflog |
这时,输入git log
,发现版本完美回退了。但是,这只是假象,输入git branch -a
,发现HEAD从bugFix分支切换到了a246dcd那个commit。而bugFix分支,没有进行任何改变。所以,我们不使用git checkout
进行版本回退,而是使用它进行历史版本的查看。
revert
1、全部文件版本回退
1 | git revert cf000 |
2、远程仓库回退
1 | git push origin HEAD:branch_name |
回退过之后又后悔了,那么,执行reset操作即可。
1 | git log |
git stash
本地有修改,但是想拉取远端仓库上的最新代码到本地。
1 | # 保存stash |
统计
1 | # 统计个人代码量 |