Git入门

1. 版本控制

    版本控制是一套系统,该系统按时间顺序记录某一个或一系列文件的变更,可以通过该系统查看以前特定的版本,可以将文件或整个项目恢复到过去的状态,可以对比文件随时间的变更,查看那些人做了哪些修改。

1.1 本地版本控制系统

    最原始的方法是将文件复制到另一个文件目录下,然后给目录加上时间戳;RCS是一个常用的VCS工具,会在磁盘上保存补丁(文件之间的差异),通过叠加补丁来将文件恢复到某个历史状态:
在这里插入图片描述

1.2 集中式版本控制系统

    CVCS(Centralized Version Control System)集中式版本控制系统,将文件所有修订版本放到单一的服务器,多个客户端可以从这个单一服务器检出文件。相比本地版本系统,所有人都可以通过服务器的版本系统清楚项目中所有人做的修改进行协作,只需要维护服务器的版本数据库。但是缺点是本地没有版本库的修改记录,也就是说必须联网才能协同工作,两个计算机之间文件是无法比较出差异,并且如果服务器宕机,那么任何人都无法进行协作或提交修改,甚至服务器的数据库所在的硬盘受损,那么整个项目的历史提交都将消失,只留下各自本地的修改:
在这里插入图片描述

1.3 分布式版本控制系统

    DVCS(Distributed Version Control System)分布式版本控制系统,客户端并非只是检出文件的快照,而是对代码仓库进行完整的镜像,不需要联网就能本地工作,本地存在版本库的修改记录就意味着每台电脑都相当于一个仓库,可以进行版本比较,进行两个计算机之间的文件比较,修改差异,再提交到服务器上:
在这里插入图片描述

2. Git概念

2.1 快照,而非差异

    Git与很多版本控制系统的差别就是处理数据的方式,多数版本控制系统以文件变化列表的形式存储信息,把信息视为一组文件以及对这些文件随时间做出的变更;但是git将数据视为一组快照,在每次提交时,git会抓取所有文件当前状态的快照,然后存储一个指向该快照的引用,如果文件没有发生变动,不会重新保存文件,而是留下一个指向之前的链接

2.2 几乎所有操作都在本地执行

    因为git是分布式版本控制系统,从服务器中拉下一整个版本数据库以及所有版本修订记录,所以基本可以脱网直接在本地进行修改操作,然后联网提交到服务器,如果出现冲突,只需要从服务器更新相应文件,解决和自己的修改造成的冲突即可

2.3 Git的完整性

    git下的所有数据在进行操作前都会进行校验和计算,所以即使没有通过git命令不知情的情况下修改文件或目录内容,git操作时也会发现。

2.4 三种状态

    在Git中,文件处于三种状态:已提交(committed),已修改(modified),已暂存(staged)。已提交表示数据存入本地数据库,已修改表示改动了文件但是未提交到数据库,已暂存表示对已修改文件的当前版本做出标识并加入下一次要提交的快照中。
    Git的三个区域:Git目录,工作目录以及暂存区。Git目录是Git保存项目元数据和对象数据库的地方,是要克隆仓库的地方;工作目录是项目某个版本从Git目录的版本数据库中检出放到磁盘上的;暂存区是一个文件,一般位于git目录中,保存了下次要提交的信息。
    Git的基本工作流:从Git目录检出版本数据库;修改工作目录的文件;暂存文件,将修改文件的快照加入暂存区;提交暂存区的文件,将快照永久保存到Git目录中
在这里插入图片描述

3. Git基础

3.1 初始化git仓库

通常有两种获取 Git 项目仓库的方式:

  1. 将尚未进行版本控制的本地目录转换为 Git 仓库:
    (1)进入要初始化的工作目录
    (2)执行git init会创建一个名为.git的子目录,此时只是将该目录初始化为git仓库,但是目录文件还没有被跟踪(没有记录到git仓库中)
  2. 从其它服务器克隆一个已存在的 Git 仓库:
    (1)进入要初始化的工作目录
    (2)执行git clone url(url可以是http协议,ssh协议或git协议)

3.2 文件状态

  1. 工作目录下的文件的两种状态:
    (1)已跟踪: 表示Git仓库已经知道的文件, 即纳入了版本控制系统的文件, 之前提到的文件的三种状态(已修改,已暂存,已提交)都属于跟踪状态, 文件也可能处于未修改状态(刚克隆的git库中的文件), 如图右侧四种状态
    (2)未跟踪: 表示Git库不知道的文件, 比如在工作目录中新创建的文件或从仓库中删除某个文件但是保留该文件工作目录本地时, 如图最左侧状态
    文件状态流转图
  2. 检查当前文件状态
    git status命令可以查看当前文件的跟踪状态, 具体的状态信息以及当前所在分支
    (1)未跟踪状态:
    在这里插入图片描述
    (2)已跟踪状态(已修改):
    在这里插入图片描述
    (3)已跟踪状态(已暂存):
    在这里插入图片描述
    (4)已跟踪状态(已提交):
    在这里插入图片描述

3.3 把工作目录的文件更新记录到Git仓库

  1. 跟踪Untracked的文件或暂存已修改的文件
    git add 文件名 : 将文件从工作目录加入到暂存区
  2. 提交更新到Git仓库
    (1)git commit : 将文件从暂存区加入到Git仓库, 输入后会进入编辑器书写commit message信息
    (2)git commit -a : 直接跳过git add到暂存区的过程, 将已跟踪文件直接加入到Git仓库

3.4 Git基本使用

  1. 查看已暂存和未暂存的修改
    (1)git diff: 查看尚未暂存但是已跟踪的文件的更新变化内容, 比较的是工作目录中当前文件和暂存区域快照之间的差异.
    (2)git diff --staged/cached: 查看已暂存的文件的更新变化内容, 比较的是暂存区和最后一次提交到Git仓库的文件的区别
  2. 移除文件
    从Git中删除文件, 必须从已跟踪文件清单中删除, 然后提交, 不能只从工作目录删除
    (1)rm -rf 文件名: 只能删除工作目录的文件, 不能从Git中彻底删除已经被跟踪的文件, 等价于手动删除
    (2)git rm 文件名: 记录某文件的删除快照到暂存区并删除工作目录中的文件
    ①要想移除一个既存在于工作目录又存在于Git库的文件:
    先手动删除: git status会看到如下图, 然后执行git rm/add记录此次删除到暂存区, 最终git commit记录到Git仓库即可
    在这里插入图片描述
    ②要想移除一个只存在于工作目录和暂存区的文件(已被跟踪的文件, 但是不在Git库):
    先手动删除: git status会看到如下图, 然后执行git rm/add记录此次删除到暂存区即可
    在这里插入图片描述
    (3)git rm --cached 文件名: 保留工作目录中的文件并变为未跟踪状态, 只是记录文件删除状态到暂存区
    ①只存在于工作目录和暂存区的文件: 文件直接回到未跟踪状态
    在这里插入图片描述
    ②存在于工作目录又存在于Git库的文件: 文件回到未跟踪状态, 并且删除操作记录到暂存区, 如下图, 需要通过git commit记录到Git仓库
    在这里插入图片描述
    (4)git rm -f 文件名: 删除工作目录中的文件, 也只是记录文件删除状态到暂存区
    ①只存在于工作目录和暂存区的文件: 暂存区的记录抵消删除, 工作目录的文件删除
    ②存在于工作目录又存在于Git库的文件: 工作目录的文件删除, 删除记录到暂存区
    在这里插入图片描述
    ③与git rm --cached的异同点: 后者不删除工作目录文件只是将其标记为未跟踪状态, 前者是直接删除工作目录的文件; 相同点是都会记录删除状态到暂存区.
    ④与git rm的异同点: 都是删除工作目录和暂存区的文件, 但是当暂存区存留文件的修改时, 必须加-f才能删除文件
  3. 移动文件
    git mv 文件地址/文件名 文件地址或文件名1: 将文件移动到指定地址, 或者改名字
  4. 查看提交历史
    把服务器代码克隆到本地仓库后, git log可以查看所有版本的提交历史(每个提交的SHA-1, 作者的名字和电子邮件地址, 提交时间以及提交信息, git log -p可以查看细节改动内容, git log --stat可以查看提交的简略信息, git log -数字可以查看最近几条的日志信息, git show可以查看最近的一次提交的详细内容
  5. 撤销修改
    (1)修改已经提交但是遗漏一些内容:
       继续修改遗漏的内容, 然后git add加入到暂存区, 最后通过git commit --amend将遗漏内容加入到最新的一次提交, 快照不变, 只是改变修改信息
    (2)取消暂存区的文件的修改:
       git reset HEAD 文件名: 将修改从暂存区转移到工作目录(变为已修改状态)
    (3)取消工作目录的已跟踪文件的修改:
       git checkout – 文件吗: 将已跟踪的文件修改撤销, 变为未修改状态

4. Git分支

    Git创建新分支这一操作几乎能在瞬间完成, 并且在不同分支之间的切换操作也是一样便捷. 与许多其它版本控制系统不同, Git 鼓励在工作流程中频繁地使用分支与合并.

4.1 分支介绍

    Git每次的提交对象会包含一个指向上次提交对象(父对象)的指针, Git分支本质上仅仅是指向当前提交对象的可变指针, Git 的默认分支名字是 master, 在多次提交操作之后, 其实已经有一个指向最后那个提交对象的master 分支, 它会在每次的提交操作中自动向前(图中右侧)移动, 注意: 在创建分支前git branch判断一下当前是否有分支显示, 如果没有要指定一下否则创建一个新的分支后想切换到master此时是不存在的,会出现“error: pathspec ‘master’ did not match any file(s) known to git.”的错误
在这里插入图片描述

4.2 创建分支

  1. 本质: 其实就是创建一个从某个位置开始可以向前移动的新的指针;
  2. 创建: 选择某个提交对象所在位置后, 使用“git branch 分支名”的命令即可创建一个指向当前对象的分支指针
    在这里插入图片描述

4.3 HEAD指针

    Git中有一个叫HEAD的指针, 指向当前所在的本地分支, 比如指向master, 可以通过git log (–oneline)查看HEAD指针的位置以及各个分支的位置
在这里插入图片描述

4.4 切换分支

    将HEAD指针指向要切换的分支, 使用“git checkout 分支名”的命令来切换

4.5 合并分支

    比如想要将分支hotfix合并到master上, 先git checkout master切换到master分支, 然后git merge hotfix即可将hotfix分支的改动合入到master, 但是有几种情况:

  1. 如果两个分支在一条线上, 没有发生分叉, 那么结果就是master的指针直接移动到指向hotfix的位置在这里插入图片描述
  2. 如果两个分支出现分叉的情况, 不工作在一条线上时, master 分支所在提交并不是iss53分支所在提交的直接祖先, 此时Gi 会使用两个分支的末端所指的快照以及这两个分支的共同祖先, 做一个简单的三方合并, 即创建一个新的提交, 快照指向两个父提交.在这里插入图片描述
  3. 如果合并分支时发生冲突:
        先解决冲突, HEAD 所指示的版本(也就是你的master分支所在的位置, 因为你在运行 merge 命令的时候已经切换到了这个分支)在这个区段的上半部分(======= 的上半部分), 而 iss53 分支所指示的版本在 ======= 的下半部分, 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个, 或者你也可以自行合并这些内容, 然后再提交

4.6 分支管理

  1. 查看分支:
    (1)git branch: 显示当前分支的列表, 分支前出现的*表示HEAD指针指向的分支, 即代表当前分支
    (2)git branch -v: 显示当前分支的列表以及每个分支最后一笔提交
    (3)git branch --merged/–no-merged: 过滤这个分支列表中已经合并或尚未合并到当前分支的分支
  2. 删除分支
    git branch -d 分支名: 删除已经合并过的无用的分支, 可以通过git branch --merged查看

4.7 远程分支

    远程仓库名字 “origin” 与分支名字 “master” 一样,在Git中并没有任何特别的含义一样, master是当你运行 git init 时默认的起始分支名字, origin是当你运行git clone时默认的远程仓库名字, git remote可以查看远程仓库名字, 远程跟踪分支以(remote)/(branch)形式命名, 比如origin/master等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值