本文基于廖雪峰Git 教程摘录,供自己学习使用,只简述了基本操作,高级操作以后再更新。
本地仓库操作
配置用户信息
git config --global user.name "username"
git config --global user.email "email"
初始化一个Git仓库,使用git init命令。(谨慎使用,只有新建本地库时会用到。)
使用命令 ** git add <file>,将修改的文件添加的暂存区,可反复多次使用,后面写多个文件名,可使用git add . **添加所有文件。
使用命令git commit,添加到本地仓库。
** git commit -a 表示将所有修改和删除的文件放入暂存区,并commit,但新建文件不受影响。相当于执行了git add .(排除新建文件) +git commit**。
** git commit -m "xxx" ** xxx是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git status命令可以让我们时刻掌握仓库当前的状态。
git diff xx.xx 可查看xx.xx文件修改了什么内容。
版本回退
**git log **命令查看历史版本,每次commit的描述信息及时间和版本ID会列出。
Git 用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
回到某个版本有两种方法
**git reset --hard HEAD^ ** 表示返回当前版本的上个版本。
**git reset --hard commitID ** 指向commitID对应的版本。
如果回退到了某旧个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
Git提供了一个命令git reflog用来记录你的每一次命令,可根据命令历史记录找到新版本的commit id。
撤消修改
命令git checkout -- filename意思就是,git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。这里有两种情况:
一种是filename自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是filename已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
如果已经把修改后的文件git mommit到了暂存区,就要用命令git reset HEAD filename把暂存区的修改撤销掉(unstage),重新放回工作区。
删除文件
用** git rm **来删除文件,同时还会将这个删除操作记录下来;
用 rm 来删除文件,仅仅是删除了物理文件,没有将其从 git 的记录中剔除。
直观的来讲,git rm 删除过的文件,执行** git commit -m "abc" **提交时,会自动将删除该文件的操作提交上去。
而对于用 rm 命令直接删除的文件,执行** git commit -m "abc" 提交时,
则不会将删除该文件的操作提交上去。
不过不要紧,即使你已经通过 rm 将某个文件删除掉了,
也可以再通过 git rm 命令重新将该文件从 git 的记录中删除掉,
这样的话,在执行 git commit -m "abc" **以后,也能将这个删除操作提交上去。
如果之前不小心用 rm 命令删除了一大批文件呢?
是的,此时用** git rm 逐个地再删除一次就显得相当蛋疼了。
所幸还有更方便的处理方案,用如下的方式做提交就没有问题了: git commit -am "abc"。
所以在在被 git 管理的目录中删除文件时,可以选择如下两种方式来记录删除动作:
一、rm + git commit -am "abc"**
二、git rm + git commit -m "abc"
另外,git add . 仅能记录添加、改动的动作,删除的动作需靠 git rm来完成。
远程仓库
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash)。
创建SSH Key:** 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允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
推送远程
在Git新建一个仓库,比如名字叫blog.
在本地的仓库下运行命令:
** git remote add origin git@github.com:我的用户名/blog.git**
添加后,远程库的名字就是origin,这是Git默认的叫法。
下一步,就可以把本地库的所有内容推送到远程库上:
** git push -u origin master**
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
** git push origin master**
从远程库克隆
现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
首先,登陆GitHub,创建一个新的仓库,名字叫blog,我们勾选Initialize this repository with a README,这样GitHub会自动为我们创建一个README.md文件。
现在,远程库已经准备好了,下一步是用命令git clone克隆一个本地库:
** git clone git@github.com:我的用户名/blog.git**
注意把Git库的地址换成你自己的,然后进入blog目录看看,已经有README.md文件了。
操作分支
创建dev分支,然后切换到dev分支:
** git checkout -b dev**
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
** git branch dev**
** git checkout dev**
然后,用git branch命令查看当前分支:
$ git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常修改提交。
dev分支的工作完成,我们就可以切换回master分支:
** git checkout master**
切换回master分支后,再查看修改的文件,刚才修改的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变。
现在,我们把dev分支的工作成果合并到master分支上:
** git merge dev**
git merge命令用于合并指定分支到当前分支。合并后,再查看修改的内容,就可以看到,和dev分支的最新提交是完全一样的。
合并完成后,就可以放心地删除dev分支了:
** git branch -d dev**
删除后,查看branch,就只剩下master分支了:
** git branch**
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样: