一,Git的工作区与暂存区
Git的工作区(working directory),就像我们平时看到的目录一样。Git的版本库中包含了暂存区(stage或者index)以及Git为我们自动创建的第一个分支master,和指向master的一个指针HEAD。
当我们把文件往Git版本库里添加的时候,git add命令实际上是把文件修改添加到暂存区,git commit命令实际上是把暂存区的所有内容提交大当前分支。对于我们每次所做的修改,如果不add到暂存区,就不会加入到commit中。
1),git checkout – file 命令可以丢弃工作区的修改,可以分为两种情况:
一种是文件自修改后还没有被放到暂存区,撤销修改就可以回到和版本库一模一样的状态;
一种是文件已经添加到暂存区后,又做了修改,撤销修改就回到添加暂存区后的状态。
2),git reset HEAD file可以把暂存区的修改撤销掉,重新放回工作区,HEAD表示最新的版本。
小结:
情形1:当你乱改了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
情形2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步使用命令git reset HEAD file,就回到了情形1,第二部步按情形1操作。
3),git rm 命令用于删除一个文件,如果一个文件已经被提交到版本库,则不用担心会误删,但要小心,因为只能恢复文件到最新版本,会丢失最近一次提交后所做的修改。
二,远程仓库
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,Github网站提供Git仓库托管服务,只要注册一个Github账号,就可以免费获得Git远程仓库,本地的Git仓库和Github仓库之间的传输是通过SSH加密的,所以需要一些配置(SSH:Secure Shell,是一种网络安全协议,主要用于登陆远程计算机的加密过程。)
第一步:创建SSH Key,在用户主目录下,看看有没有.ssh目录,如果有,再看该目录下有没有id_rsa和 id_raspub这两个文件,如果已经有了,可以直接跳到下一步,如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "your email@XXX.com"
需要把邮件地址换成自己的邮件地址,然后一路回车,使用默认值即可。完成后,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个文件就是SSH Key秘钥对,id_rsa是私钥,id_rsa.pub是公钥。
第二步:登陆Github,进入SSH Key页面,然后Add SSH Key,Title任意填写,在Key文本框中粘贴id_rsa.pub文件的内容。
因为Github需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,Github只要知道了你的公钥,就可以确认只有你自己才能推送。
1)关联远程仓库:使用命令git remote add origin git@server-name:path/repo-name.git
关联一个远程库。
**2)添加远程仓库:**git push命令:把本地库的内容推送到远程,实际上是把当前分支master推送到远程。由于远程库是空的,所以在第一次推送master分支时,加上参数-u,这样,Git不仅会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后推送或者拉取的时候就可以简化命令。(第一次推送的命令为$ git push -u origin master
以后每次推送只需使用命令$ git push origin master
)
**3)从远程库克隆:**git clone命令可以从远程库进行克隆,要克隆一个仓库,首先必须知道仓库的地址。例如,远程库有一个名为gitskills的仓库,在本地进行克隆的命令如下:
$ git clone git@github.com:path/gitskills.git
三,分支管理
**1)创建与合并分支:**git checkout命令加上-b参数表示创建并切换分支,即$ git checkout -b dev
这一条相当于以下两条命令:
$ git branch dev
$ git checkout dev
git branch命令可以查看当前分支,该命令会列出所有分支,当前分支前面会标一个*号。
git merge
命令用于合并指定分支到当前分支。 git branch -d dev
命令用于删除dev分支。
总结:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
查看合并分支图:git log –graph
在合并分支的时候如果加上了–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过的合并,而fast forward合并就看不出来曾经做过的合并。
2)Bug分支:修复bug时,通过创建新的bug分支进行修复,然后合并,最后删除。如果手头的工作还没有完成时,可以先把工作现场git stash
一下,然后再去修复bug,修复后,再git stash pop
,回到工作现场。git stash命令可以把当前工作现场“储藏起来”,等以后恢复现场后继续工作。用git stash list
命令查看工作空间存在哪里,Git会把stash内容存在某个地方,需要恢复时有两个办法:
一是用git stash apply
恢复,但是恢复之后,stash内容并不删除,需要使用git stash drop
来删除。
另一种方式是用git stash pop
,恢复的同时把stash内容也删除了。
3)Feature分支:一般会每添加一个新的功能时,会新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
4)多人协作: 当从远程仓库克隆时,Git会自动把本地的master分支和远程的master分支对应起来,并且远程仓库的默认名字是origin。要查看远程库的信息,用命令git remote
,或者用命令git remote -v
显示更详细的信息。
推送分支: 就是把该分支上的所有本地提交推送到远程库,推送时,要指定本地分支,这样Git就会把该分支推送到远程库对应的远程分支上:$ git push origin master
。
并不是一定要把本地分支往远程推送,一般:
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没有必要推到远程了;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
抓取分支: 从远程抓取分支,使用git pull
,如果有冲突,要先处理冲突。
多人协作的工作模式通常如下:
1,首先,可以试图用git push origin branch-name
推送自己的修改;
2,如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
抓取远程的新提交,并试图合并;
3,如果合并有冲突,则解决中途,并在本地提交;
4,没有冲突或者解决掉冲突之后,再用git push origin branch-name
推送就能成功;
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,则用命令git branch --set-upstream branch-name origin/branch-name
在本地创建和远程分支对应的分支:git checkout -b branch-name origin/branch-name