前言
Linus牛逼!
配置
1 2
| git config --global user.name ciiki git config --global user.email ciiki@ciiki.eu.org
|
使用
创建版本库
1 2 3
| mkdir learngit cd learngit git init
|
添加文件
1 2
| git add readme.txt git commit -m "first git commit"
|
git add 表示把文件放入暂存区,可以修改文件后执行多次,git自动合并修改,最后 git commit 将修改提交到本地仓库
查看提交记录
1 2 3
| git log git reflog git log --graph --pretty=oneline --abbrev-commit
|
版本控制
恢复上一版本
恢复未来版本
1094a是 git log 输出的commit id,写前几位就行不用写全,会自动搜索
查看状态
对比修改
工作区与暂存区对比
工作区与master对比
1
| git diff master -- readme.txt
|
暂存区与master对比
1
| git diff --cached -- readme.txt
|
删除文件
1 2
| git rm test.txt git commit
|
文件恢复
开始修改
master:a 暂存区:a 工作区:a
修改工作区为:aa
master:a 暂存区:a 工作区:aa
git add readme.txt
master:a 暂存区:aa 工作区:aa
修改工作区为:aaa
master:a 暂存区:aa 工作区:aaa
开始恢复
git restore readme.txt
master:a 暂存区:aa 工作区:aa
git restore –staged readme.txt
master:a 暂存区:a 工作区:aa
git restore readme.txt
master:a 暂存区:a 工作区:a
总结
从master恢复暂存区:
1
| git restore --staged readme.txt
|
从暂存区恢复工作区:
分支管理
作用
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。
如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
之前只有一条时间线master,master指向该分支的最新版本,HEAD指向master
创建分支
等价于
1 2
| git branch dev git switch dev
|
查看分支
删除分支
合并分支
1 2
| git switch master git merge dev
|
合并后master和dev都指向了最新版本,如果不想让dev指向最新版本可以在merge后加--no-ff
参数
合并完成后可以选择删除dev分支
Bug分支
场景:目前正在dev分支上开发,还未开发完成无法commit,需要紧急修复master分支的101bug
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| git stash
git switch master git switch -c 101bug ...修复bug git commit
git switch master git merge 101bug
git switch dev git stash list
git stash pop
|
dev上如果也有该bug,可以合并master上的提交到dev
Github
连接Github
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
1
| ssh-keygen -t rsa -C "youremail@example.com"
|
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点“Add Key”,你就应该看到已经添加的Key:
添加远程库
在github里Create a new repo
1 2
| git remote add origin https://github.com/username/learngit.git git push -u origin master
|
解除远程库关联
在github里Create a new repo
拉取远程仓库
1
| git clone https://github.com/username/learngit.git
|
推送
删除远程分支
1
| git push origin --delete remoteBranchName
|
基于远程分支开发
git clone后本地只有master一个分支
1 2
| git checkout -b dev origin/dev git push origin dev
|
推送冲突
先拉取最新代码
如果git pull也失败了,原因在于没有指定本地dev分支与远程origin/dev分支的链接
1 2
| git branch --set-upstream-to=origin/dev dev git pull --no-rebase
|
忽略特殊文件
.gitignore 文件里写入不需要提交的文件,例如
1 2 3
| *.passwd # 排除所有.passwd结尾文件
!public.passwd # 不排除public.passwd文件
|
tag
添加tag
1 2 3
| git tag v1.0 git tag v0.9 f52c633 git tag -a v0.1 -m "version 0.1 released" 1094adb
|
查看tag
删除tag
推送到远程仓库
1 2
| git push origin v1.0 git push origin --tags
|
删除远程tag
1 2
| git tag -d v0.9 git push origin :refs/tags/v0.9
|
命令别名
1 2 3 4
| git config --global alias.st status git config --global alias.br branch git config --global alias.sw switch git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
|
以上命令均写入了 ~/.gitconfig 文件中
CentOS升级git
确认版本
1 2
| git --version git version 1.8.3.1
|
移除旧版
1 2 3
| yum remove git
yum remove git-*
|
添加 End Point Package Repository
1
| yum install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
|
安装
确认版本
1 2
| git --version git version 2.3.1.4
|
解决git输出显示到新窗口问题
1
| git config --global core.pager ''
|
git 设置和取消代理
1 2 3 4 5 6 7
| git config --global http.proxy http://172.30.16.1:1082
git config --global https.proxy http://172.30.16.1:1082
git config --global --unset http.proxy
git config --global --unset https.proxy
|
显示git配置
git中文文件名不显示
1
| git config --global core.quotepath false
|