git相关知识
参考 git基础
分布式版本控制系统
分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。
Git与其他版本控制系统的差异
其他版本控制系统,指CSV,Subversion,perforce,Bazaar等等,他们保存的信息是一组基本文件和每个文件随时间逐步累积的差异。
Git保留每个(假设A文件被修改为A1文件,就完整的保存原A文件,新A1文件)文件的快照,然后将索引指向新文件,当需要回滚版本,只需要将索引回指就好了,其他系统需要在A+
Δ
A
1
\Delta A1
ΔA1文件中做减
Δ
A
1
\Delta A1
ΔA1操作。
可能Git将文件分解成细小单元,当每次更改少部分时,
Git在更新上传时,需要计算校验和。Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
三种状态
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
基本的 Git 工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
使用Git
参考 菜鸟教程-git教程
创建git仓库
在某目录中使用
git init
或使用
git init folder
会在当前目录下或指定的folder目录下创建一个.git目录。里面 包含一些git的配置信息。
表明该文件夹已经被初始化为一个git仓库,但不表示目录下的文件被git跟踪。
为目录下文件添加跟踪
git add *.c
git add readme.md
git commit -m
将目录下的.c后缀文件和readme文件添加到跟踪。
克隆仓库
熟悉的clone命令
git clone
使用不同的协议clone
git clone git@github.com:fsliurujie/test.git --SSH协议
git clone git://github.com/fsliurujie/test.git --GIT协议
git clone https://github.com/fsliurujie/test.git --HTTPS协议
使用git项目托管平台-GitHub
注册GitHub
由于本地仓库和远程仓库的交互是通过SSH协议,所以需要配置SSH。
生成SSH Key
ssh-keygen -t rsa -C "youremail@example.com" #你的GitHub注册邮箱
后面的 your_email@youremail.com 改为你在 Github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在 ~/ 下生成 .ssh 文件夹,进去,打开 id_rsa.pub,复制里面的 key。
或者在Windows下,使用Git Gui -->Help --> Show SSH Key -->Generate Key生成密钥。
回到 github 上,进入 Account => Settings(账户配置)。
左边选择 SSH and GPG keys,然后点击 New SSH key 按钮,title 设置标题,可以随便填,粘贴在你电脑上生成的 key。
为了验证是否成功,输入以下命令:
$ ssh -T git@github.com
Hi GuoPP027! You've successfully authenticated, but GitHub does not provide shell access.
在GitHub创建一个新仓库。
推送本地到远程
将本地仓库的内容推送到远程仓库。(请先确保内容已被git跟踪)
$ git remote add origin git@github.com:GuoPP027/git-test.git
$ git push -u origin master
在远程配置一个origin仓库。
将当前本地仓库的master分支推送到远程的origin仓库。
拉取远程到本地
1、从远程仓库下载新分支与数据:
2、从远端仓库提取数据并尝试合并到当前分支:
git fatch
git merge
-
执行 git fetch origin master 时,它的意思是从名为 origin 的远程上拉取名为 master 的分支到本地分支origin/master 中。既然是拉取代码,当然需要同时指定远程名与分支名,所以分开写。
-
执行 git merge origin/master 时,它的意思是合并名为 origin/master 的分支到当前所在分支。既然是分支的合并,当然就与远程名没有直接的关系,所以没有出现远程名。需要指定的是被合并的分支。
-
执行 git push origin master 时,它的意思是推送本地的 master 分支到远程origin,涉及到远程以及分支,当然也得分开写了。
-
还可以一次性拉取多个分支的代码:git fetch origin master stable oldstable
-
也还可以一次性合并多个分支的代码:git merge origin/master hotfix-2275 hotfix-2276 hotfix-2290