git总结
参考 : pro git
Git版本控制软件结合GitHub从入门到精通常用命令学习手册
git基础
直接记录快照 , 而非差异对比
看下面两个图,第一个是git的,在每个版本的下面都有相应文件的快照,
如果这个文件没有被修改,那么就会有一个指向原文件的里链接,就是图中的
虚线框。
第二个这是像svn那些版本控制工具,每个版本下面记录的是文件的变化!记录的
是该版本下该文件更新了那些内容!
文件的三种状态
在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)
已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没
有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
git中文件状态的变化周期
tracked 和 untraked
已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录
所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂
存区域。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。
Git中的一些术语的理解:
远程仓库
因为多人协作必须要有一个公共的地方可以取或存 ,就像github 就是一个远程仓库
本地仓库
它就是远程仓库的在我们自己电脑上的一个镜像!.git文件夹里面就储存着该仓库的metedata
clone
可以通过git clone 拷贝远程仓库的一个镜像到本地
push
将本地仓库的修改推送到远程仓库 这里注意如果再之前有人push 导致远程仓库中有你不存在的文件..
得先fetch到本地 , 然后与本地仓库的merge
pull
从远程仓库拉资源下来
commit
这个提交是你的本地的修改提交到本地仓库
这样的好处 , 就是即使现在没有网,你也可以工作!
origin
你所克隆的原始仓库的默认名字
master
分支的默认名字
Head
指向的是当前工作的分支
理解分支
commit对象
下图就可以成是一个commit对象的结构
我们每次提交,都可以看成新建了一个commit对象
右边三个则是文件的快照,中间的tree则是存储快照文件
的索引,左边的commit对象则存储了其他元数据及指向tree
的指针
作些修改后再次提交,那么这次的提交对象会包含一个指向上次提交对象的指针
(即下图中的 parent 对象)。两次提交后,不就变成这样子了:
这样想想,以后如果想回到以前的版本 , so easy!
这想不想myeclipse中的那个图:
那么这里的master 和 head又是什么了?
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master
作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的
master 分支,它在每次提交的时候都会自动向前移动。
$ git branch testing // 创建新的分支
运行上面的命令 , 则会创建一个指向f30ab的分支testing
那么又是怎么知道你在那个分支上工作的了?
这就是HEAD的作用了!
你在那个上工作,head就会指向你,比如上面,你新建了一个testing的分支,但是
head依然指向的是master,所以依然工作的是master
可以通过下面的命令切换到testing
$ git checkout testing
现在 testing 分支向前移动了一格,而 master 分支仍然指向原先 git checkout
时所在的 commit 对象。
远程分支
是对远程仓库中的分支的索引。它们是一些无法移动的本地分支;只有在 Git 进行网络交互时才会更新。
意思就是说,当我们git clone 一个repo的时候,对于当前库的版本在本地就会有一个指针(origin/master)指向它!
然后,我们可以对本地库修改,提交,但是这个指针是不会变的...就像下图:
那么它的作用是什么?
因为在你push之前,可能有其他人push了,那么远程库中的版本(origin/master)就往前移了,但是我们本地是不知道的
它依然在原来的地方,所以,当我们要push的时候,有了这个远程分支的索引,直到在哪里分流...就像下面:
git命令:
创建文件 :touch filename
但是上面创建的这个文件时untracked。
通过git add filename 就会track这个文件,也就是它在版本控制的范围内
查看文件状态:
git status // 这也是一个神技 不同的文件状态在电脑的文件系统中会有不同的图标
git push [reponame] [branch_name] :如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就
会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。
git pull [reponame] ://抓取远程仓库中的数据并合并
如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull
命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支
默认 认情况下 git clone
命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)
git fetch [remote name] // 从远程仓库抓取本地仓库中没有的数据
git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)
但是它并没有自动合并
git merge [branch]:合并分支
git mergetool :合并工具
git remote add [shortname] [url]:添加远程仓库
$ git remote add pb git://github.com/paulboone/ticgit.git
分支有关的命令
git branch [branch name ] // 建立分支
git check out [brach name] // 变为当前工作分支
git branch -d [branch name] // 删除分支
git branch --no-merge // 没有合并的分支
git branch --merge // 合并的分支
总结我对git的理解:
git如果不push到远程仓库,那么实现的就是一个单人作业的版本控制系统!
他仍然可以控制你的版本,就像上面介绍commit对象的那个图一样,每次提交都会
有生成一个commit对象,它有个父指针指向前一个commit对象(上一次提交) ,并且还有个指针
指向该版本的快照... 这样我们就可以回溯到之前的任一个版本了...
而git通过push到远程,它实现的就是一种协同作业,也就是一种开源,向别人展示你的代码
而github就是提供了这么平台,一个代码托管的平台,一个开源的平台!
而对于git 的分支, 就是一个指向某个commit对象的一个指针。可以针对之前的版本建立一个branch
也可以在当前分一条支出来,就像一个后备的选择一样,看将来某个时刻要不要进行合并!
当然,合并的过程,可能会发生冲突... 需要我们手动的完成!
下一篇: a 标签为什么能够包含块级元素?
推荐阅读
-
Python第三方库的安装方法总结
-
SQL Server 排序函数 ROW_NUMBER和RANK 用法总结
-
HighCharts图表控件在ASP.NET WebForm中的使用总结(全)
-
在.jsp中非表单请求action的几种方式总结
-
Android studio怎么使用git获取最新内容然后合并?
-
matlab中分号、冒号、逗号等常用标点符号的功能和用法总结
-
跟老齐学Python之总结参数的传递
-
Android4.2中全屏或者取消标题栏的方法总结
-
干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结
-
Android 异步加载图片分析总结