git

  • 版本控制
    版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

  • 分布式版本控制系统
    客户端并不只是提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样任何一处协同用的工作服务器故障,事后都可以用任何一个镜像出来的本地仓库恢复。
    因为每一次clone操作,都是对代码仓库的完整备份。

  • 直接记录快照,而非差异比较
    其他版本控制系统存储的是每个文件与初始版本的差异,git更像是把数据看作对小型文件系统的一组快照。每次你提交更新,或是在git中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。git对待数据更像一个快照流。

  • git三种状态
    已暂存,已修改,已提交
    已提交表示数据已经安全的保存在本地数据库中。已修改表示修改了文件。已暂存表示对一个已修改文件的当前版本做了标记。
    git仓库目录是git用来保存项目元数据和对象数据库的地方。从其他计算机clone仓库时,拷贝的就是这里的数据。
    工作目录是对项目的某个版本独立提取出来的内容。这些从git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

  • 初次运行git前配置
    .git/config 针对当前使用仓库的目录中的config文件。

  • 用户信息
    每一次git提交都会使用这些信息,并且会写到每一次提交当中,不可更改:

git config --global user.name
git config --global user.email

如果想针对特定项目使用不同的用户名与邮件地址,只要去除--global就可以

  • 获取git仓库
    有两种取得git项目仓库的方法。第一种是在现有项目或者目录下导入所有文件到git;第二种是从服务器clone一个仓库。

git init将创造一个名为.git的子目录,这个子目录含有初始化git仓库中所有的必须文件。

  • clone现有仓库
    git clone默认配置下远程仓库中的每一个文件的每一个版本都将被拉取下来。

  • 记录每次更新到仓库
    工作目录下的每一个文件只有两种状态:已跟踪或未跟踪。已跟踪的文件是那些被纳入版本控制的文件,在上一次快照中有它们的记录,未跟踪的文件既不存在于上次快照的记录,也不再暂存区。未跟踪的文件意味着git在之前的快照中没有这些文件;
    git add 可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态。git只不过暂存了运行git add命令时的版本,如果现在提交,运行的是最后一次Git add命令时的版本。

  • 忽略文件
    一般有些文件无需纳入git管理,也不希望它们总出现在未跟踪文件列表。
    gitignore文件中的匹配模式就是简化的正则,代表任意中间目录
    所有空行和#开头都会被git忽略。
    doc/
    /*.doc

  • 移除文件
    要从git移除某个文件,就必须从已跟踪清单移除,然后提交。
    可以使用git rm命令完成此项工作,并连带从工作目录中删除指定文件。

  • 移动文件

  • 撤销操作
    注意,有些撤销操作不可逆
    git commit --amend
    有时候我们提交完裁发现漏了几个文件没有添加,或者提交信息写错了,我们可以运行--amend重新提交
    这个命令会提交暂存区的文件。如果自上次提交以来还未做任何修改,那么快照会保持不变。

  • 取消暂存文件

git reset HEAD <file>

来取消暂存,不加选项的调用git reset并不危险,他只会修改暂存区域。

  • 撤销对文件的修改
git checkout -- [file] 
  • 从远程仓库拉取数据
git fetch [remote-name]

只有当有克隆服务器的写入权限,并且之前没有人提交过。这条命令才能生活。

  • 创建标签
    git主要有两种标签:轻量标签与附注标签
    一个轻量标签很像一个不会改变的分支 - 他只是一个特定提交的引用。
    附注标签是存储在git数据库中的一个完整对象。附注标签拥有打标签者的名字,电子邮件,日期时间,标签信息。
git tag -a v1.4 -m '附注信息'
git show
git tag -a v1.5 commitId

git show查看标签信息

  • 共享标签
    默认情况下,git push命令并不会传送标签到远程仓库上。必须显示的推送到服务器上。
git push origin [tagname]
  • git分支
    git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。
    git提交时,会保存一个提价对象。该提交对象包含一个指向暂存内容快照的指针。该提交对象还包含了各种信息,以及指向它父对象的指针。首次提交产生的提交对象没有父对象。
    暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照保存git仓库中,最终将校验和加入到暂存区域等待提交。
    当git commit时,git会计算每一个子目录的校验和,然后在git仓库中这些校验和保存为树对象。随后,git会创建一个提交对象,它除了包含各种信息外,还包含指向这个树对象(项目根目录)的指针。git在需要的时候就可以重现此次保存的快照。

git仓库有五个对象:3个blob对象、一个树对象(记录文件目录和blob对象索引)以及一个提交对象。

  • 快进
    由于当前master分支所指向的提交是你当前提交的直接上游,所以git只是简单将指针向前移动。

  • 远程跟踪分支
    远程跟踪分支是远程分支状态的引用。它们是你不能移动的本地引用,远程跟踪分支是你上次连接到远程仓库时,那些分支所处状态的书签。

  • 推送
    当你想要公开分享一个分支时,需要将其推送到有写入权限的远程仓库上。
    将分支push上去之后,下一次其他作者从服务器上抓取数据时,他们会在本地生成一个远程分支。

  • 跟踪分支
    从一个远程跟踪分支检出一个本地分支叫做跟踪分支。跟踪分支是一个与远程分支有直接关系的本地分支。如果在一个跟踪分支上git pull,git能自动识别去哪个服务器抓取数据。
    当clone一个仓库时,通常会自动创建一个跟踪分支。

  • 变基
    在git中整合来自不同分支的修改主要有两种方法:merge和rebase,在c4中引入补丁和修改,然后在c3的基础上应用一次。

git checkout exp
git rebase master

在master所指向的分支中应用exp分支的修改,并创建一个新的提交对象。它的原理是首先找到这两个分支的共同祖先,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底c3,最后将之前另存为临时文件的修改依序应用。现在回到master进行一次快进合并。
例如向某个其他人维护的项目贡献代码时。首先在自己的分支里进行开发,开发完成时需要先将自己的代码变基到master上,然后在向主项目提交修改。
变基是将一系列的提交应用到另一分支上,而合并则是把最终结果和到一起。
使用快进合并将分支指向同一个提交

  • 变基风险
    如果你已经将提交推送至某个仓库,而其他人已经从该仓库拉取提交并进行了后续工作,此时
    ,如果用git rebase重新整理提交。。。

  • 变基原则
    只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送处别处的提交执行变基操作。

服务器上的git

  • smart HTTP协议
    可以直接使用各种http的验证机制,使用http协议的用户名/密码的基础授权,免去设置ssh公钥。
    smart http既支持git协议一样设置匿名服务,也可以像ssh协议一样提供传输时的授权和加密。

分布式Git

  • 集中式工作流
    如果两个开发者从中心仓库clone代码下来,同时做一些修改,那么只有第一个开发者可以把数据推送回共享服务器。

  • 集成管理者工作流
    Git允许多个远程仓库存在,每个开发者拥有自己仓库的读写权限和其他开发者的读权限。这种情形会有一个权威仓库。要为这个项目做贡献,你需要从该项目clone一个自己的公开仓库,然后将自己的修改推送上去。

  • 私有管理团队
    我们假设o和e在一个特性上工作,同时o和e在第二个特性上工作。

  1. 首先e创建了一个featureA
  2. e又创建了一个featureB
  3. o推送了一个分支featureBee
  4. 此时e将featureB分支上合并的工作推送到featureBee上。
  5. o推送改动到了featureA
  • 合并工作流
    首先,我们会维护两个长期分支,分别是master和develop,master分支只会在一个非常稳定的版本发布时才会更新,而所有的新代码首先会被整合进develop分支。当打标签发布的时候,需要将master分支快进到develop分支,实际上就是将develop分支merge进master分支。

  • 大项目合并工作流
    Git项目包含四个长期分支:master,next,用于新工作的pu和用于维护性向后移植工作的maint分支。贡献者的新工作会收入特性分支中。之后对特性分支进行评估,检查能否合并。安全的特性分支会被合并入next分支

  • 为发布打标签
    留下一个标签的目的是在之后任何一个提交点都可以重新创建该发布。
    如果标签被签名,在版本库以blob对象的形式包含它们的公钥,并添加一个直接指向该内容的标签,首先找到所想要的key。
    之后可以通过导出key并通过管道传递给git hash-object来直接将key导入git数据库中,git hash-object命令会向Git中写入一个包含其内容的新blob对象,并向你返回sha1值,然后通过sha1的值创建一个指向它的标签:
    然后通过git push o--tags,标签将会被共享给所有人。

github

  • Fork
    如果想参与某个项目,但是没有推送权限,可以进行fork,github将在你的空间中创建一个完全属于你的项目副本,且你对其具有推送权限。然后通过pull request让它们的改动进入源版本库,
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容

  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,384评论 0 7
  • 一、基本概念: 注:对于git的分布式概念及其优点,不重复说明,自己百度或谷歌。本文中涉及到指令前面有$的,在cm...
    大厂offer阅读 1,396评论 0 3
  • git /gɪt/ 是一个开源的分布式版本控制系统 最初是 Linus Torvalds 为了帮助管理 Linux...
    TurboSnail阅读 1,262评论 0 0
  • 简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 与常用的版本控制工具 ...
    闽越布衣阅读 2,725评论 0 18
  • 这篇博文是自己在学习git过程中的思考总结。本文仅仅代表个人的看法,如有不妥地方还请本文文末留言。 😊 原文链接g...
    Ming_Hu阅读 1,043评论 4 18