一、四个工作区域
Workspace: 工作区,就是你平时存放项目代码的地方
Index/Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 本地仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。
其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
备注:工作区时写好的代码经过“git add .” 后,即会进入暂存区。
二、工作流程
1、工作区:修改文件、新增文件处于这个区。
2、暂存区:执行git add后,将工作区的内容保存到暂存区
3、本地仓库区:执行git commit后,将暂存区的内容保存到仓库区
4、远程仓库:执行git push后,将本地仓库区的内容保存到服务器
三、文件的四种状态
Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处,
如果它被修改, 而变为Modified.
如果使用git rm移出版本库, 则成为Untracked文件
Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态,
使用git checkout 则丢弃修改过,
返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态.
执行git reset HEAD filename取消暂存, 文件状态为Modified
下面的图解释了这四种状态的转变:
新建文件—>Untracked
使用add命令将新建的文件加入到暂存区—>Staged
使用commit命令将暂存区的文件提交到本地仓库—>Unmodified
如果对Unmodified状态的文件进行修改—> modified
如果对Unmodified状态的文件进行remove操作—>Untracked
四、常用git命令
一、基本环境
1.1、查看git版本
git --version
1.2、查看仓库的远端地址
git remote -v
1.3、查看所有文件状态
git status
二、checkout
2.1、检出本地已经存在的分支
git checkout [本地已存在的分支名]
例如:git checkout release
2.2、基于指定分支(可以是远端分支)创建本地新分支,并立即切换过去,-b 表示创建新分支
git checkout -b [新分支名] [已存在的分支名]
例如:git checkout -b master2 remotes/mega/master
2.3、git checkout [文件路径/文件名]
用途:将目标文件【检出】到【工作区】,通常用于覆盖工作区的修改。
两种情况
情况1:此文件已经add过,则会将【索引区】的【此文件】【检出】到【工作区】,原【工作区】的【此文件】会被覆盖
情况2:此文件没有add过,刚会将【本地仓库】的【此文件】【检出】到【工作区】,原【工作区】的【此文件】会被覆盖
2.4、git checkout .
用途:对【工作区】内的【所有文件】遍历执行 git checkout [文件路径/文件名],效果类比单文件checkout
2.5、git checkout
用途:显示【工作区】相比较于【本地仓库】修改过的文件。add过的文件也显示出来,因为参照系是【本地仓库】,而不是【索引区】。
备注:checkout后面不带任何参数。
三、branch
3.1、显示本地所有分支名称
git branch
3.2、显示本地和远端所有分支名称
git branch -a
3.3、显示本地和远端所有分支名称,及各分支的最后提交
git branch -av
3.4、基于本地当前节点,创建本地新分支
git branch [本地新分支名]
3.5、删除本地分支
git branch -d [本地分支名]
3.6、强制删除本地分支
git branch -D [本地分支名]
3.7、修改本地分支的名称
git branch -m [本地旧分支名] [本地新分支名]
四、pull
4.1、变基式拉取
git pull --rebase
五、push
5.1、将本地分支推送到远程
git push origin [本地分支名称]
5.2、删除远程的分支
git push --delete origin [远程分支名称]
六、reset
6.1、可以指定退回某一次提交的版本,【工作区的修改、暂存区的内容、及由 reset 所导致的新的文件差异,都会被放进工作区】
git reset [提交id]
git reset --mixed [提交id]
6.2、可以指定退回某一次提交的版本,【保留工作区和暂存区,由 reset 所导致的新的文件差异会被放进暂存区】
git reset --soft [提交id]
6.3、可以指定退回某一次提交的版本,【同时清空工作区和暂存区】
git reset --hard [提交id]
七、stash
7.1、将本地未提交、但已add的修改 临时保存起来
git stash save [暂存本地的名称]
7.2、查看本地的临时保存记录
git stash list
7.3、将本地的临时保存都提出来
git stash pop
八、rm
某此时候,整个项目中可能有一些没有任何作用的、支撑框架运行的文件,而这些文件又非常大,假如把它们上传到git服务上,其它同事clone代码就会花费很长时间。这时可以将这些文件排除在git跟踪范围之外
8.1、从暂存区或本地仓库中移除,但不删除工作区里的文件(即add后的内容可以用下面的命令删除,但若重新add仍然会进暂存区或本地仓库)
git rm --cached [文件路径]
8.2、类比 8.1 的操作,不同的是对文件夹内的所有文件生效
git rm -r --cached [文件夹路径]
九、clean
9.1、git clean
用途:清除没有加入git版本库的文件
参数: -n 演习。并不执行删除操作,只显示将被清理的文件列表
-f 删除文件,但不会动.gitignore里标记的
-df 删除文件和目录,但不会动.gitignore里标记的
备注:与git checkout . 的区别,两者通常都用于删除工作区的修改。 \
区别在于checkout会用【索引区】或【本地仓库】的版本来覆盖【工作区】,以达到删除工作区的目的。
而 clean 的目标文件是未加入git跟踪的,所以不存在索引区和本地仓库的版本,对未加入git跟踪的文件执行checkout也会报错
十、.gitignore
直接在本地git仓的根目录下建立名称为“.gitignore”的文件,文件内每一行表示一条排除规则
/Logs
java.iml
/Lib*
举例说明:第一行表示排除Logs文件及其内部所有文件,第二行排除java.iml文件,第三行排除以“Lib”开头的所有文件夹