当前位置:   article > 正文

有关Git(小白一看就懂)入门版_git reset head file

git reset head file

git的使用是在工作中必备的技能,本系列重写自己曾经学习git的过程,按照从创建git仓库开始操作,赋每一步的演示图,让小白跟着文章操作,一步一步入门

目录

git基本概念

git使用基本流程

文件的四种状态

git的使用和基本命令:

分支操作

链接远程仓库


git基本概念

四个工作区:

git本地有三个工作域:工作区(working directory), 暂存区(stage/index), 资源库(repository)。如 果再算上远程服务器上的git仓库(remote directory)就可以分为四个工作域。其关系如下:

  1. Workspace: 工作区,就是你平时存放项目代码的地方
  2. Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件 列表信息
  3. Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数 据。其中HEAD指向最新放入仓库的版本
  4. Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据 交换 

git使用基本流程

1. 在工作目录中添加,修改文件

2. 将需要进行版本管理的文件放入暂存区

3. 将暂存区的文件提交到git仓库

文件的四种状态

Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态 变为Staged.

Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文 件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可 进入暂存staged状态, 使用git checkout 则丢弃修改过,返回到unmodify状态, 这个git checkout即 从库中取出文件, 覆盖当前修改

Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,文件状态为Modified

git的使用和基本命令:

首先确保自己安装了git工具

linux下使用:

sudo apt install git 管理员状态

创建本地仓库

首先创建一个新目录,使用git init将当前目录变为一个可以通过git管理的仓库

git init

初始化后会生成git的配置文件目录,普通的"ls"命令是看不到的,我们需要使用ls -a查看隐藏目录

演示如图:

 注意事项: 第一次使用git命令提交代码之前,需要先设置用户名及邮箱,之后就不需要了:

  1. git config --global user.name "你的用户名"
  2. git config --global user.email "你的邮箱"

这里我配置过了,这里就不演示了


下来将新创建的文件,代码什么的添加到暂存区

  1. 使用git add filename 添加文件到暂存区
  2. filename就是你要添加的文件名

首先我在这里写一段代码,仅仅只是写了个主函数,后面我会不断完善这个文件,上传各个版本。此时main.c提交到暂存区中


此时我们查看一下仓库的状态

使用git status 查看仓库状态

 显示我们暂未提交到本地仓库,位于分支master上(master是主分支),分支后面会讲


接下来我们正式将刚刚的main.c提交到本地仓库中

使用 git commit -m "版本描述信息" 提交版本到仓库

此时我们才是真正提交成功了。


我们使用命令去查看一下刚刚的提交信息

使用git log查看提交的历史记录

head是指向的意思,表示这次提交到哪儿,head->master代表这次提交到master主仓库,如果是head->分支仓库则代表提交到分支仓库


我们可以使用命令去重写上一次提交的注释

git commit --amend

上一次的注释中我们写的是“创建主函数”,我想修改为“创建main.c函数”,终端执行上述语句就会进入此页面 

进入编辑页面修改注释,修改完成之后根据下面的提示,我们选择ctrl o写入,就会得到下面界面

 再按下回车,我们就写入成功了,回退到起始界面

此时我们ctrl x离开退出,git log查看日志,但其实你一退出后git commit --amend命令下面就会显示修改之后的注释,此时就成功变成了“创建main.c”

接下来我们在更改一个版本(提交跟上述过程一样)的代码演示下面的命令:

我们此时在文件中添加个一个add求和的函数,查看日志会发现,此时head指向最新一个版本


下来使用命令查看仓库所有已提交的操作日志

git reflog 查看对仓库的操作日志

head前面的序号就是log查看里那一串长序号的前面几位(这几位就已经够区分不同版本了),我们后面也可以根据这短短的序号去查看所需版本的文件


如果我们想查看以前版本的文件怎么办呢?此时我们的文件是处在添加了add函数的时候,如果我们想回到最初创建main函数的时候,就需要使用回退版本的命令了,下面进行演示:

此时我们的代码长这样:

  1. 使用git reset --hard HEAD^ 回退版本
  2. ^代表上一个版本的意思,HEAD代表当前仓库的指向,当前HEAD指向master,就代表回滚到master上一次提交的版本
  3. 那么git reset --hard HEAD^^就是回退两个版本^^^就是三个版本,一次类推
  4. 那么还有一种简便方法
  5. git reset --hard HEAD~3
  6. 后面的~3,代表以当前版本为基数,回滚多少次。HEAD~3代表回滚master前三个版本
  7. 还有一种方式,我们用版本号去回退,前面讲git log或者git reflog的时候都能看到
  8. 版本他独有的版本号,也讲了可以用他去回退版本
  9. git reset --hard 版本号

有三种模式

--soft 、--mixed以及--hard是三个恢复等级。

  • 使用--soft就仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。
  • 如果使用--mixed,就将头恢复掉,已经add的暂存区也会丢失掉,工作空间的代码什么的是不变的。
  • 如果使用--hard,那么一切就全都恢复了,头变,aad的暂存区消失,代码什么的也恢复到以前状态。
     

 此时我们会发现代码回归到上个版本的样子了

 此时你git log会发现head就跑到这个版本了

如果我们想再回到之前那个add的最新版本怎么办?我们会发现git log已经查看不到add版本了。

上面我们讲了git reflog这个是查看对版本仓库的操作,我们提交版本,回退等等操作都属于对仓库的操作。我们使用git reflog查看一下历史操作

会发现里面有我们所有的操作历史,同样有所对应的版本号,我们就可以用版本号去回退到我们想要的版本了,add的版本号为773e37a,(之前git log的时候会发现是很长一串773e37a...),不过这里前几位就可以唯一标识了,我们就可以用他去回退版本

示例操作如下:

查看文件,成功回到add时期版本

当然我们回退上一步,回退任何版本都可以用版本号来操作


那么如果我们不小心将工作区的文件删除了怎么办呢?或者说在这一版上写了一部分代码,但是突然不想要了,觉得删代码麻烦

那么可以我们从版本库中把此时最新的一版拿出来(我们删之前或者修改之前的),或者说是放弃此时对于工作区的修改的操作

  1. git checkout filename 放弃对工作区代码的修改
  2. filename就是修改或者删的那个文件

我们会发现文件又回来了~


接下来比如我们修改了一部分代码,但是还未add,我们想知道修改了哪一部分怎么办?(代码量很多,自己忘记了)

如上,我们新增了一句 int a=10;

使用git diff HEAD 比较当前内容与最后一次提交的版本的差异,如下在main.c中添加了一行内容,显示 添加的一行前面有‘+’号标识。如果内容相同则该命令不显示输出结果。HEAD也可以省略默认就是与最近一次比较。如果是和上上个版本比较那就是HEAD ^,依次同理HEAD就是当前版本要清楚

一般都是把现在写的代码和当前版本去比较

 


那么此时如果 我将上面这一次的改动提交到了暂存区,但是我后面发现我没有写完或者不想要了,想撤销怎么办呢?

我先提交了,查看一下状态显示我是暂时放进了暂存区 

那么撤销工作的命令就是:

使用git reset HEAD filename 从暂存区撤销

此时我们刚刚提交到暂存区的操作就被撤销了


有时候我们可能会删除一个文件,就是原来版本中有这个文件使我们需要的,不过后面我们写了更好的一版,这个文件不需要了(从版本仓库中删去),我们就要删除他。

下面我进行操作演示:

需要用到

用git rm filename 删除一个文件

 新增添一文件max.c进入,提交之后,此时之后我们现在就会有两个文件了

如果我们用普通的rm 文件去删除(只是本地工作区删掉了),后续用git checkout max.c又可以恢复max.c文件

如果直接rm删除文件,只是删除工作区的文件,只是与版本库不一样了,git status 会提示你。

恢复工作区文件:git checkout  -- 文件名

那么我们如果想以后都不用了,就是从版本仓库中把他删去,用下面命令

使用git rm filename 删除一个文件, 此时提交到暂存区,需要commit后才在版本库中删除

 此时max.c文件在版本库中被删掉


下面来聊聊分支相关的操作,就像上面的master一样 ,看图说话

那么有一个切换分支的东西,就是比如上图,我们创建了新分支dev,想要在上面实现一些代码。那么就需要把head指针去指向新分支(head是指向的意思,表示这次提交到哪儿),那么之后写的代码都是在这个新分支上面。

 

切换分支是非常常用的! 

分支操作

查看当前都有哪些分支

查看分支: git branch

此时我们只有master这一个分支


创建一个新分支

创建分支: git branch 分支名

此时head还是指向master的


切换分支

切换分支: git checkout 分支名

 此时发现head指向了dev分支,我们下面如果写代码提交,那么都会弄到这个分支上面


此时我们提交代码,编写一个fun函数,就会出现在dev分支上


此时我们切换到master分支,就会发现fun函数不在

 如果我们现在再在master分支上面对这个main函数进行修改,新添一个max函数


还有一个快捷的方式去创建新的分支并切换

创建并切换到该分支: git checkout -b 分支名

假如现在我们想把dev分支上的代码和master上的合并,该怎么办呢?

git merge 分支名

  1. 合并某个分支到当前分支: git merge 分支名 ,合并时可能产生冲突,需要解决冲突。
  2. 有时需要禁止快速合并,可执行:git merge --no-ff -m '描述' 分支名

此时在主分支master上,合并发现有冲突,为啥嘞?

 我们打开代码看看

 假如我们两个都想要,那么手动修改一下,提交此版本。这就是我们的最终版


如果我们现在想删除一个分支怎么办呢?

首先我们先新建一个新分支gk,切换到别的分支,然后去删除这个gk分支

删除分支,不能删除当前所处分支,切换到其它分支再删除: git branch -d 分支名


好用的常用操作:

历史记录一行显示 

git log --pretty=oneline

 

 


以图表形式显示分支:

git log --graph


有时候我们在工作的时候比如修改了一部分代码,但是还未完成,因此没有提交,这时候需要我们转到另一个分支上去做一些操作,如果我们不保存这些未完成的代码,如果切换分支过后,原分支这些修改未提交的代码就会不见了。因此我们需要保存此时工作区的状态

保护现场 git stash,当前工作区有代码修改了,是不能切换到其他分支,可以先保存现场,再切换 

git stash

我们先不保存修改代码看看是什么样的。我们现在处在master分支,对于main.c做一些修改,未提交,然后切换到dev分支

 

 他会提示我们要么提交代码要么去保存

我们去保存一下现在的工作现场,去查看保存之后的代码会发现,代码显示的是你未修改之前的状态,你修改的那部分,他给你保存在了别的地方(就是我刚刚修改的调用add函数的代码)

此时就保存了现场,成功切换分支   


那么当我们在dev分支上一顿操作结束之后,我们需要回到master去处理刚刚没弄完的代码怎么整呢? 

首先我们先切回master,你查看你的代码文件发现并没有刚刚修改的那部分,那是因为,保存现场之后git把那部分代码存到别的地方去了,此时我们需要先看看我们都保存了哪些现场,再根据需要去恢复那部分保存的现场代码

列出所有保存的现场信息

 git stash list

             我们看到现在就保存了一个现场,现在就需要取出现场,去恢复代码了


取出某次的现场信息,继续工作 :

  1. git stash pop默认是最近一次
  2. git stash pop "stash@{1}" 加上编号,取不同的现场信息

如果有多个现场,也可以加上编号"stash@{1}"指定获取某一个。不同分支的现场,应该回到对应分支再获取,否则会自动合并现场到当前分支的工作区。                                                                    此时回到最初调用了add函数的状态

                   

这样的话git基础的本地操作流程就说完了              

链接远程仓库

可以用github和gitee去尝试链接一下

这一部分一定是工作之后最经常用的,具体操作演示这里就不多说了,网上有太多的教程了

这里把每天都要用的命令列在这里

  1. . 克隆项目:git clone 项目地址
  2. . 提交分支到远程仓库:git push origin 分支名
  3. . 提交分支到远程仓库,并跟踪分支 :git push -u origin 分支名
  4. . 拉取远程服务器上的分支更新到本地 :git pull origin 分支名

到此这一版本的git学习就到这里了,我都是按照当初我学习的步骤演示了一遍,小白看完文章跟着操作,一定会对git有一定的了解的

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号