目录
1.通过git init命令,把当前目录变成Git可以管理的仓库
2.通过git diff命令,可以查看工作区和版本库里面最新版本的区别
3.通过git checkout -- file,可以丢弃工作区的修改
4.通过git reset命令可以把暂存区的修改撤销掉(unstage),重新放回工作区
安装及配置
1.安装完git后首先需要设置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
2.配置颜色
git config --global color.ui true
创建版本库
1.通过git init
命令,
把当前目录变成Git可以管理的仓库
git init
2.通过git add
命令,
把文件添加到stage
git add readme.txt
与之相反的命令,从stage中删除
git rm --cached readme.txt
3.通过git commit
命令,
把文件提交到仓库
git commit -m "wrote a readme file"
版本回退
1.通过git log
命令,查看历史commit记录
参数表示简略信息,返回的是commit id
git log --pretty=oneline
2.通过git reset
命令,进行版本回退
当前指向HEAD,回退1次和2次,可以使用HEAD^和HEAD^^,回退n次,参数为HEAD~n,参数也可以是commit id
git reset --hard HEAD^
3.通过git reflog
命令,用来记录你的每一次命令
用于回退一次后使用git log找不到回退前的commit id
git reflog
版本库
1.通过git status
命令,
查看版本库状态
git status
2.通过git diff
命令,可以查看工作区和版本库里面最新版本的区别
git diff HEAD -- readme.txt
git diff: 是查看 workspace 与 index 的差别的。
git diff --cached: 是查看 index 与 local repositorty 的差别的。
git diff HEAD: 是查看 workspace 和 local repository 的差别的。
(HEAD 指向的是 local repository 中最新提交的版本)
3.通过git checkout -- file,
可以丢弃工作区的修改
$ git checkout -- readme.txt
有以下两种情况
一种是readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和修改前一样的状态;
一种是readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到和暂存区一样的状态。
4.通过git reset
命令可以把暂存区的修改撤销掉(unstage),重新放回工作区
readme.txt
作了修改并且已经添加到暂存区后,但是不想提交到版本库,需要撤销add
git reset HEAD readme.txt
5.删除文件
test.txt添加到版本库后,在本地做了删除
1.确实要删除,通过git rm
命令从版本库中删除该文件,并且git commit
:
git rm test.txt
git commit -m "remove test.txt"
2.删错了,把误删的文件从版本库恢复:
git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
远程仓库Github
1.配置自己的Github
创建SSH Key,在用户主目录下的.ssh目录创建id_rsa
和id_rsa.pub
两个文件
ssh-keygen -t rsa -C "youremail@example.com"
登陆GitHub,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key里粘贴id_rsa.pub
的内容
2.本地库推送到远程库
如果还没有本地库,需要按上面的步骤创建本地库,只有第一次推送时需要加 -u
git remote add origin https://github.com/xxxx.git
git push -u origin master
3.远程库克隆到本地库
git clone git@github.com:xxxx.git
Git支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快。
分支管理
HEAD
指向当前分支。master指向提交,新建分支dev并做了新提交。
1.创建分支
git checkout -b dev
-b
参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
2.通过git branch
命令,查看当前分支
git branch
3.通过git checkout
命令,切换分支
在dev分支做了add和commit操作
切换回master分支,HEAD指针指向master
git checkout master
3.通过git merge
命令,合并分支
git merge dev
4.通过git branch -d
命令,删除分支
git branch -d dev
4.分支冲突:
在两个分支做了不同的修改,使用git merge dev时因为冲突无法合并
使用git status查看哪个文件发生冲突
git status
使用git diff查看两个冲突文件内容
git diff
解决:把Git合并失败的文件手动编辑为我们希望的内容,再提交。
注意此时dev分支的内容未变,只是看起来与master合并,此时使用merge无效,删除分支即可。
git branch -d dev
注:而如果此时继续在dev提交,feature指针往后移动,则又会冲突。
若此时想要删除分支dev,需要使用参数 -D
git branch -D dev
以图的形式显示分支加参数 --graph,后两个分别表示一行显示和简写commit id
git log --graph --pretty=oneline --abbrev-commit
5.分支合并策略
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
合并dev
分支时使用--no-ff
参数,表示禁用Fast forward
,表示因为要加入新的commit,所以需要 -m
加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
git merge --no-ff -m "merge with no-ff" dev
6.临时修复bug
在dev分支工作过程中,当前工作区的工作没有完成不能提交,但是需要在工作区修改bug提交
修改bug需要在master创建新分支,并使用 --no-ff合并
即临时保存并清空当前工作区的内容,在工作区修复bug后,再把之前工作区的状态恢复,继续工作
使用git stash
命令,可以把当前工作区保存
git stash
使用git stash list
命令,查看当前保存的工作区
git stash list
工作区恢复
一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;
git stash apply
git stash drop
也可以指定恢复多个保存中的某一个
git stash apply stash@{0}
二是用git stash pop
,恢复的同时把stash内容也删了:
git stash pop
7.使用feature分支开发新功能
开发新功能时从dev创建feature分支,加入新功能后与dev分支合并
但是如果没等合并就不再需要该功能,需要强制删除该分支
git branch -D feature
8.多人协作
从远程仓库克隆时,Git自动把本地的master
分支和远程的master
分支对应起来了,并且,远程仓库的默认名称是origin
。
本地库与远程仓库相连
git remote add origin git@github.com:xxxx.git
使用git remote,
查看远程库的信息
git remote
origin
使用git remote -v,
显示更详细的信息
git remote -v
origin git@github.com:xxxx.git (fetch)
origin git@github.com:xxxx.git (push)
上面显示了可以抓取和推送的origin
的地址。如果没有推送权限,就看不到push的地址。
推送
推送master分支
git push origin master
推送dev分支
$ git push origin dev
抓取
从远程仓库克隆,只会抓取远程origin的master分支
git clone git@github.com:xxxx.git
从远程origin
的dev
分支创建本地dev
分支(创建前需要git pull)做了add和commit操作后,推送到远程仓库
git pull
git checkout -b dev origin/dev
git push origin dev
而如果其他人在自己的本地dev分支做了修改要推送时,就会提示冲突
解决
首先设置本地dev
分支与远程origin/dev
分支的链接
git branch --set-upstream-to=origin/dev dev
然后用git pull
把最新的提交从origin/dev
抓下来
git pull
本地合并,解决冲突(编辑所需的内容,commit),然后再推送
git add readme.txt
git commit -m "fix conflict"
git push origin dev
9.rebase
本地和远程均在C2的基础上做了修改
此时如果使用git merge,产生一个merge commit
然后使用git renase,让"mywork"分支历史看起来像没有经过任何合并一样,使用git gc对不需要的C5和C6进行垃圾回收
git renase命令等价于下面两条命令(因为git merge是在mywork分支,所以这里第一句没用,但是如果不在就需要第一句)
git checkout mywork
git rebase origin
冲突解决
rebase的过程中也会遇到冲突的问题,即在C3和C5中对同一个文件做了修改
此时使用下面两条命令进行git rebase时会提示冲突
git checkout mywork
git rebase origin
这里解释一下提示
查看冲突文件
git am --show-current-patch
修改冲突文件
git add/rm <conflicted_files>
然后继续提交
git rebase --continue
跳过冲突文件
git rebase --skip
停止rebase并恢复之前的状态
git rebase --abort
标签管理
1.创建标签
对最新的commit打标签
git tag v1.0
对某一commit id打标签
git tag v0.9 f52c633
对某一commit id打标签,并指定说明信息
git tag -a v0.1 -m "version 0.1 released" 1094adb
2.查看标签
使用命令git tag列出所有的标签
git tag
使用命令git show查看标签的信息
git show <tagname>
3.标签推送到远程
因为创建的标签都只存储在本地,不会自动推送到远程。
使用命令git push origin <tagname>,
推送某个标签到远程
git push origin v1.0
推送全部尚未推送到远程的本地标签
git push origin --tags
4.删除标签
删除本地标签
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
使用参数 -d 删除本地标签
git tag -d v0.1
删除远程标签
如果标签已经推送到远程,先从本地删除:
$ git tag -d v0.9
Deleted tag 'v0.9' (was f52c633)
然后,从远程删除。
$ git push origin :refs/tags/v0.9
5.注意
标签总是和某个commit挂钩。
如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
使用Github
-
在GitHub上,可以任意Fork开源仓库;
-
Fork后的仓库才有读写权限;
-
可以推送pull request给官方仓库来贡献代码。