我记不住的那些Git的操作

这篇具有很好参考价值的文章主要介绍了我记不住的那些Git的操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:其实接触Git也很长时间了,自打上学那会就用Git作为版本控制工具,感触颇深。写这篇文章也是记录一下自己的理解留作日后词典进行查询,另外也是想把这些内容分享给大家。本篇将以问题为导向来阐述相关的知识,面对的对象为具有一定经验的开发者。

假设当前项目有两个分支,为master和dev,所有开发工作都在dev上进行,而master分支为用于发布生产代码的分支。

 git reset 在commit级别上与 git commit是相反操作

 git reset 在file级别的缓存区index上与git add 是相反操作

 git checkout 在file级别的工作区working上与 修改 是相反操作

我整理了我在日常工作中的十个问题,重点是第4个问题和第8个问题,如下所示:

1.撤销本地工作目录中的更改(git checkout与修改<file>是相反的操作)

git checkout -- <file>

这样将撤销对本地工作目录的更改,此操作checkout修改<file>是相反的操作。

此操作不会移动HEAD指向,这里的 “ -- ”是将选项(options) 和 path/to/file.txt参数(arguments) 进行分隔的分隔符,“--” 作用是进行分隔,目的是避免下列两种方式的混淆:

git checkout <tree-ish> <path1> <path2>
git checkout <path1> <path2> <path3>


//  这样将节点标识和路径进行了分隔,否则会存在不清晰的状态

git checkout <tree-ish> -- <path1> <path2>
git checkout -- <path1> <path2> <path3>

checkout 操作也可以跟 路径或文件如下图所示:

git 保存编辑框,github,git

2.撤销本地缓存的更改(git reset 与 git add 是相反操作)

Reset With a Path

当reset 指令后面是某个文件或路径,则不会改变分支的指向(skip),只会影响缓存区和工作区的内容,如下图所示:

git 保存编辑框,github,git

 注意: git reset --mixed HEAD file.txt  与  git reset file.txt 是等价的

             因为 --mixed是默认的策略,HEAD也是默认的指向值。

1.
//从缓存区下台这个文件,但不改变工作目录的内容,与git add <file>是反义词
// git reset 与 git add 是反义词
git reset --mixed HEAD <file>      
或
git reset <file>  



2.
//从缓存区移除所有已加入的文件的缓存,而不会覆盖任何修改,与git add .是反义词
git reset              
或
git reset HEAD


3.
//从缓存区移除所有已加入的文件的缓存,并且恢复工作目录
git reset --hard
或
git reset --hard HEAD           

有三种选择:

--soft        只改HEAD指针的指向,不修改任何 缓存区和工作目录的内容

--mixed    默认,将改HEAD指针的指向,也将缓存区重置,但不改变工作目录的内容

--hard      改变HEAD指针的指向,缓存区重置,工作目录重置

git reset 与 git add 是相反操作,如下图红框所示:

git 保存编辑框,github,git

 

3.当在本地提交commit后如何修改这个commit message?

git commit命令有一个amend参数,用于修改之前的提交信息

git commit --amend

当点击回车后,会出现一个编辑框,重新编辑内容并保存退出即可。

其实还有一个场景是:你写的commit message是对的,但是你忘记了修改仓库中某个文件的内容,那怎么办?

这时候你有两个方法,第一就是重新修改然后add和commit,即生成一个新的节点,后续也可以rebase解决。

第二种就是在当前这个节点上修改然后add,最后amend,即在原来的节点进行修改。

vim  test.txt
​
git add . 
​
git commit --amend

这是一种将忘记的修改添加到当前这个节点的方法

总结:amend这个参数不仅仅能修改commit message,还能对仓库中的文件再次进行更新和修改

4.当周三升级要对某个版本进行打包

首先通过git log命令查询当前的历史,例如:

commit ae4fa4a6d8f9b4f6095c822935e3e0f7ab20f7cd (HEAD -> master)
Author: lsqtongxin <lsqtongxin@qq.com>
Date:   Sat Jun 19 11:09:06 2021 +0800
​
    add third.java
​
commit 1cf533f4bca614a163810da46657efc9343075d5
Author: lsqtongxin <lsqtongxin@qq.com>
Date:   Sat Jun 19 11:08:18 2021 +0800
​
    add second.java
​
commit 9d69109d65ffd13291c3f72f304e36a20b99b32b
Author: lsqtongxin <lsqtongxin@qq.com>
Date:   Sat Jun 19 11:06:48 2021 +0800
​
    add main.java

当你想使用second.java(1cf533f)来进行周三生产升级,但是当前的最新的节点为third.java(ae4fa4a)它是你最近完成的代码内容,即你电脑硬盘里显示为third.java版本。那你如何操作呢?

使用git checkout 命令来针对某个版本进行检出代码:

git checkout 1cf533f                  //这样你的硬盘将会恢复为second.java文件等

然后进行代码的打包、编译、测试即可,上传并升级即可。

又有人问,我第二天上班时候,如何恢复到最新的状态呢?

通过git log是没法找到third.java的commitID的,那么如何找到third.java的commitID呢?

假设我们刚刚是在master上进行操作,所以最新的third.java节点位于master分支上。

git checkout master                    //这样将会使恢复如初。

总结: git checkout 本质上是通过改变HEAD的指向来进行移动节点,在多分支操作中,这个命令还用于切换分支

5. 开发某个代码时想看一下之前的版本中某个文件

此操作不会移动HEAD指向

接上面的第4步骤中的git log,例如:

git checkout <commit> <file>

查看文件之前的版本。

注意: 它将工作区中的某个文件的内容 变成指定的commitID的某个文件内容,同时缓冲区也会被修改,也就是说 你在工作区 修改<file>,然后执行这个操作,你原来的修改将不会被保存而是被commitID的文件内容进行覆盖。

那么如何返回最新的版本的file呢?

git chekcout HEAD <file>

这个命令也就是说 只能在没有任意修改的时候,进行切换来查看文件内容,否则将被覆盖。

具体比较如下图所示:

git 保存编辑框,github,git

 WD safe 代表 是否 working-directory safe ?

6.合并你的多个提交(压缩提交)

假设你在dev分支上,新建一个feature分支开发一个功能点,计划5个工作日完成,你为了不丢失每天的工作内容,每天在本地commit一个提交来记录你当天的工作,那么你就有了5个commitID,导致你后续会因为开发很多功能点会有很多个commitID,有的功能点需要10个工作日即10个commitID,你会发现这些commit非常繁杂。

那么我要是按照功能点的颗粒度,是否可以将这5个commitID或者10个commitID合并为一个commitID来呢?

这样会将你的历史很简洁、干净和清爽,翻阅过往的历史也会很快速。并且会使你的log保持清晰,简化整体commit数量,非常的实用。

git rebase -i <base>                //在feature分支上

其中为一个基准点,为某一个commitID,都是以这个基准点进行合并,但是合并的内容不包括这个基准点。

git rebase -i cf375ac               //在feature分支上

假设我们的历史从古至今为:25ccabd->0134238->d46d81e,也就是合并这三个节点为一个节点。

25ccabd为feature的第一天工作

0134238为feature的第二天工作

d46d81e为feature的第三天工作

而这个基准点为cf375ac,这个commitID cf375ac内容等等均不会变化。这里一定注意参数这不是25ccabd,然后将0134238和d46d81e前面文字由pick改为squash或者s,保存退出,然后再重新写提交信息,最后保存退出即可。

7.拉取更新

先 fetch,然后 merge。git pull 命令是整合了这两个过程的方式。

git fetch                            //从远程拉去默认主机origin的所有分支
git fetch <remote>                   //从远程拉去remote这个主机的所有分支
git fetch <remote> <branch>          //从远程remote拉取某个分支的更新

git remote                           //查看所有的远程主机

例如:

git fetch origin dev                 //拉取远程origin/dev分支的更新
​
git branch -r                        //查看远程分支
​
git checkout dev                     //切换到dev分支
​
git merge origin/dev                 //将远程origin/dev合并到本地dev分支上

于是我们得到了远程origin/dev的更新,将其他同事的commit更新到了我的本地。

git pull是上面两个过程的整合,可以参考第8步。

8.分支合并

假设我们基于dev分支开发某一个feature功能点:

git branch feature dev              //基于dev新建一个feature分支
git checkout feature                //切换到feature分支进行开发工作

这时候你就可以专注于你的工作,vim sample.txt / git add . /git commit -m "revise sample file"等

最后你完成了你的feature开发。

当多人协作时候,有许多人都合并了他的某个分支到dev分支上,导致dev分支有很多更新。

那么当我们完成了我们的feature功能后,我们如何操作呢?

首先我们应该远程拉取dev分支的更新:

git checkout dev                     //切换到dev分支
git pull origin                      //拉取远程origin的dev分支的更新

如果本地dev已经提交了更新,那么需要合并本地dev和远程dev:git pull --rebase origin

当从远处origin dev更新完毕,即为(startTime)

然后在feature分支上进行rebase操作:

git rebase -i dev                   //这一步类似第6步骤

这一步rebase包含了两个方面的功能,1.以最新的dev为基   2.根据最新的dev进行合并多个节点。

最后切换到dev分支进行合并:

git checkout dev
git merge feature

其实这一步git merge是快速前进(Fast forward模式)

再进行将dev分支推送到远程主机(endTime)

git push origin dev

这一步有可能失败,是因为在startTime到endTime这一段时间又有人提交更新,即你更新的时间到你提交的这段时间又有人提交,导致你的节点落后。

git pull --rebase origin
git push origin dev

这个 --rebase,就是会使用git merge替换为git rebase,即实现了git fetch和git rebase两条指令。

最后删除分支:

git branch -d feature

总结:

整体步骤分为

第一创建分支:根据业务需求在dev上创建你自己的本地分支feature

第二编写代码:在feature分支上进行编写,并产生了多个提交节点。

第三pull:先拉取远程dev的更新,

第四rebase:再基于dev进行 rebase,

第五merge,最后将feature合并到dev分支。

第六是push

第七是删除feature分支

9.撤销某次commit的更改

git revert <commitID>

这个命令的重点会再生成一个新的节点,并且不会删除这个旧的节点,这样避免了丢失项目历史。

一般用于当某个历史提交引入了bug,要么是将那个引入bug的节点revert退回,要么就是直接建立fixbug分支来解决bug再进行合并等。

10.删除某次commitID到最新节点的更改

git reset 这个命令用于改变当前分支所指向的commitID,而不是改变HEAD的指向,因为HEAD一般指向分支,如下所示:

HEAD --->>> master --->>> commitID

git 保存编辑框,github,git

 详细可参考 Git HEAD及detached head和Git - Reset Demystified

假设:从古至今  V1->V2->V3

git reset 有三种选择:

--soft        只改分支的指向,不修改任何 缓存区和工作目录的内容,也就是说 缓存区和工作区都保还继续保持最新的节点的内容,一般不用这个选项

例如:git reset --soft V2   //此时 HEAD指向分支,分支指向V2,缓存区和工作区都还是V3

--mixed    默认,将改分支的指向,也将缓存区重置,但不改变工作目录的内容,也就是说 缓存区被改为commitID节点的内容,而工作目录还是保持最新节点的内容。

 例如:git reset --mixed V2   //此时 HEAD指向分支,分支指向V2,缓存区是V2,工作区都还是V3

--hard      改变分支的指向,缓存区重置,工作目录重置,也就是说缓存区和工作区都被改为commitID节点的内容。

 例如:git reset --hard V2   //此时 HEAD指向分支,分支指向V2,缓存区是V2,工作区是V2

10.1 删除某次commitID到目前的更改,且保存从commitID到目前节点的工作目录中各文件的内容的修改:

git reset <commit>      //也可以是 HEAD^  默认是mixed

10.2 删除某次commitID到目前的更改,不保存从commitID到目前节点的工作目录中各文件的内容的修改:文章来源地址https://www.toymoban.com/news/detail-521834.html

git reset --hard <commit>

到了这里,关于我记不住的那些Git的操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从golang编辑器对项目进行git操作

    1.先将项目clone到本地中: 首先选定将项目放在本地的位置,作者将项目选定放在本地的D:githubProject,在该文件夹中打开Git Bash Here,在命令行中输入: 2.在golang中查看项目的分支情况: 在上图中可以看到我们的项目中有4个远程分支,一个本地分支。我们需要在本地分支在开

    2024年02月16日
    浏览(40)
  • Git——IDEA集成GitHub详细操作

    目录 一、 设置GitHub账号 二、分享项目到GitHub 三、push推送本地库到远程库 3.1 第一种方法: 3.2 第二种方法:SSH 四、pull拉取远程库到本地库 五、clone克隆远程库到本地 可以使用下面这个token登录,第一个太慢太慢了,太消耗我的耐心了     这个token怎么获取?  去自己的G

    2024年02月05日
    浏览(52)
  • git与github(结合clion操作)

    对自己学习git的一个记录,由于刚开始接触git,所以没有对于git做深入解释和说明,仅供参考,如有理解不对的地方或者需要改进的地方敬请指出。   用到的git命令: git init //初始化 git add . //添加所有文件 git add 文件名 //添加指定文件 git commit -m \\\" \\\" //提交,引号里写提交说

    2024年02月01日
    浏览(72)
  • Git学习笔记(第6章):GitHub操作(远程库操作)

    目录 6.1 远程库操作 6.1.1 创建远程库 6.1.2 命名远程库 6.1.3 本地库推送到远程库(push) 6.1.4 远程库拉取到本地库(pull) 6.1.5 远程库克隆到本地库(clone) 6.2 团队内协作 6.3 跨团队协作 6.4 SSH免密登录 命令 作用 git remote -v 查看所有远程仓库的别名和地址 git remote add 远程仓库别名 远程

    2024年01月20日
    浏览(45)
  • github代码托管git详细操作指南

    通过git官网下载,链接:https://git-scm.com/download/win(win版、mac版、linux版) 截图如下: 下载完成后显示位置: 双击安装:Git-2.43.0-64-bit.exe 截图如下: 新手全部选中next到最后install安装 安装完成之后如下截图: 通过windows+R输入cmd打开命令窗口,输入git 出现如下信息说明安装

    2024年02月03日
    浏览(42)
  • Git和Github操作命令及关联远程库

    前言 一、Git 1. 环境配置 2. 基本操作 3. 版本切换 4. 忽略文件 5. 分支 6. 命令行 --tag 7. 查看远程 8. 添加/移除远程仓库 9. 从远程仓库获取代码 二、Github/Gitee 1. 在Github/Gitee中创建一个空的库 2. 创建ssh密钥 3. 查看ssh密钥 4. github设置密钥 5. 绑定github 6. 绑定远程仓库 7. 查看

    2024年04月15日
    浏览(36)
  • 【小吉带你学Git】讲解GitHub操作,码云操作,GitLab操作

    🎊专栏【Git】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 🌺欢迎并且感谢大家指出小吉的问题🥰 点击settings 点击Plugins,在搜索框输入GitHub,然后下载即可 🎄创建口令 点击Settings 找到developer settings 权限要全选 🎄使用口令登录 点击Version C

    2024年02月12日
    浏览(47)
  • 初步上手Git软件及GitHub平台:基本操作方法

      本文介绍 Git 软件与 GitHub 平台的基本内容、使用方法与应用场景等。 目录 1 初步介绍 2 使用方法 2.1 GitHub配置 2.2 Git配置 2.3 代码上传至GitHub   首先,什么是 GitHub 与 Git ?为什么我们要运用这些工具?   首先从 GitHub 说起。如果大家参加过数学建模比赛,或许都经历

    2024年02月19日
    浏览(48)
  • Git项目同时推送到GitHub和Gitee详细操作

    将Git项目同时推送到GitHub和Gitee的好处如下: 提高代码可见性和协作性:GitHub和Gitee都是知名的代码托管平台,推送代码到这两个平台可以让更多的人看到和使用您的代码,并增加合作机会。 提高项目的可靠性和备份性:将代码推送到多个代码仓库可以提高项目的可靠性和备

    2024年02月04日
    浏览(45)
  • git、gitlab、github在windows下通用的操作笔记

    前言:命令是在Git Bash 下输入的命令,GUI部分涉及到小乌龟git,可以自行安装,不同版本有差异,用git的新手也可以尝试 SourceTree 提供漂亮的图形化界面操作(但是卡顿坑多,需三思) 介绍git安装 Git的小乌龟GUI操作 Git bash的命令 主要提供方向不提供具体命令操作是啥,其实

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包