0、基本概念

•Git是一个免费、开源的、分布式版本控制系统

•它使用一个特殊的叫做仓库的数据库来记录文件的变化

•仓库中的每个文件都有一个完整的版本历史记录

1)安装

sudo apt-update
sudo apt-get install git
git --version

2)工作流转

Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

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

  • 工作目录:它持有实际文件;
  • 暂存区(Index):它像个缓存区域,临时保存你的改动;
  • 本地仓库(Respository):可以把本地仓库理解成一个目录,这个目录中所有的文件都可以被Git管理起来每个文件的删除、修改、新增操作都可以被Git跟踪到

    以便任何时候,都可以追踪历史或者还原到之前的某一个版本

    HEAD,它指向你最后一次提交的结果图片

3)文件3种状态

对于任何一个文件,在 Git 内都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)

  • 已修改表示修改了某个文件,但还没有提交保存;
  • 已暂存表示把已修改的文件放在下次提交时要保存的清单中; add
  • 已提交表示该文件已经被安全地保存在本地数据库中了。commit

一、创建仓库并提交第1个commit

步骤1-4流程,参考下图流程会更清晰一些

图片

1、创建仓库

使用当前目录作为Git仓库,我们只需使它初始化。

git init

该命令执行完后会在当前目录生成一个 .git 目录。图片

2、新建本地文件

本地增加文件url.c、README.md

实用git status查看文件状态,红色部分,有2个未跟踪的在文件

图片

3、提交文件到暂存区git add

你可以提出更改(把它们添加到暂存区),使用如下命令:

git add <filename>
git add .      //添加所有文件
git add *.c    //添加所有c文件

执行下面操作:

git add *.c 
git add README.md

4、提交改动git commit

使用如下命令以实际提交改动:

git commit -m "代码提交信息"

或者

git commit

然后进入vim编辑器,添加提交信息

例如:

git commit -m '初始化项目版本'

以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。

图片

现在,刚才的改动已经提交到了 HEAD,但是还没到远端仓库。

可以使用git log查看所有的提交:图片

5、推送改动git push

刚才的改动现在已经在本地仓库的 HEAD 中了。

执行如下命令以将这些改动提交到远端仓库

git push origin master

可以把 master 换成你想要推送的任何分支

如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:

git remote add origin <server>

如此你就能够将你的改动推送到所添加的服务器上去了。

三、 分支操作

分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是”默认的”分支

在其他分支上进行开发,完成后再将它们合并到主分支上。

0)查看分支

列出分支基本命令:

git branch

没有参数时,git branch 会列出你在本地的分支。图片

此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。 执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。 分支在本地完成,速度快。

1)创建分支

要创建一个新的分支,我们使用branch命令。

git branch test
图片

由上图所示:

  1. 多了一个分支test
  2. 当前分支为主分支master,前面*表示活动分支

2)切换分支

branch命令不会将我们带入分支,只是创建一个新分支。所以我们使用checkout命令来更改分支。

git checkout test

创建一个叫做”test”的分支,并切换过去:

git checkout -b test
图片

如上图所示:

  1. 分支test前面有*,所以当前活动分支为master

分支创建和切换参考下图:

图片

3)切回master分支并合并

在分支test上,修改文件url.c,然后commit

图片

切换回主分支并合并

git checkout master
git merge test
图片

由上图所示,git merge test后,主分支多了一个新的commit b9217

图片

注意:

对其他分支的更改不会反映在主分支上。如果想将更改提交到主分支,则需切换回master分支,然后使用合并。

4)删除分支

使用-d标识,把新建的分支删掉:

git branch -d test
git branch -D test
图片

如上图,我们删除了分支test图片

5)上传分支push

除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:

git push origin <branch>

四、替换本地改动git checkout

假如操作失误可以使用如下命令替换掉本地改动:

git checkout -- <filename>

此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件

已添加到暂存区的改动以及新文件都不会受到影响。

  • 步骤

修改文件url.c,增加信息

//this change will be delete by git checkout

然后再git checkout url.c图片

如上图所示,

执行下面命令后:

git checkout url.c

url.c修改的信息

//this change will be delete by git checkout

已经被删除了,此时工作区域文件还原到了commitb 9217状态

查看url.c:图片

图片

假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:

git fetch origin
git reset --hard origin/master

五、重置git reset

当我们不想要之前提交的修改时,就会用到这个命令。也许这是一个 错误的提交或者可能是引入了 bug 的提交,这时候就要执行 git reset。

git reset 能让我们不再使用当前台面上的文件,让我们可以控制 HEAD 应该指向的位置。

1)软重置

软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改!图片

图片

输入 git status 后,你会看到我们仍然可以访问在之前的提交上做过的所有修改。

这意味着我们可以修复这些文件的内容,之后再重新提交它们!

图片

2)硬重置

有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。

Git 应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。

我们重新add并commit,然后硬重置图片

可见我们所有提交的信息都已经被移除,

工作区域文件恢复到commit 7bb299状态。

打开文件,查看,添加信息已经不存在,图片

图片

六、还原git revert

另一种撤销修改的方法是执行 git revert。

通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交。

新创建文件peng.c并提交

图片

用git revert 撤销修改图片

由上图所示,执行git revert 209485之后,我们新增的文件peng.c被删除,并提交了1个新的commit 5b08d

此前添加peng.c文件的提交还在,这样就保留了该提交信息,提高了仓库的兼容性。

在撤销特定的提交时,git revert 非常有用,同时也不会修改分支的历史。图片

七、拣选git cherry-pick

当一个特定分支包含我们的活动分支需要的某个提交时,我们对那个提交执行 cherry-pick!

对一个提交执行 cherry-pick 时,我们会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。

创建切换到cherry分支,

git branch cherry
git checkout cherry 
图片
图片

在分支cherry上修改文件README.md提交几个节点图片

图片

切回master分支

git checkout master
图片

执行git cherry-pick b98fc77

图片

由上图所示,分支cherry的commit  b98fc77,被复制到分支master,并创建了1个新的提交2d995,

通过该命令我们就可以将其他分支,需要的提交,合并到主分支master。

图片
end

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注