git使用简介

利用Git管理源码的一个常见工作流程:

git status						//查看修改状态
git add .						//加入暂存区
git commit -m '注释'		//加入提交区
git push						//推送到远端

一、什么是git

git是一个用于管理源码的分布式版本控制系统。

版本控制简单来说就是追踪文件变化。当我们修改文件时,版本控制系统会记录并保存下每个变化。这允许我们在任意的时间点重新载入一个先前的代码版本。

没有版本控制系统,我们就可能需要储存很多份源码文件(例如使用日期等进行区分),这种方式十分耗时,并且当项目很大时成本也很高。同时我们也无法为每个代码的拥有者提供谁在何时修改了源代码的哪部分的信息。当许多个小组成员对同一份代码进行修改时,很可能出现修改的部分相互覆盖的情况,这是一个很严重的问题。

版本控制系统可以解决上述问题。有了Git后,我们可以很轻易的访问我们源代码的各个版本并且追踪各种变化。我们可以观察到版本随时间的变化以及是谁进行了修改。因为代码最近的版本储存在一个共享仓库里,Git可以避免团队中的任何人不小心使用旧版本的文件来覆盖了最新的文件。

总的来说,一个版本控制系统使得如下的过程十分简单:

  • 追踪代码的历史
  • 使得团队可以协同工作
  • 观察到谁修改代码的哪部分

二、Git工作流程

一个Git项目有如下三个主要组成部分:

  • 工作树
  • 索引

库(repository,又称为repo)是追踪项目文件变化的“容器”。它持有所有的commit(这是我们的文件在某个时间点上的一个snapshot)。我们可以使用Git log来访问commit历史。

工作树(working tree,也被称为working directory),其包含了我们正在进行操作的文件。我们可以将工作树视为我们可以观察并修改的文件系统。

索引(index,也称为staging area),是准备commit的地方。索引会比较工作树中的文件以及库中的文件。当我们对工作树中的文件进行了修改,那么索引会在这个文件commit前标记这个文件为已修改。

下图展示了一个Git项目的三个主要组成部分:库、工作树及索引:
在这里插入图片描述
我们可以将Git工作流程视为如下的过程:

  • 在工作树中修改我们的文件
  • stage我们想要下次commit的修改
  • commit我们的修改(commit会从索引中取文件并在repository将它们存储为一个snapshot)

Git文件总共有三个状态:

  • modified
  • staged
  • committed

当我们修改了一个文件后,我们可以在工作树中找到这次修改。我们需要stage我们想要包括在下次commit的修改。一旦我们完成stage所有的文件后,我们就可以commit这些文件并且添加一条描述信息(通常这条信息指出我们修改了什么,功能是什么等等)。修改后的文件就可以被安全地存储在库中。

下面的图片描述了Git文件的状态:
在这里插入图片描述

三、创建一个库

在安装了Git后,我们要做的第一件事就是创建一个库。库是一个存储我们所有代码的中心文件夹。

3.1 远程库和本地库

Git库有两种类型,本地和远程:

  • 远程库存储在远端或者工作环境外的服务上,由多个团队成员共享
  • 本地库存储在每个使用者的机器上

本地库主要利用Git的版本控制特征,而远程库主要负责管理各个本地库的协作。

在这里插入图片描述

3.2 创建库的方式

有两种在我们的机器上创建本地库的方式:我们可以使用我们机器上的文件夹中创建一个本地库,也可以克隆一个已经存在的库。

Git init

我们可以利用git init命令创建一个新的库。这个命令将Git引入到一个已经存在的但是还没有进行版本的控制的项目中,此时我们就可以开始追踪项目的变化。

Git clone

我们可以使用git clone命令来将一个远程库复制到本地机器上。默认情况下这个命令会自动设定一个本地的master branch来追踪远端的master branch。

注意,一个克隆来的库和原始的库有相同的历史日志。我们可以在我们本地的库中refer以及backtrack这些commit。

四、记录变化

Git并不会自动保存下我们做出的每一个变化。我们必须告知Git我们想要记录哪些变化(通过将这些变化暂存)。在暂存后,我们可以commit这些变化,此时这些变化就在库中存在了。

4.1 修改文件

工作树是我们进行修改的地方。我们可以在这里编辑文件,添加新文件并且移除那些我们不需要的文件。

一旦一个文件在工作树中被修改后,它就会在索引中被标记为已修改(索引是准备新的commit的暂存区)。在工作树中进行的修改不会被直接记录到库中。所有的修改都先在索引处暂存,接下来存储到库中。

4.2 Git commit

git commit命令允许我们将文件的变化保存在库的Git历史记录中。

我们commit的每个变化都可以在其对应的文件中观察到,如下图所示,commit历史存储在本地库中:
在这里插入图片描述
Git使用一个40字符大小的checksum哈希值来判别每一个commit。我们可以使用这个checksum哈希值来检索我们在库中进行的commit的状态或变化。

注意,Separating different types of changes such as bug fixes, new features, and improvements into different sets of commits will allow you and your team members to understand why and how those changes were made easily.

当commit我们进行的更改时,我们需要输入一条commit信息。这条commit信息应当准确的描述了我们所进行的变化,建议使用的commit格式如下:

第一行:commit所进行的修改的简化描述
第二行:空白行
第三行及以后:进行改变的原因

5 撤销更改

Git最重要的特征之一就是能够撤销更改。当我们进行一次新的commit时,Git会保存我们项目的一个snapshot,这使得我们可以在需要时回滚到一个更早的版本。

有两种方式撤销更改,git revert和git reset

5.1 Git revert

我们可以使用git revert命令来安全地undo一个已经pushed了的commit。

在这里插入图片描述

我们还可以使用git reset或者git rebase -i来删除一个先前的commit,但是通常来说不应该这样做,因为这会导致remote repository和其他成员的local repositories 变得 desynchronized。

5.2 Git reset

我们可以通过git reset命令来discard那些我们不再需要的commits。我们可以 specify the scope for the reset command by going into reset mode。下图表示使用git reset来移除不必要的commit。

在这里插入图片描述
总共有三种主要的reset modes:

  • Mixed(default)
  • Soft
  • Hard

Mixed mode restores the state of a changed index. Soft mode undoes a previous commit. Hard mode removes all traces of a commit. Below is a breakdown of each reset mode.

在这里插入图片描述

6 同步repositories

远端repositories允许我们和小组内的其他成员共享更改。有三个常见的同步命令:git push、git pull以及git merge。

6.1 Git push

为了开始和其他人共享我们的改变,我们需要通过push命令来将更改push到远端repository。这会使得远端repository更新并且和我们的local repository同步。

在这里插入图片描述

6.2 Git pull

当有人将他们的改变push到共享远端库时,我们的本地库会变得out of date。为了重新同步我们的本地库,可以使用git pull操作。

当执行了pull后,我们将从远端库下载最新版本并且import到我们的本地库。

在这里插入图片描述

6.3 Git merge

当本地库out of date时,我们向远端库的push会被拒绝,这可能是因为远端库的有些更新没有同步到本地库。

在这里插入图片描述
如果这种情况出现,我们需要使用git merge指令来从远端库获取最新的改变,接下来再进行push。Git强制执行这种操作来确保其他成员所作的更改会保留在历史中。

在这里插入图片描述
在“merge”的过程中,Git会尝试自动应用这些历史更改并将其与当前分支合并。但是,如果历史更改应用时存在冲突,那么Git将抛出错误并提示我们手动解决冲突。

6.4 解决merge冲突

在合并两个分支时,我们可能会遇到需要解决的冲突,然后才能正确完成合并。例如,当两个或更多成员在不同branch对文件的同一部分进行更改时,Git就无法进行自动合并。

当发生这样的情况时,Git会向冲突的文件添加一些标准冲突解决标记。这些标记帮助我们弄清文件的哪个部分需要我们手动解决。下图展示了一个conflict的例子:

在这里插入图片描述
在上面的例子中,在=====上的全部内容是我们的本地内容,而下方的全部内容来自于远端分支。

在继续创建merge commit前,我们必须解决如下所示的冲突部分。
在这里插入图片描述
(修改这个commit来消除冲突)

7 Rewriting history

待补充

https://backlog.com/git-tutorial/rewriting-history/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值