git玩转笔记

git

  首先这其实不是我第一次使用git,在本科期间其实也是在软件工程课上介绍过git,然后介绍了一些命令操作,大致熟悉了git的使用方式。但是毕竟大概有一年多没有碰过版本控制相关了,这次git的学习也算是当作一个复习。

  这次的再探git我使用的是macOS,虽然很久没有使用git进行版本控制,但是github还是比较常用的,所以换新电脑的时候顺手就把git安装好了。本次体验通过mac的终端进行操作。

  参考文献是孟宁老师的玩转git了。

场景1:git的本地仓库用法

  首先创建了一个新的目录,以此作为本地仓库来体验git。

然后确认本机安装的git版本,以及初始化git仓库,可以发现在目录下多了一个.git文件夹。

 其中用到的命令如下:

git --version

先检查一下此时的状态,使用如下命令:

命令2 git status

然后我们创建了一个新的文件1.txt,并输入一些文字。这时候有了新的文件,再次检查git状态,可以看到1.txt为被追踪的提示。

 

使用的命令如下:

1 touch 1.txt
2 vim 1.txt
3 git status

 

此时,可以使用git add命令将其加入git暂存区,该命令后面可以跟一个文件名,或者跟一个.表示将当前目录下所有文件加入git暂存区。

暂存区的作用是暂时存储需要修改的文件,在使用git commit命令后这些文件才真正成为仓库的一个版本。

接下去我们就将本次修改提交,使用commit命令

1 git add 1.txt
2 git commit -m "add first file into git"

使用log命令可以查看历史提交记录

1 git log

自此,我们完成了git版本管理的一个迭代过程,将代码提交到了仓库。

但是光光能提交还不够呀,有时候我们会做出一些反悔的事情,就需要回退版本了。那就安排上!

git提供了reset命令,可以帮助我们回退到上个版本

reset有三种模式mixed(默认模式)、hard、soft。其原理是移动head所在指针,区别是(git的三种区域工作区、暂存区和仓库状态改变不同)

1.mixed模式,重置位置且只保留工作目录内容,将暂存区内容和仓库内容改成和reset后的节点一致。

2.hard模式,将工作区、暂存区和仓库内容都改成reset节点一致的内容。

3.soft模式,保留工作区和暂存区内容,将仓库内容改成和reset节点一致。

为了测试上述不同的方式,我们来做一个实验,设计如下:

根据之前的实验,我们在仓库中保存了1.txt,而暂存区由于提交过后,变成空了,工作区则还有1.txt

实验1:测试mixed模式。其只保留工作目录内容而将暂存区和仓库改成reset节点一致,则我们可以先创建一个2.txt文件并将其添加到暂存区,

此事我们有reset节点状态:

仓库(1.txt),暂存区(空),工作区(1.txt)

当前状态:

仓库(1.txt),暂存区(2.txt),工作区(1.txt,2.txt)

预计reset以后:

仓库(1.txt),暂存区(空),工作区(1.txt,2.txt)

实验结果:

可以看到暂存区已经清空,而工作区仍然有两个文件。

实验2:测试hard模式。我们再次将2.txt加到缓存区。

现在状态:

仓库(1.txt),暂存区(2.txt),工作区(1.txt,2.txt)

reset hard以后理论上仓库和工作区只有1.txt,暂存区为:

仓库(1.txt),暂存区(),工作区(1.txt)

结果:

实验3:测试soft模式。新建2.txt,当前状态:

 仓库(1.txt),暂存区(2.txt),工作区(1.txt,2.txt)

结果:

仓库(1.txt),暂存区(2.txt),工作区(1.txt,2.txt)

 

可以看出两者无变化。

有了回到过去,我们当然还可以再次反悔,回到未来。使用以下命令查看reset记录。

1 git reflog

 

最后总结一下场景1下我们用到的命令:

1 git init #初始化本地git仓库
2 git add [filename]#将文件添加到git暂存区
3 git commit -m "some message"#将暂存区的内容提交到仓库
4 git status#查看当前暂存区状态
5 git log#查看提交历史
6 git reset [commit-id]#有三种模式,用于回退版本
7 git reflog#用于回到未来

场景2:远程仓库用法

git是分布式的版本控制工具,就会有远程仓库的概念,这里我在github上创建了一个远程仓库,并以此为基础完成实验。

我们会用到以下命令来进行远程仓库访问:

git clone [your repository]#从远程仓库克隆一个仓库到本地
git remote add orgin [your repository]#配置远程仓库地址
git pull#从远程仓库拉取到本地
git push#将本地仓库推到远程

首先从github远程仓库clone一下项目,使用以下命令

1 git clone https://github.com/duliu12/project2

结果得到一个目录,其下只有一个readme文件。

然后测试remote命令,具体如下

1 git remote add orgin  https://github.com/duliu12/project2

然后我们将原来的project2删除,并重新从远程仓库pull下来,运行以下命令:

1 git pull orgin main

pull操作=fetch+merge。结果如下:

之后在本地仓库添加一个1.txt文件后push到远程仓库,使用的命令如下:

1 git push orgin master

再看看远程github仓库的情况,多了一个1.txt

 

场景3:合并测试

还是上述仓库,这次做一个合并的测试。首先在github远程仓库添加一个hello.cpp,是一个很简单的hello world程序。

接着在本地仓库添加一个2.txt文件,并切换到mybranch这个新的分支,这样双方的branch就出现了冲突。

首先我们将远程仓库的内容重新pull下来,被提示出现冲突,需要merge

输入提示信息后merge成功,查看目录如下:

 最后再将仓库重新push一遍

 场景4:git rebase用法

git rebase用于合并多次提交,可能我们会有一些很小的改动过,但是每次都完成了提交,有时候这些提交是没有意义的,只是为了保存修改。因此践行朴素的版本管理理念就可以使用git rebase。

为了体验一下git rebase效果,首先重新从github上clone原项目。

使用以下命令

1 git clone https://github.com/duliu12/project2

然后再对1.txt进行多次修改

 将第二次commit注释掉

 

会提示有冲突,再打开1.txt解决冲突,最后使用git rebase --continue

 至此,rebase操作就完成了,在团队项目开发中最后就需要将分支merge一下再push到github上就可以了。

posted @ 2020-10-04 13:58  xiaoze8  阅读(125)  评论(0)    收藏  举报