Git基本使用

Git数据模型

1. 什么是快照 (snapshot) 呢

首先我们来学两个 Git 中的术语

  • blob,就是单个的文件;

  • tree,就是一个文件夹;

快照则是被追踪的最顶层的树。

比如我的“公众号”文件夹的这么一个结构

那么一个快照就是追踪的“公众号”这颗树。

2. 本地库的数据模型

Git 记录了每个快照的 parent,也就是当前这个文件夹的上一个版本。

那么快照的迭代更新的过程就可以表示为一个有向无环图

每个快照其实都对应了一次 commit,我们用代码来表示一下:

class commit {
  array<commit> parents
  String author
  String message
  Tree snapshot
}

这就是 Git 的数据模型。

Git常用命令

本章分三大部分介绍日常常用命令:

  • 本地操作

  • 与远程库交互

  • 团队协作 - 分支

本地操作

在学习常用命令之前,你首先需要知道的 Git 的「三个分区」和对应的文件的「三种状态」:

  • 工作区:就是你本地实际写代码的地方,无论你是用 vim 直接改也好,还是在 IDE 里写,都无所谓。

  对应的文件状态是:modified,已修改,但还没保存到数据库中。

  • 暂存区:就是临时存放的地方。

  对应的文件状态是:staged,Git 已经对该文件做了标记,下次提交知道要包含它。

  • 本地库:存放本地历史版本信息。

  对应的文件状态是:committed,文件已经安全的保存在本地数据库中。

1. $ git add

工作区改完了代码,就用 git add 提交到暂存区。

这里如果文件改动的比较多,但又不是每个都需要提交,我们可以在idea中设置git ignore file,就表示这些文件不要提交,比如在 build project 的时候会自动生成的那些文件等等。

2. $ git commit -m "comment"

从暂存区提交到本地库,就需要用 commit。

一般后面都会跟个 -m 加句 comment,简单说下改动的内容或者原因

3. $ git log

git log 可以查看到提交过的信息,从近到远显示每次 commit 的 comment 还有作者、日期等信息,比如大概长这个样子:

commit 5abcd17dggs9s0a7a91nfsagd8ay76875afs7d6
Author: Xiaoqi<xiaoqi@163.com>
Date: xxx xxx xxx
改了 Test 文件

commit 后面的这个编号,是每次历史记录的一个索引。比如如果需要对版本进行前进或者后退的时候,就需要用到它。

这样打印的 log 太多,更简洁的打印方式是:

$ git log --oneline

就一行打印出来了。

或者:$git reflog
更常用些

4. $ git reset

那我们刚刚说过,如果需要前进或退回到某个版本,就用

$ git reset --hard <编号>

这样就直接跳到了这个编号对应的那个版本。

那么这个 hard 是什么意思呢?

这里有 3 个参数:hard, soft,mixed我们一一来说一下。

回到我们最重要的这张图上来:

我们刚刚说的前进或后退到某一版本,是对本地库进行的操作

那有个问题:本地库的代码跳到那个版本之后,工作区和暂存区的代码就和本地库的不同步了呀

那这些参数就是用来控制这些是否同步的。

$ git reset --hard xxx 三个区都同步,都跳到这个 xxx 的版本上。

$ git reset --soft xxx 前面两个区不同步,就只有本地库跳到这个版本。

$ git reset --mixed xxx 暂存区同步,工作区不动。

远程交互

和远程库的交互主要是,也就是写入和读取

5. $ git push

小齐写完了代码,要提交到公司的代码库里,这个过程要用 git push.

当然了,这么用会被打的。。毕竟还要 cr 呢。

6. $ git clone

新来的实习生首先要 clone 整个项目到本地来,然后才能增删改查。

当然了实际工作中也没人这么用。。因为每家公司都会有自己包装的工具。不过如果是做 Github 上的开源项目,就用得上了。

7. $ git pull

小齐提交了新的代码之后,领导要审查呀,所以用 git pull 把最新的代码拉取下来瞅瞅。

实际上呢,

git pull = git fetch + git merge

8. $ git fetch

git fetch 这个操作是将远程库的数据下载到本地库,但是工作区中的文件没有更新。

而要谈get merge,我们还需要先讲下分支。

mergegit pull默认的选项,合并其实还有另外一种方法:rebase中文意思叫作“变基”

9. $ git rebase

rebase 的作用更多的是来整合分叉的历史,可以将某个分支上的所有修改都移到另一分支上,就像是变了基底。

分支与合并

首先我们来看几个关于分支的基本操作:

10. $ git branch

类似于ls,能够列出当前所有分支。

$ git branch -v 能够显示更多信息。

11. 创建分支

$ git branch <branchname>

12. 切换分支

$ git checkout <branchname>

13. 合并分支

$ git merge <branchName>

这里再附上一些git命令供参考:

而合并时就可能会有冲突,什么时候会有冲突呢?

在同一个文件的同一个位置修改时

因为 Git 会努力的把你们改动不同的地方合并在一起,但如果实在是在同一个地方改的,那它也没办法了,只能留给程序员去手动处理了

Git练习平台

一个叫作learn git branch 的项目 它是一个开源项目
Github 项目地址:

https://github.com/pcottle/learnGitBranching

教程网站地址

https://learngitbranching.js.org/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值