首先要明白四个空间:远程仓库,本地仓库,本地缓存区,本地工作区;
远程仓库:该仓库是一个集中的数据仓库,正常情况下,所有参与开发的人员的代码最后都会提交到该仓库的自己的分支上,再由具有合并权限的人员来合并所有分支;
本地仓库:一般来说,本地仓库是由开发人员通过clone复制远程仓库中的某个分支的数据到本地而产生的,但git不是集中式的版本控制,而是分布式的版本控制,他们的区别就是,分布式版本控制中每一个仓库都能具有远程仓库的作用,而集中式的版本控制中远程仓库是不能被其他参与开发的人备份的;
本地缓存:在本地修改数据后(一般是指我们在编辑器中修改某个文件),git监测到该数据与本地数据仓库的数据不一致,会提示将该修改增加(add)到缓存区,缓存区中的文件可以用来与本地仓库中的文件进行比较(difftool),这个用处目前感觉主要用于当我们修改很多文件时,最后不记得自己修改了那些文件,如果没有缓存区,我们直接提交的话,很容易会导致很多疏忽。我们在编辑器中修改了文件后(本地工作区),本地缓存中不包含我们的修改的,只有当我们把本次的修改add到缓存区的时候,缓存区中才有本次的修改,这表明我们的每一次修改都必须手动add到本地缓存中才能在使用commit命令时将其添加到本地仓库。
本地工作区:也就是我们的编辑器的空间;
现在开始使用git的开发流程了:
1.初始化本地仓库,打开终端,输入以下内容:
git init
该命令会在本地的当前目录创建一个空的本地仓库,也就是第二步中从远程仓库克隆的项目被放置的地方;
1.克隆远程仓库项目到本地:
git clone +远程仓库的地址(例子如下)
git clone git://github.com/schacon/ticgit.git
执行完该命令后,本地仓库中应具有远程仓库中默认的master分支中的数据;
2.进入该项目的目录,查看分支状态;
cd 目录名
git status(查看当前状态,这个状态包括以下数据:当前在那个分支上,当前缓存区数据状态(change to commit),修改了数据但是没有add到缓存区的文件状态(change but not update),当前仓库中还没被追踪的文件(Untracked file))
可以在终端中看到目前在哪一个分支上(默认是master),一般我们不应该在master分支上开发,应该在自己的分支上开发,所以需要创建自己的分支,两种方式:
2.1 git checkout -b 分支名,创建当前分支的备份分支,并切换到该分支;
2.2 git branch 分支名 创建分支
git checkout 分支名 切换分支
3.使用studio打开该项目,打开后可能会发现该项目不能运行或者编译不通过,这需要你找到其原因,目前我遇到的都是一些gradle版本不符合或者该项目中的引用资源路径不对之类的,稍作修改即可;
4.在studio中修改某个文件,然后在终端中执行git status,这个时候你会发现在对应的change to update状态下表明该文件被修改了(modified),但是缓存中还没有该文件,目前该文件的修改只限于工作空间(编辑器),此时如果要提交该修改,需要先将该文件add到缓存区,执行
git add 文件名
此时可以再执行git status 来查看当前本地的状态,你会发现在change to commit状态下存在该文件了,此时你可以查看缓存区的该文件和本地仓库中该文件的差异:
git difftool --cached 文件名
上述命令表示,对比缓存区和本地仓库中该文件的差异,注意的是,不是对比工作空间中文件;该命令后面不加文件名时,表示对比所有缓存区的文件;此时如果在对比工具中修改了文件内容,仅仅是修改了工作空间的文件,如果要将该修改提交,则还要将该文件add到缓存区;
确定修改好了之后,就可以提交了:
git commit
该命令会将缓存区中的文件修改提交到本地仓库,执行该命令后会让我们输入本次提交的相关说明;
这样我们的修改就被提交到本地仓库中,可以执行git log命令来查看我们的提交记录,其中commit号是我们回退时候需要的参数;
如果此时我们发现自己忘记提交一些文件,又不想再创建一个commit,可以撤销上一次的提交,
git commit -amend
然后再add遗漏的文件到缓存区,再提交;
确认所有修改都被提交之后,便可以将本地仓库的文件提交到远程仓库中,即:
git push origin 仓库名字(可以通过git branch -a来查看所有分支)
一些命令总结:
checkout:1.切换分支==》git checkout 分支名
2.回撤修改;
git checkout filename 撤销filename文件在工作空间中的修改,
git checkout . 注意到 checkout 后面有个”.”,就是代表所有文件的意思把所有文件都撤回刚才在工作区上的改动。
git checkout cimmit号 filename 撤销目标文件的修改,使文件暂存区和工作区都回到某一次提交时的状态;
reset :撤销操作,但是不同的参数会导致不同的效果,常用如下:
git reset HEAD filename 回退某个文件到前一次的提交的状态,仅仅是暂存区的改变,工作空间不会修改,其中HEAD可以理解为上一次提交的commit号,filename不加的时候表示回退所有文件;
git reset –soft 意味着工作区不会收到影响,暂存区回到了那个节点的commit时的状态。也就是说你在提交后所做的修改不会被没收;
git reset –hard 这个用法和刚才的类似,就是多了个–hard,意味着你工作区的代码也会回档,和暂存区保持一致,都回到了那个节点的commit时的状态。
git学习资料: