此为个人笔记,了解更多更详细的git教程推荐阅读 -- 廖雪峰官方网站git教程
一、git配置
配置本地git用户邮箱:
git config --global user.email <邮箱号>
配置本地git用户名:
git config --global user.name <用户名>
查看本地已配置用户邮箱:
git config user.email
查看本地已配置用户用户名:
git config user.name
二、增删改查
初始化本地仓库(使当前目录成为git仓库):
git init
查看仓库状态:
git status
添加文件到暂存区(多个文件用空格分开):
git add <文件名称>
提交暂存区内容到仓库:
git commit -m "描述信息"
提示:git每次提交的是修改,而并非文件,两次加入同一个文件到暂存区,第二次会合并第一次的修改
撤销当前工作区的修改 (撤销某个文件的修改):
git checkout -- <文件名称>
撤销所有修改:
git reset --hard
撤销指定暂存区:
git reset HEAD <文件名称>
撤销加入暂存区的所有修改:
git reset HEAD .
删除文件 (删除也是一个修改操作,并且进入暂存区):
git rm <文件名称>
撤销删除(因为删除也是一个修改操作,并且进入了暂存区,所以需要撤销暂存区操作):
git reset HEAD <文件名称>
还原删除(以上仅仅是撤销暂存区而已,还没有还原文件,还需要撤销修改):
git checkout -- <文件名称>
查看仓库日志:
git log
仓库日志很混乱,可以使用简介方式查看(单行显示):
git log --pretty=oneline
查看分支点线图:
git log --graph
仅显示版本号前几位:
git log --abbrev-commit
提示:显示日志时回车可以一直查看更多日志,按q退出查看
统计修改差异:
git diff --stat // 查看工作区和暂存区的差异
git diff HEAD // 查看工作区和最新提交的差异
三、版本控制
git版本回退
git reset --hard HEAD^ // 回退前一个版本
git reset --hard HEAD^^ // 回退前两个版本
git reset --hard HEAD^^^ //回退前三个版本
注意:在windows终端会认为^是换行符,需要使用引号包裹,否者你回车会一直提示"more?",问你是否还有更多命令
以此类推,回退几个版本就是加多少个 ^,但是数量一多就不可能数数了,还可以这样
git reset --hard HEAD~1 // 回退前一个版本
git reset --hard HEAD~2 // 回退前两个版本
git reset --hard HEAD~3 // 回退前三个版本
以此类推,这种方式就好多啦
但是,还有一种情况,比如,我回退了一个版本,就不能回去以前最新的版本了
其实我们还可以使用版本号跳转版本,每个版本都有一个版本号
git reset --hard <版本号> // 如:git reset --hard a45ab
这种方式需要知道版本号,版本号可以通过git log查看日志获得
四、远程仓库
关联远程仓库:
git remote add <远程仓库别名> git@github.com:<git链接后缀> // 如:git@github.com:future196/test.git
列出所有关联的远程仓库:
git remote // 或 git remote show
列出所有关联的远程仓库(更加详细):
git remote -v
查看某个远程仓库的信息:
git remote show <远程仓库别名>
提交到远程服务器:
git push <远程仓库别名> <提交分支>
克隆仓库(git协议):
git clone git@github.com:<git链接后缀> // 如:git@github.com:future196/test.git
克隆仓库(https协议):
git clone https://github.com/<git链接后缀> // 如:https://github.com/future196/test.git
取回远程仓库的全部更新:
git fetch <远程仓库别名>
取回指定远程仓库分支的更新:
git fetch <远程仓库别名> <分支名称>
查看刚刚取回的远程更新(取回远程更新后会返回数据在FETCH_HEAD):
git log -p FETCH_HEAD
合并刚刚取回的远程更新:
git merge FETCH_HEAD
取回并立即合并本地仓库:
git pull <远程仓库别名>
取回指定远程仓库分支的更新并立即合并:
git fetch <远程仓库别名> <远程分支>:<本地分支>
取回远程仓库有而本地没有的分支,并且跟踪关联(会自动给本地创建该分支)
git checkout --track <远程仓库别名>/<远程分支名> // git checkout --track origin/dev
给远程仓库创建一个新的分支
git push --set-upstream <远程仓库别名> <远程分支名>
如果同一个远程仓库,在本地创建了两个仓库,分别提交历史不一样时会拒绝pull取回合并,可使用一下方式允许:
git pull origin master --allow-unrelated-histories
移除一个已经关联的远程仓库
git remote rm <远程仓库名>
五、分支管理
创建分支:
git branch <新建分支名称>
切换分支:
git checkout <分支名称>
创建并切换分支(一气呵成):
git checkout -b <分支名称>
合并分支(合并指定分支到当前分支):
git merge <分支名称>
默认情况下,git是使用快速合并(Fast fordword)的方式,这种方式在删除分支后是不留痕迹的,没有记录的,我们可以通过禁用快速合并模式,删除分支后仍然可以看到记录,禁用方式:--no-ff:
git merge --no-ff -m "merge with no-ff" <分支名称>
新版本git支持新的切换分支方式(更加的让人容易理解):
切换分支:
git switch <分支名称>
创建并切换分支(一气呵成):
git -c switch <分支名称>
删除分支:
git branch -d <分支名称>
强制删除分支(默认情况没有合并的分支是不允许删除的,因此需要使用强制删除):
git branch -D <分支名称>
删除远程分支:
git push <远程仓库别名> -d <分支名称>
删除本地与远程分支的关联:
git push -d -r <分支名称>
列出本地分支(带星号的是当前分支):
git branch
列出远程分支:
git branch -r
列出本地以及远程分支:
git branch -a
六、stash功能(存档):
说明:可存储当前工程(类似游戏存档),存档后当前修改被封存,恢复最近一次版本(未修改时)
存储当前分支的工程(可多次存档):
git stash
查看存档列表:
git stash list
恢复存档(方式一):
git stash apply stash@{0} // 指定恢复名称为stash@{0}的存档
恢复存档(方式二):
git stash pop stash@{0} // 指定恢复名称为stash@{0}的存档
方式一和方式二的区别:方式一恢复存档后,存档不会删除,方式二恢复存档后存档自动删除
删除存档:
git stash drop stash@{0} // 指定删除名称为stash@{0}的存档
七、重复提交
有时我们会需要对以往代码进行修理bug,我们会在多个分支中的其中一个分支上进行修理,修改后提交修改,但是我们多个分支上都需要修理同一个问题,怎么办呢,每一个分支都同样的去修理一遍,不太科学吧。
我们可以使用以下方式给其他分支同样的提交一次修改:
git cherry-pick <版本号>
八、tag标签管理:
添加标签(可多次添加,多次添加的标签不会覆盖,并且会用逗号额隔开多个标签):
git tag <标签名称>
给指定的版本添加标签(不指定版本号默认最新版本):
git tag <标签内容> <版本号>
给标签添加说明:
git tag <标签名称> -m <说明内容> 或 git tag -a <标签名称> -m <说明内容>
列出所有标签(标签顺序不是按时间排序的,而是按字母排序的):
git tag
通过标签查看提交(commit)的信息:
git show <标签名称>
删除标签:
git tag -d <标签名称>
推送标签到远程:
git push <远程仓库别名> <标签名称>
推送所有未推送的标签到远程:
git push <远程仓库别名> --tags
删除远程仓库的标签(需要先删除本地标签):
git push github :refs/tags/<标签名称>
九、忽略提交:
说明:文件中声明的文件或目录将不会被提交提示。
仓库根目录新建文件:.gitignore
声明例子如下:
# 声明文件夹内的所有文件忽略
test/
#声明忽略文件
test.py
#声明后缀为 .txt 的文件被忽略
*.txt
十、配置别名
给git默认命令修改为别名,如:
把status换成st:
git config --global alias.st status
命令行输入git st 等于原来的git status
修改的别名可在 .git/config文件中查看
十一、常见的报错问题
报错1
fatal: refusing to merge unrelated histories
原因:合并两个不相关的库报错如下:
解决方案:那么可以强行合并:尾部加上 --allow-unrelated-histories
git pull github master --allow-unrelated-histories
------------------------------------分割线----------------------------------------
报错2
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:future196/test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
原因:远程仓库存在本地仓库没有的资源
解决方案:拉取远程仓库的最新更新进行本地整合
------------------------------------分割线----------------------------------------
报错3
git@github.com: Permission denied (publickey). Could not read from remote repository.
原因:
- 客户端与服务端未生成 ssh key
- 客户端与服务端的ssh key不匹配
解决方案:
生成ssh key,并且在git账户设置上配置。
1、生成ssh key:
ssh-keygen -t rsa -C <你的邮箱>
生成后在C:\Users\用户名\.ssh下可以看到如下三个文件:
2、打开id_rsa.pub复制内容
3、在github账号下设置
1>.进入github账号,
2>.在settings页面,找到SSH and GPG keys
3>.点击SSH keys 新建SSH keys
4>.填写title(自定义名称),
5>.将id_rsa.pub里的内容复制到Key中
6>.点击Add SSH Key,完成
4、测试ssh连接是否成功(出现success):
ssh -T git@github.com
结果如下为连接成功:
Hi future196! You've successfully authenticated, but GitHub does not provide shell access.
注:如有不对,欢迎指出!