Git是一个分布式版本管理系统,是为了更好地管理Linux内核开发而创立的。
Git可以在任何时间点,把文档的状态作为更新记录保存起来。因此可以把编辑过的文档复原到以前的状态,也可以显示编辑前后的内容差异。
而且,编辑旧文件后,试图覆盖较新的文件的时候(即上传文件到服务器时),系统会发出警告,因此可以避免在无意中覆盖了他人的编辑内容。
管理历史记录的数据库
数据库是记录文件或目录状态的地方,存储着内容修改的历史记录。在数据库的管理下,把文件和目录修改的历史记录放在对应的目录下。
1、Git分为远程数据库和本地数据库:
-
远程数据库:配有专用的服务器,为了多人共享而建立的数据库
-
本地数据库:为了方便用户个人使用,在自己机器上配置的数据库。
数据库分为远程和本地两种。平时用手头上的机器在本地数据库上操作就可以了。如果想要公开在本地数据库中修改的内容,把内容上传到远程数据库就可以了。另外,通过远程数据库还可以取得其他人修改的内容。
2、修改记录的提交:
若要把文件或目录的添加和变更保存到数据库,就需要进行提交。
执行提交后,数据库中会生成上次提交的状态与当前状态的差异记录(也被称为revision)。
提交是以时间顺序排列状态被保存到数据库中的。凭借该提交和最新的文件状态,就可以知道过去的修改记录以及内容。
执行提交时,系统会要求输入提交信息。请务必输入提交信息,因为在空白的状态下执行提交会失败的。
3、工作树和索引
在Git管理下,大家实际操作的目录被称为工作树。
在数据库和工作树之间有索引,索引是为了向数据库提交作准备的区域。
Git在执行提交的时候,不是直接将工作树的状态保存到数据库,而是将设置在中间索引区域的状态保存到数据库。因此,要提交文件,首先需要把文件加入到索引区域中。
所以,凭借中间的索引,可以避免工作树中不必要的文件提交,还可以将文件修改内容的一部分加入索引区域并提交。
Git的基础
1、安装
可以选择使用window工具,也可以选择使用命令行。这里先讲命令行
从这里下载安装
Redirecting Git for Windows' homepage...http://msysgit.github.io/
设置用户名和电子邮件
2、新建本地数据库
先创建一个名为 mygit 的空文件夹,进入文件夹右键选择Git Bash Here
然后执行 init 指令:git init
也可以全部采用命令行:
$ mkdir tutorial
$ cd tutorial
$ git init
3、提交文件
查看工作群和索引的状态:git status
git status : 添加-s选项,可以不显示讲解,再添加-b选项,就不显示讲解,显示分支的名称。
然后在mygit文件夹中创建 git-study 文本文件,其中输入:学习 git,再查看状态
红色是指没有提交的修改
此时可以看出,不是历史记录文件的是 git-study.txt(也可以叫做没有提交的修改), 只要加入索引,就会是历史记录的对象
加入索引的指令是 add
//file填入文件名,通过空格分隔需要加入的多个文件
git add <file>..
//这个可以把所有文件加入索引
git add .
然后把git-study.txt文件加入索引
加入索引后就可以提交了,
//""里面输入备注信息
git commit -m ""
这样没有提交的修改就没有了
然后来确认一下数据库的提交记录:
gitk 使用工具:
这里我在码云上创建了远程数据库practice。
4、push
为了将本地数据库的修改记录共享到远程数据库,必须上传本地数据库中存储的修改记录。
为此,需要在Git执行推送(Push)操作。执行Push之后,本地的修改记录会被上传到远程数据库。所以远程数据库的修改记录就会和本地数据库的修改记录保持同步。
可以为远程数据库的地址重命名并保存。这样,下次推送的时候就不需要输入长串的远程数据库地址了。所以先让我们以“origin”的名称命名一个远程数据库然后开始推送。
//添加远程数据库,可以使用remote指令。 <name>是注册名称,<url>是指定远程数据库的URL。
git remote add <name> <url>
5、clone
进行克隆(Clone)操作就可以复制远程数据库。
执行克隆后,远程数据库的全部内容都会被下载。之后您在另一台机器的本地数据库上进行操作。
克隆后的本地数据库的变更履历也会被复制,所以可以像原始的数据库一样进行查看记录或其他操作。
6、pull
进行拉取(Pull) 操作就可以把远程数据库的内容更新到本地数据库。
进行拉取(Pull) 操作,就是从远程数据库下载最近的变更日志,并覆盖自己本地数据库的相关内容。
7、练习
通过运行以下指令,将创建于上一个页面的远程数据库的URL以“origin”命名注册。
执行推送或者拉取的时候,如果省略了远程数据库的名称,则默认使用origin为远程数据库的名称,因此一般都会把远程数据库命名为origin
//向数据库推送,可以使用push命令。<repository>是推送的目标地址,<refspec>是指定推送的分支。
//<refspec>也是指当前推送分支名---当前分支名有错的话可能推送空白分支,会报”dose not match any"
git push <repository> <refspec>...
运行以下命令便可向推远程数据库origin进行推送。如果指定了-u运行选项,下一次开始就可以省略其后的分支名称。但是,首次运行指令向远程数据库推送时,不能省略远程数据库名称或分支名称。
git push -u origin master -f
该报错是因为你在本地仓库上的修改没有基于远程库最新版本,你的本地仓库版本落后于远程仓库。(这个报错告诉我们在本地开发的时候,要经常使用git pull获取远程分支最新改动,这样才能保证在最终git push的时候本地commit历史和远程commit历史是一致的)
这里应该是因为我在创建远程仓库的时候提示我提交README.md,我进行了编辑并提交,导致远程和本地冲突
解决方式一:强制推送--会导致远程的修改丢失——README.md没了
解决方式二:根据报错先pull
-
此时可能会遇见报错: refusing to merge unrelated histories
这是因为一开始是通过git init初始化的,不是通过git clone方式建立的,导致远程和本地仓库不是统一的。
可以使用:git pull origin master –-allow-unrelated-histories 解决
-
成功的话,远程修改的README.md文件就会拉取到本地仓库。
然后就可以继续Push了
//使用clone指令可以复制数据库,<repository>指定为远程数据库的URL,<directory>指定为复制目标目录的名称。
git clone <repository> <directory>
这时可以打开test文件,查看git-text.txt中内容是否与最先写入的一致。
-
这时进入test文件进行操作,git bash here
首先对git-study.txt文件进行修改,比如增加一句话:add 测试
然后操作:
这时push就可以省略origin master了
再查看远程端,发现提交记录。
-
从远程数据库pull
把前面test中推送的内容拉取到mygit:
在mygit中操作:
-
合并修改记录
在执行pull之后,进行下一次push之前,如果其他人进行了推送内容到远程数据库的话,那么你的push将被拒绝。
这种情况下,在读取别人push的变更并进行合并操作之前,你的push都将被拒绝。这是因为,如果不进行合并就试图覆盖已有的变更记录的话,其他人push的变更就会丢失。
合并的时候,Git会自动合并已有的变更点!不过,也存在不能自动合并的情况。这时就需要手动合并了
执行合并即可自动合并Git修改的部分。但是,也存在无法自动合并的情况。
如果远程数据库和本地数据库的同一个地方都发生了修改的情况下,因为无法自动判断要选用哪一个修改,所以就会发生冲突。
==分割线上方是本地数据库的内容, 下方是远程数据库的编辑内容。
Git会在发生冲突的地方修改文件的内容
修正所有冲突的地方之后,执行提交。
-
用mygit和test制造冲突:
先在mygit中的git-study.txt文件中增加:commit mygit冲突
再进行提交
再用test操作:
修改文件内容:增加 pull test冲突
提交并推送:
在mygit中操作:
推送内容到远程:
-
解决冲突:
先git pull
然后打开git-study.txt文件查看冲突内容:
采用两方的修改
文件的内容发生了修改,所以需要进行提交。
用log命令来确认下更新记录吧。 指定--graph选项,能以文本形式显示更新记录的流程图。指定--oneline选项,能在一行中显示提交的信息。
这表明两个修改记录已经整合了。
这时候,之前被拒绝的push应该可以通过了。
以上内容都参考与这个教学所写: