目录:
git
版本控制介绍github
什么是版本控制数据库
为何要版本控制安全
本地版本控制系统服务器
集中化的版本控制系统网络
分布式版本控制系统app
认识 Git分布式
Git 简史ide
Git 与其余版本管理系统的主要区别工具
Git 的三种状态
Git 使用快速入门
获取 Git 仓库
记录每次更新到仓库
推送改动到远程仓库
远程仓库的移除与重命名
查看提交历史
撤销操做
分支
推荐阅读
版本控制是一种记录一个或若干文件内容变化,以便未来查阅特定版本修订状况的系统。 除了项目源代码,你能够对任何类型的文件进行版本控制。
有了它你就能够将某个文件回溯到以前的状态,甚至将整个项目都回退到过去某个时间点的状态,你能够比较文件的变化细节,查出最后是谁修改了哪一个地方,从而找出致使怪异问题出现的缘由,又是谁在什么时候报告了某个功能缺陷等等。
许多人习惯用复制整个项目目录的方式来保存不一样的版本,或许还会更名加上备份时间以示区别。 这么作惟一的好处就是简单,可是特别容易犯错。 有时候会混淆所在的工做目录,一不当心会写错文件或者覆盖意想外的文件。
为了解决这个问题,人们好久之前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差别。下图来源于Git官网。
接下来人们又遇到一个问题,如何让在不一样系统上的开发者协同工做? 因而,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。
集中化的版本控制系统都有一个单一的集中管理的服务器,保存全部文件的修订版本,而协同工做的人们都经过客户端连到这台服务器,取出最新的文件或者提交更新。下图来源于Git官网。
这么作虽然解决了本地版本控制系统没法让在不一样系统上的开发者协同工做的诟病,但也仍是存在下面的问题:
•单点故障:中央服务器宕机,则其余人没法使用;若是中心数据库磁盘损坏有没有进行备份,你将丢失全部数据。本地版本控制系统也存在相似问题,只要整个项目的历史记录被保存在单一位置,就有丢失全部历史更新记录的风险。•必须联网才能工做:受网络情况、带宽影响。
因而分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 Git 就是一个典型的分布式版本控制系统。
这类系统,客户端并不仅提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工做用的服务器发生故障,过后均可以用任何一个镜像出来的本地仓库恢复。 由于每一次的克隆操做,实际上都是一次对代码仓库的完整备份。下图来源于Git官网。
分布式版本控制系统能够不用联网就能够工做,由于每一个人的电脑上都是完整的版本库,当你修改了某个文件后,你只须要将本身的修改推送给别人就能够了。可是,在实际使用分布式版本控制系统的时候,不多会直接进行推送修改,而是使用一台充当“中央服务器”的东西。这个服务器的做用仅仅是用来方便“交换”你们的修改,没有它你们也同样干活,只是交换修改不方便而已。
分布式版本控制系统的优点不单是没必要联网这么简单,后面咱们还会看到 Git 极其强大的分支管理等功能。
Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。可是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合做关系结束,他们收回了 Linux 内核社区无偿使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出本身的版本系统,并且对新的版本控制系统作了不少改进。
Git 在保存和对待各类信息的时候与其它版本控制系统有很大差别,尽管操做起来的命令形式很是相近,理解这些差别将有助于防止你使用中的困惑。
下面咱们主要说一个关于 Git 其余版本管理系统的主要差异:对待数据的方式。
Git采用的是直接记录快照的方式,而非差别比较。我后面会详细介绍这两种方式的差异。
大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变动列表的方式存储信息,这类系统将它们保存的信息看做是一组基本文件和每一个文件随时间逐步累积的差别。
具体原理以下图所示,理解起来其实很简单,每一个咱们对提交更新一个文件以后,系统记录都会记录这个文件作了哪些更新,以增量符号Δ(Delta)表示。下图来源于Git官网。
咱们怎样才能获得一个文件的最终版本呢?
很简单,高中数学的基本知识,咱们只须要将这些原文件和这些增长进行相加就好了。
这种方式有什么问题呢?
好比咱们的增量特别特别多的话,若是咱们要获得最终的文件是否是会耗费时间和性能。
Git 不按照以上方式对待或保存数据。 反之,Git 更像是把数据看做是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的所有文件制做一个快照并保存这个快照的索引。 为了高效,若是文件没有修改,Git 再也不从新存储该文件,而是只保留一个连接指向以前存储的文件。 Git 对待数据更像是一个 快照流。下图来源于Git官网。
Git 有三种状态,你的文件可能处于其中之一:
•已提交(committed):数据已经安全的保存在本地数据库中。•已修改(modified):已修改表示修改了文件,但还没保存到数据库中。•已暂存(staged):表示对一个已修改文件的当前版本作了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工做区域的概念:Git 仓库(.git directoty) 、工做目录(Working Directory) 以及 暂存区域(Staging Area) 。下图来源于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
(支持通配符,全部 .txt 文件)•忽略文件:.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/Snailclimb/test.git
将
将这些改动提交到远端仓库:git push origin master
(能够把 master 换成你想要推送的任何分支)
如此你就可以将你的改动推送到所添加的服务器上去了。
•将 test 重命名位 test1:git remote rename test test1
•移除远程仓库 test1:git remote rm test1
在提交了若干更新,又或者克隆了某个项目以后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log
命令。git log
会按提交时间列出全部的更新,最近的更新排在最上面。
能够添加一些参数来查看本身但愿看到的内容:
只看某我的的提交记录:
git log --author=bob
有时候咱们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,能够运行带有 --amend
选项的提交命令尝试从新提交:
git commit --amend
取消暂存的文件
git reset filename
撤消对文件的修改:
git checkout -- filename
假如你想丢弃你在本地的全部改动与提交,能够到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origingit reset --hard origin/master
分支是用来将特性开发绝缘开来的。在你建立仓库的时候,master 是“默认的”分支。在其余分支上进行开发,完成后再将它们合并到主分支上。
咱们一般在开发新功能、修复一个紧急 bug 等等时候会选择建立分支。单分支开发好仍是多分支开发好,仍是要看具体场景来讲。
建立一个名字叫作 test 的分支
git branch test
切换当前分支到 test(当你切换分支的时候,Git 会重置你的工做目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工做目录和这个分支最后一次提交时的样子如出一辙)
git checkout test
你也能够直接这样建立分支并切换过去(上面两条命令的合写)
git checkout -b feature_x
切换到主分支
git checkout master
合并分支(可能会有冲突)
git merge test
把新建的分支删掉
git branch -d feature_x
将分支推送到远端仓库(推送成功后其余人可见):
git push origin
转自公众号: JavaGuide