Git笔记01(版本控制&Git简介 )

简介: 版本控制你可以把一个版本控制系统(缩写VCS)理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节。

版本控制

你可以把一个版本控制系统(缩写VCS)理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节。

img_53840201be490f2e50c3816852ee9897.png
图解VCS

版本控制工具功能

  1. 协同修改
  • 多人并行不冲突的修改服务器端的同一个文件
  1. 数据备份
  • 不仅保存目录和文档的当前状态,还能够保存每一个提交过的历史状态
  1. 版本管理
  • 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。这方面SVN采用的是增量式管理的方式,而Git采取了文件系统快照的方式。
  1. 权限控制
  • 对团队中参与开发的人员进行权限控制。
  • 对团队外开发者贡献的的代码进行审核——Git独有。
  1. 历史记录
  • 查看修改人、修改时间、修改内容、日志信息。
  • 将本地文件恢复到某一个历史状态。
  1. 分支管理
  • 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。。

本地库与远程库交互

1.团队内部协作

img_6e4d37f64c559737517268f1979f5154.png
团队内部协作

流程:

  1. User1新建了一个远程库,将本地库的文件目录推送(push)到远程库中。
  2. User2若想修改远程库中的文件,就需要克隆(clone)下来到自己的本地库中。
    克隆(clone)不光是下载远程库里的东西,还会把本地库初始化好。
  3. User2在本地库的基础上修改,改完之后推送(push)到远程库中。
    这里要注意,因为远程库是由User1创建的,User2不能直接往里面写东西,需要加入团队才有权限。
  4. User1从远程库中进行拉取(pull)到本地库中,获得远程库最新版本的文件。

2.跨团队合作

img_d7f988a71f763976309bb294d3112b2e.png
跨团队合作

User1和User2是一个团队的,User3是另外一个团队的。
流程:

  1. User3对User1所创建的远程库1做一个fork的操作,复制出一份新的属于User3的远程库2。
  2. User3克隆(clone)下到本地库进行修改,之后推送(push)到自己的远程库2中。
  3. User3发起一个拉取请求(pull request)
  4. User1进行审核
  5. 审核后没问题,就进行合并(merge)到远程库1中。
  6. User1,User2拉取(pull)到自己的本地库中。

Git简介

Git是一个版本控制工具,与Svn相似。他们两个主要区别在于,Git是分布式,Svn是集中式。话说回来Git跟Svn一样有自己的集中式版本库和Server端,但Git更倾向于分布式开发,因为每一个开发人员的电脑上都有一个Local Repository,所以即使没有网络也一样可以Commit,查看历史版本记录,创建项 目分支等操作,等网络再次连接上Push到Server端。

Git简史

有兴趣的可以看一看,或者跳过这一part直接看接下来的部分。


img_3056cbd707770773dad42e8301bc5f3d.png
Git简史

Git结构和概念介绍

你的本地仓库由 git 维护的三棵“树”组成。

  1. 工作目录(Working Directory),它持有实际文件。
  2. 暂存区(Stage/Index),它像个缓存区域,临时保存你的改动。
  3. HEAD,它指向你最后一次提交的结果。

概念介绍

1.工作区\工作目录(Working Directory)

img_517d41950a4ebec930fcacee963e58aa.png
Work Directory

在电脑上,所能看到的一个目录(不包括显示后的隐藏目录.git)就是一个工作区,比如我的git_exec。

2. 暂存区(Stage/Index)

Git和其他版本控制系统如SVN的一个不同之处还在于,它有暂存区。

img_1d1e8cf584b2536a3f5d2ce412da41f4.png
Screenshot from 2018-06-19 00-04-08.png

git add <filenames> 把当前工作目录中的文件放入暂存区域

这其实做了两件事:

  1. 将本地文件的时间戳、长度,当前文档对象的id等信息保存到一个树形目录中去(index,即平时说的暂存区)
  2. 将本地文件的内容做快照并保存到Git 的对象库(.git/objects) 。

综上两点来说,暂存区实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,而是保存在 Git 对象库中,文件索引建立了文件和对象库中对象实体之间的对应。

图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下:

  • 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID 被记录在暂存区的文件索引中
  • 当执行提交操作git commit时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树 。

3. 仓库/版本库(Repository)

可以理解为,一个记录所有文件或目录状态的地方,存储着内容修改的历史记录。Git能跟踪每个文件的修改、删除,以便将来某个时刻可以对文件进行还原

Git有两种仓库:

  • 远程仓库: 配有专用的服务器,为了多人共享而建立的数据库。(需联网)
  • 本地仓库: 为了方便用户个人使用,在自己的机器上配置的仓库。(无需联网)

创建本地仓库两种方法:

  • 创建全新的仓库
  • 复制远程数据库

4.快照(Snapshot)

使用过git的人应该都会发现在使用git管理自己的代码仓库时,随着代码更改次数的增加,代码仓库的实际大小并不会有太大变化,这的确是很神奇。而魔法师git所用的“道具”就是快照(snapshot),不过这一名词过于抽象,真的很让人费解!
我在网上看过很多人的解释,有些人虽然解释得很通俗,不过还是让人摸不着头脑:

想象一下,给一张桌子拍一张照片,纪录了桌子上所有物品的位置、状态,这样就可以称之为快照了。
我们不必存储所有的物品,只需存储这个照片就可以了,下一次想恢复以前的状态的时候,只需要翻出当时的那张照片,再把物品按照那张照片里的位置摆放一下就OK了。

当然,还有一些错误的认识。有不少人认为git存储的是每次文件相对于基本文件的差异,其实这是很多人的误区。的确有不少版本控制软件就是这样做的,如CVS、Subversion等等,但git不是,它记录的是快照。但重点是这快照究竟是什么呢?

在Progit的第一章中,对记录差异和记录快照进行了对比,下图是记录差异的原理图:


img_f54798e517fb7a2f3286e6059a73835a.png

这类版本控制软件记录的是一组基本文件和每个文件随时间逐步积累的差异,这个看起来非常好理解。但是git记录快照就稍微有点儿抽象了:


img_3eff0f6ae58e2402aab683cbd2f32005.png

在英文版中这样描述:

Every time you commit, or save the state of your project in Git, it basically takes a picture of what all your files look like at that moment and stores a reference to that snapshot.

通俗的翻译就是:每次你提交或者要在git中保存项目的状态时,git仅仅是制作快照(像拍照一样记录所有文件在那个时刻的样子),并保存指向这个快照的引用。之所以把英文引用过来,是想让大家注意一下里面的这个描述:

takes a picture of what all your files look like at that moment

这一句的意味在中文版Progit中是感受不出来的。
虽然上面的解释让我有了大致的理解,但是还是很有些似懂非懂,模棱两可。
另外,在书中的这样一句话好像点醒了我,虽然并没有直接解释快照(snapshot),但是为我指明了方向:

Git更像是把数据看作是对小型文件系统的一组快照

也许快照是文件系统中的概念或者技术,而git只是利用这一技术,所以Progit中才没有详细介绍这一技术,虽然其中频繁提到快照(snapshot)这个词。我在提问之前,我在维基百科上看过这一概念,但所能知道也就是:来自照相领域的概念,是指特定时间点的一个状态。


开始上路

1.安装Git

//Ubuntu安装Git
$ sudo apt-get install git-all

2.设置签名

  • 形式
    用户名:ckck
    Email地址:emailname@email.com
  • 作用:区分不同开发人员的身份
  • 辨析:这里设置的签名和登录远程库(代码托管中心)的账号,密码没人任何关系。
  • 命令:
    • 项目级别/仓库级别:git config仅在当前本地库范围内有效
    • 系统用户级别:git config --global登录当前操作系统的用户范围
    • 就近原则: 项目级别优先于用户级别,二者都有时Git将采用项目级别的签名。

设置项目级别

$ git config user.name tom_pro
$ git config user.email gitgit@suibian.com

查看签名

$ cat .git/config

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[user]
    name = tom_pro
    email = gitgit@suibian.com

设置系统级别

$ git config --global user.name tom_sys
$ git config --global user.email gitgitsys@suibian.com

查看签名

$ cd ~
$ cat .gitconfig

[user]
    name = tom_sys
    email = gitgitsys@suibian.com

实际开发为了省事,一般都设置系统级别的签名。

3.初始化仓库

//新建Repository
cd Desktop/learngit
git init

如果在当前目录下看到.git的话,可以用ls -ah命令或者快捷键ctrl+h查看隐藏文件。

4.添加与提交

//添加到暂存区
git add readme.txt

//改动提交到了HEAD
git commit -m "wrote a readme file"

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

参考链接:
什么是版本控制?
廖雪峰Git教程
猴子都能懂的Git入门
图解Git

目录
相关文章
|
1月前
|
Linux 开发工具 git
掌握 Git:版本控制的艺术
Git 是由 Linus Torvalds 开发的分布式版本控制系统,广泛用于代码管理和团队协作。其核心价值在于分布式特性、数据完整性和支持非线性开发。本文介绍 Git 的安装、仓库初始化、文件管理、分支管理、远程仓库操作及撤销操作等基础与高级技巧,助你掌握版本控制的艺术。通过实践,你将能更高效地利用 Git 进行代码管理和团队协作。
|
1天前
|
Ubuntu 开发工具 git
Git高手必备:掌握这些版本控制最佳实践,让你的代码管理效率翻倍!
【10月更文挑战第25天】使用 Git 进行版本控制是现代软件开发的重要部分。本文详细介绍了 Git 的安装、配置、基本操作、分支管理、冲突解决及常用命令,帮助开发者提高工作效率,确保代码质量和团队协作的顺利进行。通过合理使用 Git,可以有效管理代码变更,支持多人协作,并追踪历史记录。
13 4
|
1天前
|
开发工具 C# git
C#一分钟浅谈:Git 版本控制与 GitFlow 工作流
【10月更文挑战第22天】本文介绍了 Git 和 GitFlow 的结合使用,从基础概念到具体操作,涵盖了安装配置、基本命令、GitFlow 工作流的核心分支和流程示例。同时,文章还讨论了常见的问题和易错点,如忽略文件、冲突解决、回退提交和分支命名规范,并提供了代码案例。通过学习本文,读者可以更好地理解和应用 Git 及 GitFlow,提高团队协作效率。
8 1
|
23小时前
|
开发工具 git 开发者
|
27天前
|
编译器 开发工具 数据安全/隐私保护
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
本文提供了一个关于如何在Gitee上进行多人协作和版本控制的详细教程,包括新建和初始化仓库、克隆仓库、邀请好友共同管理仓库以及注意事项,旨在帮助用户顺利进行代码协作开发。
82 0
Git——多人协作/版本控制,在一个gitee仓库下开发(Gitee版教程)手把手教学,包好用的!
|
2月前
|
安全 开发工具 git
git合并错了,我想回退到之前的版本
git合并错了,我想回退到之前的版本
|
2月前
|
存储 Linux 开发工具
掌握 Git:版本控制的瑞士军刀
在软件开发中,版本控制对于代码管理和团队协作至关重要。Git 是一款由 Linus Torvalds 开发的分布式版本控制系统,广泛应用于各类项目。本文介绍了 Git 的基本原理、核心概念及常用命令,如初始化仓库 (`git init`)、克隆 (`git clone`)、提交 (`git commit`) 和合并 (`git merge`) 等。此外,还分享了编写清晰提交信息、使用分支开发和定期合并等最佳实践,帮助开发者更高效地使用 Git。
|
2月前
|
测试技术 开发工具 git
掌握 Git 分支策略:提升你的版本控制技能
在现代软件开发中,版本控制至关重要,Git 作为最流行的分布式版本控制系统,其分支管理策略对于高效协作和代码维护尤为重要。本文介绍了几种常用的 Git 分支策略,包括主线开发模型、功能分支模型、Gitflow 工作流和 Forking 工作流,并探讨了如何根据项目需求选择合适的分支模型。通过保持 `master` 分支稳定、及时合并清理分支、使用命名规范、利用 Pull Request 进行代码审查及自动化测试等最佳实践,可以显著提升团队协作效率和软件质量。掌握这些策略将帮助开发者更好地管理代码库,加快开发流程。
|
22天前
|
数据可视化 项目管理 开发工具
Git 可视化的实现:提升版本控制体验的利器
Git是最流行的分布式版本控制系统,广泛用于软件开发和项目管理。但其命令行操作复杂,难以直观理解,尤其是涉及分支和合并时。为此,Git可视化工具应运而生,通过图形界面帮助开发者更清晰地理解项目历史、分支结构及变更情况。本文将探讨Git可视化的概念背景、技术方法及相关工具,包括GitKraken、Sourcetree、Gitg、Git Extensions和Tig等,帮助读者掌握其在日常工作中的应用,提升版本管理效率。此外,还将介绍如何结合可视化项目管理工具,如板栗看板,实现更高效的团队协作和任务管理。
26 0
|
24天前
|
Shell 网络安全 开发工具
使用Git进行版本控制
使用Git进行版本控制
29 0