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上就可以了。

浙公网安备 33010602011771号