工作区和版本库的概念
- 工作区:就是你在电脑里能看到的目录
- 版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
本地仓库
- 在本地右击新建一个文件夹
- 执行
git init
命令把这个目录变成Git可以管理的仓库,这时会多出来一个.git的目录,如果没有,那就是隐藏了。 - 把新建的文件添加到仓库:
git add test.txt
- 把文件提交到仓库:
git commit -m "wrote a readme file"
- 查看状态(可以查看当前有哪些文件文件待提交):
git status
- 显示从最近到最远的提交日志:
git log
- 版本回退,退到上一个版本:
git reset --hard HEAD^
//上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100 - 版本回退,退到指定的版本:
git reset --hard 1094a
//1094a是版本号的前5位数 - 查看历史命令:
git reflog
- 丢弃工作区的修改,一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态:
git checkout -- file
- 把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset HEAD <filename>
- 删除文件:
git rm
,并且提交git commit -m "remove <filename>"
- 把误删的文件恢复到最新版本:
git checkout -- test.txt
远程仓库
- 创建github账号
- 创建SSH Key(在本地命令行运行):
ssh-keygen -t rsa -C "youremail@qq.com"
- 登陆GitHub,打开“Account settings”,“SSH Keys”页面:然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴
id_rsa.pub
文件的内容(在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件)。为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的。 - 在GitHub上面创建一个仓库:右上角找到“Create a new repo”按钮,在Repository name填一个仓库名字,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。现在,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
- 在本地关联远程库:
git remote add origin git@github.com:michaelliao/learngit.git
(把上面的michaelliao替换成你自己的GitHub账户名,添加后,远程库的名字就是origin) - 把本地库的所有内容推送到远程库上:
git push -u origin master
(用git push命令,实际上是把当前分支master推送到远程)。 - 从现在起,只要本地作了提交,就可以通过命令:
git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库。
从远程库克隆到本地
- 假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。首先,登陆GitHub,创建一个新的仓库,名字叫gitskills
- 用命令git clone克隆一个本地库:
git clone git@github.com:michaelliao/gitskills.git
(注意把Git库的地址换成你自己的)
分支
- 创建一个分支:
git checkout -b dev
(git checkout命令加上-b
参数表示创建并切换,相当于以下两条命令:git branch dev
和git checkout dev
) - 查看当前分支:
git branch
(git branch命令会列出所有分支,当前分支前面会标一个*号) - 把dev分支的工作成果合并到master分支上:
git merge dev
(git merge命令用于合并指定分支到当前分支。) - 删除dev分支:
git branch -d dev
- switch:
git switch -c dev
(创建分支并切换),git switch maste
r(切换到已有的master) - 储存现场工作情况:
git stash
(现在,用git status查看工作区,就是干净) - 查看临时存储的文件:
git stash list
- 恢复临时存储的文件:一是用
git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;另一种方式是用git stash pop
,恢复的同时把stash内容也删了。 - 在master分支上修复的bug,想要合并到当前dev分支,可以用
git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。 - 丢弃没有被合并的分支:
git branch -D <name>
强行删除。 - 查看远程库的详细信息:
git remote -v
- 推送master分支:
git push origin master
- 创建远程origin的分支dev到本地:
git checkout -b dev origin/dev
- 指定本地dev分支与远程origin/dev分支的链接:
git branch --set-upstream-to=origin/dev dev
- 把本地未push的分叉提交历史整理成直线:
rebase
标签
- 切换到需要打标签的分支上:
git branch
- 打标签:
git tag <name>
- 查看所有标签:
git tag
- 对指定的commit id打标签:
git tag v0.9 f52c633
- 删除标签:
git tag -d v0.1
- 推送标签到远程:
git push origin <tagname>
- 一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
- 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9
- 然后,从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/v0.9