前言

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

版本控制

恢复上一版本

1
git reset --hard HEAD^

恢复未来版本

1
git reset --hard 1094a

1094a是 git log 输出的commit id,写前几位就行不用写全,会自动搜索

查看状态

1
git status

对比修改

工作区与暂存区对比

1
git diff readme.txt

工作区与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

从暂存区恢复工作区:

1
git restore readme.txt

分支管理

作用

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

之前只有一条时间线master,master指向该分支的最新版本,HEAD指向master

创建分支

1
git switch -c dev # -c 表示创建并切换至

等价于

1
2
git branch dev
git switch dev

查看分支

1
git branch

删除分支

1
git branch -d dev

合并分支

1
2
git switch master #回到master分支
git merge dev

合并后master和dev都指向了最新版本,如果不想让dev指向最新版本可以在merge后加--no-ff参数

合并完成后可以选择删除dev分支

1
git branch -d 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 #dev分支创建快照并恢复至commit状态

git switch master #切回master
git switch -c 101bug #创建101bug分支
...修复bug
git commit

git switch master #切回master
git merge 101bug

git switch dev #切回dev
git stash list #查看快照

git stash pop #恢复最新快照并删除

# 或者
# git stash apply stash@{0}
# git stash drop stash@{0}

dev上如果也有该bug,可以合并master上的提交到dev

1
git cherry-pick 4c805e2

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 #给这个库起的名字叫origin
git push -u origin master #把本地master分支推送到origin master分支,第一次push需要加-u参数

解除远程库关联

在github里Create a new repo

1
git remote rm origin

拉取远程仓库

1
git clone https://github.com/username/learngit.git

推送

1
git push origin master

删除远程分支

1
git push origin --delete remoteBranchName ##remoteBranchName不能是default分支,如果是就需要去reposity-settings改一下Default branch

基于远程分支开发

git clone后本地只有master一个分支

1
2
git checkout -b dev origin/dev #创建并切换为dev分支,该分支为远程的dev分支
git push origin dev

推送冲突

先拉取最新代码

1
git pull

如果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

1
2
git tag
git show v0.1

删除tag

1
git tag -d v0.1

推送到远程仓库

1
2
git push origin v1.0
git push origin --tags #一次性推送全部

删除远程tag

1
2
git tag -d v0.9 #先删本地tag
git push origin :refs/tags/v0.9 #删远程tag

命令别名

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
yum install git

确认版本

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配置

1
git config --list

git中文文件名不显示

1
git config --global core.quotepath false