type
status
date
slug
summary
tags
category
icon
password
Chapter 1 起步
1.1关于版本控制
- 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
History
- 本地版本控制
- 集中化版本控制CVCS
- 分布式版本控制DVCS
1.2Git是什么


三种状态
- 已提交committed
- 已修改modified
- 已暂存staged

- 工作区—>暂存区—>git目录
- 已修改—>已暂存—>已提交
Chapter 2 Git基础
2.1获取Git仓库
- 将尚未进行版本控制的本地目录转换为Git仓库
- 从其它服务器克隆一个已存在的 Git 仓库(clone)
2.1记录每次更新到仓库
- 文件状态

- 查看文件状态: git status OR git status -s(简览)
- 跟踪新文件: git add filename
- 暂存已修改的文件: git add filename
- 忽略文件: .gitignore
查看修改
- git diff: 工作目录中当前文件和暂存区域快照之间的差异
- git diff --staged: 已暂存文件与最后一次提交的文件差异
提交更新
- git commit
- git commit -m “提交信息”
- git commit -a -m “提交信息”: 跳过暂存直接提交
移除文件
- rm filename: 本地删除
- git rm filename: 本地+暂存区删除
- git rm --cached filename : 暂存区删除
- 移动文件: git mv filename_from filename_to(重命名)
2.3 查看提交历史
- git log: 按时间先后顺序列出所有的提交,最近的更新排在最上面
- git log -p: 显示每次提交所引入的差异
- git log --stat: 查看每次提交的简略统计信息
- git log --pretty=oneline: 将每个提交放在一行显示
- git log --pretty=format:“%h %s” --graph: 按格式输出图
- git log —since=2.weeks: 两周内的提交历史
- 在log状态下: 按q退出
2.4 撤销操作
遗漏文件
- git commit -m “initial commit”
- git add forgotten_file
- git commit --amend
- 此时第二次提交将代替第一次提交的结果
取消暂存文件
- git reset HEAD filename: 取消暂存该文件
- git checkout -- filename: 用上一次提交的结果覆盖该文件
2.5 远程仓库的使用
- git remote: 列出服务器简写
- git remote -v: 列出服务器简写及URL
- git remote add shortname URL: 添加一个新的远程 Git 仓库,同时指定简写
- git remote rename shortname_from shortname_to: 远程仓库本地简写重命名
- git remote rm shortname: 移除远程仓库
- git clone -o xxx URL: 克隆远程仓库并把默认origin改为xxx
Chapter 2 Git基础
2.6 打标签
- 列出标签: git tag OR git tag -l “v1.8.5*”
- 查看标签: git show version_name
附注标签
- 存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。
- 创建命令: git tag -a version_name -m “TagInfo”
轻量标签:
- 轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。
- 创建命令: git tag version_name
- 追加标签: git tag -a version_name HASH(9fce802)
共享标签:
- 默认情况下,git push命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。
- 共享命令: git push origin version_name OR git push origin --tags
删除标签
- 本地删除: git tag -d version_name
- 远程同步删除: git push origin --delete version_name
2.7 别名
- git config --global alias.last 'log -1 HEAD’: git last可查看最后一次提交
Chapter 3 Git分支
3.1 分支简介
- 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
- Git提交保存对象(Commit Object): 指向暂存内容快照的指针、作者的姓名和邮箱、提交时输入的信息、指向它的父对象的指针(首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象)

结构
- blob 对象(保存着文件快照)
- 树对象(记录着目录结构和 blob 对象索引)
- 提交对象(包含着指向前述树对象的指针和所有提交信息)


分支创建
- git branch testing: 创建testing分支

- git log --online --decorate: 查看各个分支当前所指的对象
分支切换
- 切换命令: git checkout testing
- 在切换分支时,一定要注意你工作目录里的文件会被改变。 如果是切换到一个较旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。

项目分叉

- 查看分叉历史: git log --online --decorate --graph --all
3.2 分支的新建与合并
新建分支
- git checkout -b iss53: 新建并切换到iss53分支
- 上述命令等同于两条命令:git branch iss53(创建)+git checkout iss53(切换)
- 当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样
分支的合并


- 快进(fast-forward): 你想要合并的分支hotfix所指向的提交 C4是你所在的提交 C2的直接后继,这种情况下的合并操作没有需要解决的分歧


- master分支所在提交并不是 iss53分支所在提交的直接祖先,Git 会使用两个分支的末端所指的快照(C4和 C5)以及这两个分支的公共祖先(C2),做一个简单的三方合并
- Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它
遇到冲突时
- 如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净地合并它们
- 任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。 Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突
- 解决之后: git add filename
- 图形化工具解决冲突: git mergetool(默认为opendiff)
3.3 分支管理
- git branch: 得到当前所有分支的一个列表
- git branch -v: 查看每一个分支的最后一次提交
- git branch --merged --no-merged: 过滤这个列表中已经合并或尚未合并到当前分支的分支
3.4 分支开发工作流
- 长期分支
- 主题分支
3.5 远程分支
- 获得远程引用的完整列表: git ls-remote origin
远程跟踪分支
- 远程跟踪分支是远程分支状态的引用。它们是你无法移动的本地引用。一旦你进行了网络通信, Git 就会为你移动它们以精确反映远程仓库的状态。请将它们看做书签, 这样可以提醒你该分支在远程仓库中的位置,也就是你最后一次连接到它们的位置。
- 命名方式: origin/branchname

- 远程仓库同步: git fetch origin

推送
- 推送到远程仓库: git push origin branchname
- 要特别注意的一点是当抓取(fetch)到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。 换一句话说,这种情况下,不会有一个新的 serverfix分支——只有一个不可以修改的 origin/serverfix指针。可以运行 git merge origin/serverfix将这些工作合并到当前所在的分支
- 如果想要在自己的 serverfix分支上工作,可以将其建立在远程跟踪分支之上: git checkout -b serverfix origin/serverfix,这会给你一个用于工作的本地分支,并且起点位于 origin/serverfix
跟踪分支
- 从一个远程跟踪分支检出一个本地分支会自动创建所谓的“跟踪分支”(它跟踪的分支叫做“上游分支”)
- 当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master的 master分支
- 设置其他跟踪分支: git checkout -b serverfix origin/serverfix或者git checkout --track origin/serverfix或者git checkout -b sf origin/serverfix(本地名为sf)
- 设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支: git branch -u origin/serverfix
- 查看设置的所有跟踪分支: git branch -vv
- git fetch --all; git branch -vv(抓取最新提交再查看)
拉取
- 当 git fetch命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并
- git pull=git fetch+git merge
- 删除远程分支: git push origin --delete branchname
3.6 变基rebase
- 在 Git 中整合来自不同分支的修改主要有两种方法:merge以及 rebase



- 原理:是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用
实例




- 原则:只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作
Chapter 4 服务器上的 Git
4.1 协议
- Git 可以使用四种不同的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议
本地协议
- 本地协议其中的远程版本库就是同一主机上的另一个目录
HTTP协议
智能HTTP协议
- 运行在标准的 HTTP/S 端口上并且可以使用各种 HTTP 验证机制,支持像 git://协议一样设置匿名服务, 也可以像 SSH 协议一样提供传输时的授权和加密
哑(Dumb)HTTP协议
- web 服务器仅把裸版本库当作普通文件来对待,提供文件服务
SSH协议
- SSH 协议是一个验证授权的网络协议;并且,因为其普遍性,架设和使用都很容易
Git协议
- 这是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权
Chapter 5 分布式Git
5.1 分布式工作流程
集中式工作流

集成管理者工作流

主管与副主管工作流

5.2 向一个项目贡献
提交准则
- 提交不应该包含任何空白错误: git diff --check(检查空白错误)
- 尝试让每一个提交成为一个逻辑上的独立变更集
- 创建优质提交信息
私有小型团队

私有管理团队

派生的公开项目
通过邮件的派生项目
5.3 维护项目
- 作者:mini4ter
- 链接:www.mini4ter.top/article/gitnote
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。