基本概念及原理
关于版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 工作中我们对项目代码进行版本控制,但实际上,我们可以对任何类型的文件进行版本控制。
本地版本管理系统
RCS是本地版本管理系统中最流行的一种,解决人们采用复制项目或文件的古老方式来管理文件的问题。
它的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
集中式版本管理系统
集中式版本管理系统最常用的如Subversion,解决开发者协同工作的问题;
这类系统,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
- 优点:
- 可以了解项目中其他人做了什么
- 管理员可以掌控每个开发者的权限
- 轻松管理一个CVCS。
- 缺点:中央服务器单点故障时,就无法协同工作。如果磁盘损坏,那将是毁灭性的灾难。
分布式版本管理系统
分布式版本管理系统(DVCS)面世,就是为了解决上述问题。这类系统如 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。
Git入门
Git发展简史及特性
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)司令副官的工作流程。
Git工作原理和流程
工作原理
- 直接记录快照,而非差异比较。
- 1. 存储每个文件与初始版本的差异;
- 2. 存储项目随时间改变的快照,Git 对待数据更像是一个快照流。
- 近乎所有操作都是本地执行。
因为Git克隆操作在客户端保存了整个代码仓库,包括了历史版本提交,而不只是最新版本代码。 - Git保证完整性
存储时计算校验和,然后引用校验和。该种机制叫做SHA-1 散列机制,是基于Git中文件的内容和目录结构计算出的。 - Git一般只添加数据。
一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。 - 三种文件状态
已提交(committed)、已修改(modified)和已暂存(staged)。已提交表示数据已经安全的保存在Git本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。由此引出三个工作区:工作目录、暂存区、Git仓库。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。
工作流程
- 基本的Git工作流程如下:
- 1. 在工作目录中修改文件;
- 2. 暂存文件,将文件的快照放入暂存区域;
- 3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
Git与svn的区别
- Git 是分布式的,SVN 不是
- Git 把内容按元数据方式存储,而 SVN 是按文件
- Git 分支和 SVN 的分支不同
- Git 没有一个全局的版本号,而 SVN 有
Git 的内容完整性要优于 SVN
命令行模式
命令行模式支持git所有命令。各种GUI工具提供的功能只是个子集,包括IDEA中集成的Git功能、小乌龟TorterseGit。学会了命令行模式,上手各种GUI工具也就不在话下。
在IntelliJ IDEA中操作Git
安装Git
在各系统上不同方式安装Git(略)
参考链接Git安装
初次运行前配置
- 三层级别:git配置分三个级别的配置,每一级别覆盖上一级别的配置。
- /etc/gitconfig 文件:包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
- ~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
- .git/config :针对该仓库。
在 Windows 系统中,Git 会查找 $HOME 目录下(一般情况下是 C:\Users$USER)的 .gitconfig 文件。 Git 同样也会寻找 /etc/gitconfig 文件,但只限于 MSys 的根目录下,即安装 Git 时所选的目标位置。
- 配置用户信息、文本编辑器等
- 检查配置信息:重复的变量名最后一个生效。
# 配置列表检查: $ git config --list # 单项配置检查: $ git config <key>
如何寻求帮助
git help
常用应用场景整理
bash命令方式
- 全局配置
git config --global user.name "userName" git config -- global user.email "yourMail"
- 创建新版本库
git clone <http://repository.remote.project.git> cd <project 项目根目录> touch README.md git add README.md git commit -m "add README" git push -u origin master -u:第一次push到远程时,可不加;默认远程origin
- 已存在本地项目推送至远程
cd existing_folder git init 在existing_folder目录文件夹下创建本地版本库 git remote add origin http://ip:port/project.git git add . git commit -m "提交日志" git push -u origin master
- 将已存在的本地Git版本库分支与tag推送远程
cd existing_repo git remote rename origin old-origin git remote add origin XXX.git git push -u origin --all git push -u origin --tags
- 基于当前分支创建目标分支并推送至远程
git checkout -b dev git pull git branch -a # 查看所有分支 git status git add . # 添加全部文件到暂存区 或者添加指定文件到暂存区; git commit -m "提交日志" # 提交并记录日志信息; git push origin dev # push到远程dev分支;
详细Git命令使用及说明请参考Git入门——(二)常用命令及应用
常见问题
账号密码操作
解决方案:
- 如果账号密码有变动 用这个命令 git config --system --unset credential.helper 重新输入账号密码 应该就能解决了
- 如果用了第一个命令 还不能解决问题那么 用这个命令: git config --global http.emptyAuth true
- 记住密码命令: 避免需要多次输入密码;
git config --global credential.helper store - ssh 与 https模式 https模式需要输入账号密码;ssh本地存储私钥和公钥;
命令相关问题
- git clone远程项目(此时本地分支与远程分支是绑定的。并且master分支权限控制,不可以push。)
参考Git入门——(二)常用命令及应用
GitHub访问速度慢的解决方法
- 1、vpn
- 2、绕过dns解析,在本地直接绑定host。打开dns查询工具网站http://tool.chinaz.com/dns 查询域名github.global.ssl.fastly.NET解析获取其IP.
- 3、在C:\Windows\System32\drivers\etc\hosts文件中加入 151.101.88.249 github.global.ssl.fastly.Net
http://ipaddress.com/ip_lookup/
151.101.229.194
203.208.39.99 assets-cdn.github.com
74.125.23.190 dl-ssl.google.com
173.194.127.200 groups.google.com
192.30.252.131 github.com
185.31.16.185 github.global.ssl.fastly.net
74.125.128.95 ajax.googleapis.com
附录及参考
来源:https://www.cnblogs.com/lucius-ni/p/12185522.html