Git必知必会

Git诞生于一个大举创新的年代。Linus在1991年创建了开源的Linux,这个项目在世界各地有着大量的参与者,然而在2002年以前,Linux项目参与者的代码都是通过文件diff的方式发给Linus手动合并。到了2002年,代码库之大已经很难继续通过手工方式管理了。这个时候,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。然而,2005年开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git。

1. Git基础

  • 分布式
  • 存储方式
  • 完整性
  • 三种状态

分布式与集中式

这块比较好理解。SVN这种集中式的版本控制系统,代码集中存放中央服务器,代码提交合并必须基于中央服务器,缺点就是不能本地操作,存在丢失风险。Git不太一样,他没有中央服务器的概念,每个人电脑上都是一个完整的版本库,可以本地提交合并。

存储方式

Git 和其它版本控制系统的主要差别在于 Git 对待数据的方式。
CVS、Subversion这类系统将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
存储每个文件与初始文件的差异
Git 更像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
快照流存储

完整性

Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。如果在传送过程中丢失信息或损坏文件,Git 很容易就能发现。
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

三种状态

  • 已修改(modified)。修改了文件,但还没保存到数据库中。
  • 已暂存(staged)。对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  • 已提交(committed)。数据已经安全地保存在本地数据库中。
    对应到Git项目,我们有三个阶段
  • 工作区
  • 暂存区
  • Git仓库
    三个工作状态

2. Git命令

本章介绍的命令将尽量涵盖日常开发所需。介绍时也尽量按照开发的流程来。

  • 初始化项目
  • 本地修改提交以及撤销
  • 远程合并提交撤销
  • 分支操作
  • Git别名骚操作

初始化项目

初始化项目有两种方式,一种是本地关联远程,一种是直接克隆远程

本地仓库关联远程

首先初始化本地仓库

  • git init
// cd到empty01
echo "# empty01" >> README.md
git init
git add README.md
git commit -m "first commit"

本地初始化好之后,就可以关联远程仓库了

  • git remote add <name> <remote-url>
    这个name相当于远程地址的一个别名,一般是用origin。
git remote add origin git@github.com:miguoer/empty01.git

添加完成后,可以通过下面命令查看当前本地仓库关联的远程仓库

  • git remote -v
➜  empty01 git:(master) git remote -v
origin	[email protected]:miguoer/empty01.git (fetch)
origin	[email protected]:miguoer/empty01.git (push)

关联好之后,如果是全新的仓库,就可以直接push到远程了

➜  empty01 git:(master) git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 235 bytes | 235.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:miguoer/empty01.git
 * [new branch]      master -> master

如果我们想删除关联的远程仓库

  • git remote remove
➜  empty01 git:(main) git remote remove origin
➜  empty01 git:(main) git remote -v
直接从远程克隆
  • git clone
    克隆协议有两种,一种是HTTP协议,一种是SSH协议
    Http协议每次传输都需要输入代码仓库平台用户名密码
    SSH协议配置公钥到服务器后就可以免密传输
git clone [email protected]:miguoer/empty01.git
git https://github.com/miguoer/empty01.git

本地修改提交以及撤销

在每次提交代码前,要先查看当前git的状态

  • git status
    这个命令会告诉我们,当前git仓库的一个状态,包括处于哪个分支,工作区的文件状态,暂存区有哪些文件
➜  empty01 git:(master)git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   README.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	test.txt

对于修改和新提交的文件,我们需要逐个检查具体的修改,确保提交的代码没有问题。

  • git diff
    此命令比较的是工作目录中当前文件和暂存区域快照之间的差异
git diff README.md

diff --git a/README.md b/README.md
index 6ee342b..9a8792a 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1 @@
-# empty01
-# empty03
+# empty02
(END)

当然git diff 还可以比较其它的场景,常用的有:

git diff <id1><id2> # 比较两次提交之间的差异

git diff 
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值