一.概念
1、四个工作区域
Git本地有四个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下:
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
2、工作流程
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
3、文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用
SHA-1算法计算文件的校验和。
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
二、四个区域常用命令
1、新建代码库
在当前目录新建一个Git代码库
git init
新建一个目录,将其初始化为Git代码库
git init [project-name]
下载一个项目和它的整个代码历史
git clone [url]
2、查看文件状态
查看指定文件状态
git status [filename]
查看所有文件状态
git status
3、工作区<–>暂存区
添加指定文件到暂存区
git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录
git add [dir]
添加当前目录的所有文件到暂存区
git add .
当我们需要删除暂存区或分支上的文件, 同时工作区也不需要这个文件了, 可以使用(⚠️)
git rm file_path
当我们需要删除暂存区或分支上的文件, 但本地又需要使用, 这个时候直接push那边这个文件就没有,如果push之前重新add那么还是会有。
git rm --cached file_path
直接加文件名 从暂存区将文件恢复到工作区,如果工作区已经有该文件,则会选择覆盖
; 加了【分支名】 +文件名 则表示从分支名为所写的分支名中拉取文件 并覆盖工作区里的文件
git checkout
4、工作区<–>资源库(版本库)
将暂存区–>资源库(版本库)
git commit -m '该次提交说明'
如果出现:将不必要的文件commit 或者 上次提交觉得是错的 或者 不想改变暂存区内容,只是想调整提交的信息,移除不必要的添加到暂存区的文件
git reset HEAD 文件名
去掉上一次的提交(会直接变成add之前状态)
git reset HEAD^
去掉上一次的提交(变成add之后,commit之前状态)
git reset --soft HEAD^
5、远程操作
取回远程仓库的变化,并与本地分支合并
git pull
上传本地指定分支到远程仓库
git push
6、其它常用命令
显示当前的Git配置
git config --list
编辑Git配置文件
git config -e [--global]
初次commit之前,需要配置用户邮箱及用户名,使用以下命令:
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
调出Git的帮助文档
git --help
查看某个具体命令的帮助文档
git +命令 --help
查看git的版本
git --version
linux命令行将已有项目提交到github
之前用git是在windows下用git的图形化界面进行操作的,这次有一个写了几天的小项目想提交到git上,linux命令行下面没有图形化的界面,所以全部需要git命令来操作。
实践之后,主要是下面几个步骤:
(1) 登陆github,创建一个repo项目
(2) 在自己项目工程目录下面运行git init
(3) 然后将工程下面的所有需要的代码和配置添加到git,命令:git add *.cpp *.h CMakeLists.txt(根据自己的需要添加)
(4) 然后运行git commit -m “log message(自己的提交日志)”,注意这里一定要加-m,加上提交日志,否则其实提交是不成功的,在后面的push操作中会提示错误:“error: src refspec master does not match any.”,主要就是在这一步浪费了比较多的时间。
(5) 然后再运行git remote add origin https://github.com/lovemychobits/minihttpd.git,在github上面添加origin
(6) 最后提交我们指定的代码,命令:git push -u origin master,然后git会提示你输入你github上面的用户名和密码,然后会进入一个文件上传的界面,上传完成结束。
经过上面几个比较简单的步骤,就可以将自己已有的工程提交到github上面了。其实在github上创建了一个空项目的时候,github的网页上对这些步骤本身就是有一个比较详细的提示了,只是我一开始没太注意浪费了一点时间,另外主要还是在commit的时候,没有-m附加信息。
在git push之前,如果想知道本次提交或者修改了哪些东西,可以用git status来查看一下。另外如果add的时候,添加了一些自己不想要的文件夹,或者文件,可以分别用git rm -rf 文件夹,和git rm 文件,来进行删除,区别就是删除文件夹需要加-rf。这里的删除文件夹是指删除提交到git上的,不是指删除本地的哦。
git命令行的简单使用就是这样了。