前言
本文主要介绍的是Git入门学习。
Git学习
版本控制
- 概念:版本控制是一种记录一个或者若干个文件内容变化,以便将来查询特定版本修订情况的系统。除了项目源代码,你可以对任何类型的文件进行版本控制
- 为什么使用:有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了那个地方,从而找出导致怪异问题出现的原因,有事谁在何时 报告了某个功能缺陷等等。
认识Git
Git简史
Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,而且对新的版本控制系统做了很多改进。
Git与其他版本控制系统的主要区别
Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。下面我们主要说一个关于 Git 其他版本管理系统的主要差别:对待数据的方式。
Git采用的是直接记录快照的方式,而非差异比较。我后面会详细介绍这两种方式的差别。
大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。具体原理如下图所示,理解起来其实很简单,每个我们对提交更新一个文件之后,系统记录都会记录这个文件做了哪些更新,以增量符号Δ(Delta)表示。
我们怎样才能得到一个文件的最终版本呢?
很简单,高中数学的基本知识,我们只需要将这些原文件和这些增加进行相加就行了。
这种方式有什么问题呢?
比如我们的增量特别特别多的话,如果我们要得到最终的文件是不是会耗费时间和性能。
Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个快照流。
Git的三种状态
- 已提交(committed):数据以及安全的保存在本地数据库中。
- 已修改(modified):表示修改了文件,但是还没有保存到数据库中。
- 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入Git项目的三个工作区域的概念:Git仓库(.git directory)、工作目录(Working Direcotry)、暂存区域(Staging Area)。
基本的Git工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录。
Git使用快速入门
获取Git仓库
两种方法取得Git项目仓库:
- 在现有目录中初始化仓库:进入项目目录进行
git init
命令,该命令将创建一个名为.git
的子目录。 - 从一个服务器克隆一个现有的Git仓库:
git clone [url]
自定义本地仓库的名字:git clone [url] directoryname
。
记录每次更新到仓库
- 检测当前文件状态:
git status
- 提出更改(把它们添加到暂存区):
git add filename
(针对特定的文件)、git add *
(所有文件)、git add *.txt
(支持通配符,所有.txxt文件) - 忽略文件:
gitignore
文件 - 提交更新:
git commit -m "代码提交信息"
(每次准备提交前,先用git status
看下,是不是都已经暂存起来了,然后再运行提交命令git commit
) - 跳过使用暂存区域更新的方式:
git commit -a -m "代码提交信息"
。git commit
加上-a
选项,Git就会自动把所有跟踪过的文件暂存起来一并提交,从而跳过git add
步骤。 - 移除文件:
git rm filename
(从暂存区域移除,然后提交) - 对文件重命名:
git mv README.md README
(这个命令相当于mv README.md README
、git rm README.md
、git add README
这三条命令的集合)
推送改动到远程仓库
- 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin <server>
,比如我们要让本地的一个仓库和Github上创建一个仓库管理可以这样:git remote add origin https://github.com/tfleof/mygit.git
- 将改动提交到远程仓库:
git push origin master
(可以把master换成你想要推送的任何分支) - 如此就能够将你的改动推送到所添加的服务器上。
远程仓库的移除与重命名
- 将test重命名为test1:
git remote rename test test1
- 移除远程仓库test1:
gti remote rm test1
查看提交历史
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log
命令。git log
会按提交时间列出所有的更新,最近的更新排在最上面。
可以添加一些参数来查看自己希望看到的内容:
只看某个人的提交记录:
git log --author = bob
撤销操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend
选项的提交命令尝试重新提交:
git commit --amend
取消暂存的文件
git reset filename
撤销对文件的修改
git checkout --filename
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origin
git reset --hard origin/master
分支
分支是用来将特性开发绝缘开来的。再你创建仓库的时候master
是默认的分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
我们通常再开发新功能、修复一个紧急bug等等的时候会选择创建分支。单分支开发好还是多分支开发好,还是要看具体场景来说。
创建一个名字叫做test的分支
git branch test
切换当前分支当test(当你切换分支的时候,Git会重置你的工作目录,十七看起来像回到了你在那个分支上最后一次提交的样子。Git会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样)
git checkout test
你也可以直接这样创建分支并切换过去(上面两条命令的合写)
git checkout -b feature_x
合并分支(可能出现冲突)
git merge test
删除新建分支
git branch -d feature_x
将分支推送到远端仓库(推送成功后其他人可见)
git push origin