Git:版本控制 / Github / repository / change / commit / history

更多
2019年02月19日 08点33分 作者:叶飞 修改

版本控制工具

最基本的功能就是:记录代码的每一次改动,或者说,保存代码的改动历史。

@想一想@:这有什么用呢?

  • 有案可查:是谁、在什么时候、干了些啥事?一目了然。(飞哥的黑历史 / 同学们的作业检查)
  • 备份恢复:既然记录了所有改动,当然就应该可以根据改动进行恢复,是不是?所以,git相当于一个升级版的ctrl+z!永久有效且可以回退到任意一个(提交记录的)时间点。

git就是一个目前非常流行的、开源的、分布式的版本控制工具

PS:git最早用于Linux的开发,本身是命令行操作的,但微软将其嵌入到VS之中,大部分功能都可以由图形界面方便的完成(一些高级功能还是需要命令行)。

除git以外,还有SVN、TFS等源代码版本控制工具。


先讲原理

关键点:

  • 提交commit的是改动change
  • 仓库repository里记录所有改动:哪怕是删除,也会记录删除了那些内容,是增加而不是减少改动记录history
  • 首先是提交到本地local仓库
  • 需要的话,才在本地仓库(不是工作区)和远程remote仓库之间进行推送push和拉取pull

区别svn

svn的仓库没有:本地 vs 远程之分,工作区内容直接提交到(远程)仓库。所以:

  • svn一般要联网才能提交;git不用
  • svn只有一个中央仓库,一旦中央仓库损坏,凉凉;git可以将任意一个本地仓库再指定为中央仓库


Github

全球最大同性交友网站欢迎你!

PS:作为最大的开源社区已经被微软收购。微软说:这是他们拥抱开源的重要一步,^_^!开源世界说:我们的基地被攻陷了……o(╥﹏╥)o

区分 github 和 git :

  • github,是一个网站
  • git,是一个工具

但github这个网站的核心功能就是:提供一个公共的、易用的git repository服务器。

使用github,同学们需要(演示:略)

  1. 在github上注册一个账号
  2. 在github上新建一个裸(bare)仓库代码:一点内容没有,全新的仓库,得到一个仓库地址
  3. 利用该仓库地址,将本地仓库中的内容推送到github

改动change

一旦建立本地仓库,git默认就会追踪(track)仓库所在文件夹下所有文件的改动(change)。

改动又细分成三种:

  • add:新添加一个文件
  • edit:在现有文件上编辑
  • deleted:文件被删除

我们可以通过对比(compare)查看这些改动内容。

staged

git在commit前,还设置了一个步骤:staged。

理论上,change最开始是unstaged,所以首先要被staged又被称之为加入index,可以理解为放置在“缓存区”,最后才能commit。

stage可以将改动“部分/分批次”提交。但是,这样操作首先有风险,然后又没什么用的:建议同学们总是把所有改动一次性staged and commit。

撤销

change在commit之前还可以撤销(undo或discard)

.gitignore

有些文件(比如bin文件夹下),我们不想将其加入repository,就可以在repository文件夹下面,添加一个.gitignore文件,里面记录被需要被ignore的文件/文件夹

.gitignore可以由IDE自动生成,也可以从第三方获得,开发人员还可以手动更改。

但是,.gitignore能把已经track并存放在repository中的文件移出,需要我们手动的将其删除后再commit。

commit

必须在填写commit message之后,才能将改动提交到本地repository。

注意

  • message是这一次提交内容的描述,一定要认真填写养成习惯
  • 如果你不能很清晰的写出message,多半是因为你没有很好的组织每一次提交。
  • 每一次提交的内容越少,越容易描述。

此外,飞哥再三强调

  • 在commit之前,查看change内容,养成习惯

一旦提交,就会被记录到历史(History)中。

@想一想@:文件被删除,然后被提交,repository如何处理?


历史History

记录了每一次提交的

  • Id:只显示前8位
  • 提交人:是由自己设置的
  • 提交时间:
  • Message:非常重要

HEAD

在所有的历史记录中,git用一个HEAD指针,指向当前版本。

所以撤销(discard)未提交更改,实际上就是:Replace with HEAD Revision(用HEAD版本替换工作区内容)

HEAD非常有用,通过调整HEAD的指向位置(配合其他组件/机制),git可以完成令人耳晕目眩的各种花式操作。

Reset

历史记录不仅可以被查看,还可以被“回退”。

Reset:首先移动HEAD指针到指定版本,然后,根据相应区域(work/index/repository)是否变动,分为:

  • soft:只回退HEAD(PS:Visual Studio暂未支持),不做其他任何操作
  • mixed:在soft的基础上,还回退index中的记录,但保留工作区内容
    以上两种模式都会形成change,但soft是staged的,mixed是unstaged。
  • hard:在mixed的基础上,还回退工作区更改。这种操作要慎重
@想一想@:为什么要搞这么多模式呢?只要hard不香么?

RefLog

为了以防万一,git还“偷偷的”把所有(只要HEAD发生变化, 就会被记录)的本地更改都放在RefLog里面。

所以即使被hard reset的记录在reflog里也可以查找到。

PS:Visual Studio暂未支持

Revert

这是一种非常安全的方式。它实际上是新建的一次提交:参照你想回退到的那个版本(历史记录),对当前内容进行更改,然后提交。

如果你对git的操作不太熟练,我建议你总是使用这种方式进行回退。


作业

使用VS自带的Git,把第一个项目源代码存放到Github(或者内网的码云)上:用Github记录你的学习

  • 注册一个github账号
  • 新建一个本地Repoistory
  • 能在本地Repository上commit和revert
  • 将本地内容push到github
  • 将自己的github仓库地址发布到QQ群:729600626,同时clone一个其他同学的github仓库


在cmd窗口中,使用DOS和git命令,完成以下任务:

  • 在global范围内,将自己的name加上前缀:yz-
  • 创建一个空文件夹,在里面新建一个git repository
  • 再新建三个文件,修改其内容的同时用git命令让其保持状态为:
    1. article:untracked
    2. problem:change to be committed 和 not staged
    3. task:committed
  • 显示problem上未添加到staged和已添加到staged上的变更
  • 显示task的提交记录
  • 再次提交task的修改,并用新的提交覆盖之前的提交
  • 将problem中已经staged的修改撤销,使得工作区找不到之前的变更
  • 打一个标签v1.0;再提交若干次,然后再打一个标签v1.1;再选择之前的一次提交,打一个标签v1.0.1
  • 将problem重命名为help,确保help上仍然保留着problem之前的提交记录
  • 在文件夹x和y下分别clone上述repository,然后:
    1. x上修改提交推送
    2. y上修改提交提送

源栈 源栈培训 Git 源代码 版本控制
赞: 0 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

编程基础


项目管理相关

需求发布、开发规划、部署、测试,源代码版本管理(git)等……

逸闻史话

认识计算机

编程语言

数据结构和算法

Web开发基础

全部
关键字



帮助

反馈