今天差点玩过了,那怎么可以呢?和师姐聊天很开心
回想了下,今天好像效率有点低
在说GIT之前,先提一下CVS、SVN
CVS(Concurrent Version System协同版本控制系统)是一个C/S系统,是一个常用的代码版本控制软件。主要在开源软件管理中使用。与它相类似的代码版本控制软件有subversion。主要用于多人开发环境下的源码维护。
CVS工作思路:
在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序。由源代码库管理员统一管理这些源程序。每个用户在使用源代码库之前,首先要把源代码库里的项目文件下载到本地,然后用户可以在本地任意修改,最后用CVS命令进行提交,由CVS源代码库统一管理修改。这样,就好像只有一个人在修改文件一样,既避免了冲突,又可以做到跟踪文件变化等。
SVN(subversion),相对于的RCS、CVS,采用了分支管理系统,近年来崛起的版本管理软件,目标取代CVS。互联网上免费的版本控制服务多基于Subversion。
CVS、SVN都属于Centralized Version Control Systems CVCS集中化版本控制系统
三、GIT
1.GIT是什么?
GIT是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理,是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Distributed Version Control System,简称DVCS
GIT(the stupid content tracker) Git最为出色的是它的合并追踪(merge tracing)能力。
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。Git 使用SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个SHA-1 哈希值,作为指纹字符串。该字串由40 个十六进制字符(0-9 及a-f)组成。???这到底是怎么回事,还没弄清楚
2.GIT的功能
Subversion、CVS等,他们使用“增量文件系统” (Delta Storage systems), 就是说它们存储每次提交(commit)之间的差异。Git正好与之相反,它会把你的每次提交的文件的全部内容(snapshot)都会记录下来。
从一般开发者的角度来看git有以下功能:
(1):从服务器上克隆数据库(包括代码和版本信息)到单机上。
(2):在自己的机器上创建分支,修改代码。
(3):在单机上自己创建的分支上提交代码。
(4):在单机上合并分支。
(5):新建一个分支,把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
(6):生成补丁(patch),把补丁发送给主开发者。
(7):看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
(8):一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
有点问题,回头再看。
基本的Git 工作流程如下所示:
(1). 在工作目录中修改某些文件。
(2). 对这些修改了的文件作快照,并保存到暂存区域。
(3). 提交更新,将保存在暂存区域的文件快照转储到git 目录中。
Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作
目录以及暂存区域。
3.GIT命令 把书上的命令都记下了,才发现原来不用,只要记住常用的那几个就可以了。生活也是如此,不必每件事都做得那么好,不必让每个人都觉得你好。
git clone : 一次Git 克隆会建立你自己的本地分支master 和远程分支origin/master,它们都指向origin/master 分支的最后一次提交.git clone git@gitserver:test.git mygit
git add:跟踪新文件、把已跟踪的文件放到暂存区、还能用于合并时把有冲突的文件标记为已解决状态
git status:检查当前文件状态
创建一个名为.gitignore 的文件,列出要忽略的文件模式,cat .gitignore
Git diff:比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
Git diff --cached:比较的是已经暂存起来的文件和上次提交时的快照之间的差异
git commit :提交-m 参数后跟提交说明的方式
git commit -a: 会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add 步骤,跳过使用暂存区域。
git rm --cached 文件名:把文件从Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除,但不删除文件。
git rm -f: 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项-f(译注:即force 的首字母),以防误删除文件后丢失修改的内容。
这里加rm -rf file_name:强制删除文件
Git mv file_from file_to :对文件改名
相当于
$ mv README.txt README
$ git rm README.txt
$ git add README
git log: 查看提交历史 -p 选项展开显示每次提交的内容差异,用-2 则仅显示最近的两次更新;--stat,仅显示简要的增改行数统计
-(n) 仅显示最近的n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
--pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。
git log --pretty=oneline: 将每个提交放在一行显示,这在提交数很大时非常有用。
format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,例如:$ git log --pretty=format:"%h - %an, %ar : %s"
如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行--amend 提交:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
Git reset HEAD <file>:取消已经暂存的文件
Git checkout --<file>:取消对文件的修改
git remote :列出每个远程库的简短名字,在克隆完某个项目后,至少可以看到一个名为origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库。-v 选项,显示对应的克隆地址。
git remote add [shortname] [url]:添加远程仓库
git fetch [remote-name]:从远程仓库抓取数据到本地
默认情况下git clone 命令本质上就是自动创建了本地的master 分支用于跟踪远程仓库中的master 分支(假设远程仓库确实有master 分支)。所以一般我们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中当前分支。
git push [remote-name] [branch-name]:将本地仓库中的数据推送到远程仓库。例如:git push origin master
git remote show [remote-name] :查看某个远程仓库的详细信息
git remote rename :命令修改某个远程仓库的简短名称
git remote rm:移除对应的远端仓库
git tag:列出已有的标签
git tag -a tag_name -m 'my version 1.4':创建一个含附注类型的标签,-a 指定标签名字,-m 指定对应的标签说明
git show :查看相应标签的版本信息,并连同显示打标签时的提交对象
git push origin [tagname]:分享标签,如果要一次推送所有(本地新增的)标签上去,可以使用--tags 选项
git config: 为命令设置别名,例如:git config --global alias.br branch
分支:
Git会使用master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的master 分支,它在每次提交的时候都会自动向前移动。
Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为HEAD 的特别指针。在Git 中,它是一个指向你正在工作中的本地分支的指针。git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去。要切换到其他分支,可以执行git checkout 命令。我们现在转换到新建的testing 分支,$ git checkout testing这样HEAD 就指向了testing 分支。
git checkout branch_name:只是转换HEAD指向的分支
git checkout -b branch_name:新建分支,HEAD指针并切换到该分支
git branch -d branch_name:删除分支
git branch:不加任何参数,列出所有分支
git branch -v :查看各个分支最后一次commit 信息
git branch -merge :查看哪些分支已被并入当前分支
git branch --no-merged :查看尚未合并的工作:
远程分支(remote branch)是对远程仓库状态的索引,标记你上次连接远程仓库时上面各分支的位置。
git fetch origin 来进行同步。
git push (remote_name) (branch_name):推送我的branch_name本地分支,到远程仓库的--分支。
git push [远程名] :[分支名]:删除远程分支
git remote add :
git pull:执行两个操作,它从远程分支(remote branch)抓取修改 的内容,然后把它合并进当前的分支
合并分支:1.快进合并,没有什么分歧需要解决,只是简单地把指针前移2.合并提交,因为祖先不只一个
git checkout master
git merge branchename: 把branchname合并到当前工作分支
把一个分支整合到另一个分支的办法有两种:merge(合并) 和rebase(衍合)
git checkout experiment
git rebase master
它的原理是回到两个分支(你所在的分支和你想要衍合进去的分支)的共同祖先,提取你所在分支每次提交时产生的差异(diff),把这些差异分别保存到临时文件里,然后从当前分支转换到你需要衍合入的分支,依序施用每一个差异补丁文件。
git rebase [主分支] [特性分支]:先检出特性分支,然后在主分支上重演。
4.GIT的原理
Git 是一套内容寻址文件系统。原理明天弄清楚,更。以后用到再更吧。