Git学习——使用Git进行版本控制

概述

本文原载于我的博客,地址:https://blog.guoziyang.top/archives/14/

什么是Git?

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. ——Git

The stupid content tracker. ——Linus Torvalds

Git是一个免费的开源分布式版本控制系统,可以高效快速地解决任何项目的版本管理问题。

Git是Linux内核的发明人——Linus Torvalds大佬为了帮助管理Linux内核开发而开发的一套系统。为了开发一个神器而开发的另一个神器。

当你需要和他人协作开发某个大工程时,当你需要清晰明确地管理自己乱七八糟的代码时,当你修改错了什么东西想要恢复时……你都会需要Git的。

总而言之,好处很多,学就完事了。

本篇教程主要来源于Learn Git Branching这个游戏,地址https://learngitbranching.js.org/ 。想图文并茂地学习可以去网站上玩游戏。本篇主要进行翻译记录(理直气壮)和盗图(小声)。

Git Commits——提交

Git仓库中的**提交(commit)**记录了你的仓库目录下所有文件的一个快照,它就像你的目录的一个完全复制,但是不仅仅只是复制。

Git希望保持提交尽可能小,所以每当你提交时,它不是盲目地复制整个目录。如果可能的话,Git会将一次提交压缩成从仓库的一个版本到下一个版本的一组修改,或者称为“Delta”。

Git同时记录着提交的时间,这就是为什么大多数提交都有祖先提交(ancestor commits),我们在图片中用肩头来表示这种关系。记录仓库的历史对于每个维护项目的人来说都有好处。

这只是一种简化的说法,需要理解的东西还有很多,但现在你可以仅仅将提交看作是项目的快照。提交是一个轻量级的操作,两个提交之间的切换很迅速。

让我们看看这在实际操作中是什么样的。下面是一个小型的Git仓库的可视化图像。现在有两个提交——初始化提交c0,以及之后的一个提交c1,c1可能在c0的基础上做了什么改动。

commit1

现在我们做一些修改后输入git commit,就可以将修改提交。我们刚刚做出的提交c2有一个父提交c1,父提交这个概念表明该次提交是在哪次提交的基础上做出的。

commit2

Git Branches——分支

Git中的**分支(branch)**同样轻量级,它仅仅是一个指向某次提交的指针——没了。这就是为什么Git有句名言:

branch early, and branch often.

因为创建很多分支没有多余的存储开销,所以逻辑上用分支划分工作比创建大型的分支要容易得多。

当我们开始混合提交与分支时,我们就能看出这两个特性是如何结合在一起的了。但是现在,仅仅记住,一个分支实际上是指“我想包含该次提交及其父提交的所有工作”。

同样还是这个仓库:

commit1

我们使用Git branch newImage创建一个叫newImage的分支:

branch1

就这样,我们创建了一个新的分支!现在newImage分支指向c1提交。然而当我们对分支做出一些修改,想要提交时,使用Git commit会发生下面的情况:

branch2

啊哦!master分支移动到了下一个提交但是newImage没有!因为我们没有“处于”这个分支上,这就是为什么master分支上有一个*号。

我们使用git checkout(检出)指令来切换分支,这会在我们做出一个新提交之前切换到新的分支上。我们使用git checkout newImage后再git commit:

branch3

搞定!我们的修改现在就被记录在新的分支上了。

Branches and Merging——分支和合并

我们现在已经知道如何进行提交和分支。现在我们需要知道某种方法来将两个不同分支的工作合并起来。这样的话,当我们在开发新特性的时候,就可以创建一个分支开发功能,开发完成后在合并回来。

我们要说的第一个合并工作的方法就是git merge。在Git中**合并(Merging)**会创建一个有两个父提交的特殊提交。一个有两个父提交的提交实际上是指“我想包含两个父提交及其祖先提交的所有工作”。

现在我们有两个分支,每个分支都有一个独立的提交。这就意味着没有一个分支包含了我们对仓库所做的所有工作。

merge1

现在我们用合并来解决这个问题。我们使用git merge bugFix

merge2

哇哦,看见了吗?首先,master现在指向了有两个父提交的提交。如果你从master开始沿着提交树(commit tree)的箭头向上走的话,就可以遇到所有的提交,直到提交树的根。这就意味着master包含着这个仓库的所有工作。

同时,注意到提交的颜色改变了吗?为了帮助学习,我(游戏作者)加入了一些颜色。每一个分支都有自己的颜色。每次提交都会改变颜色,它包含了该提交的所有分支的混合组合。

因此,我们看到master分支的颜色被混合到所有的分支中,但是bugFix分支的颜色没有,我们现在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值