Git reset head revert 回滚

Overview

涉及Git一些日常操作 :)

基础知识

《Pro Git》至少了解branch,commit的概念,及基本的原理

Git 工作区、暂存区和版本库

Overview

暂存区(stage, index)是 Git 最重要的概念之一

  • 工作区: 你的目录下面的文件们
  • 暂存区: 由.git/index保存引用,.git/object保存对象的区域
  • 版本库: 仓库

Relations

Why stage before commit

  • Split work into separate commits  分开提交,比如当只想提交一部分时
  • Don‘t break the build  不影响项目构建

HEAD

这样的引用标识符——它看起来并不像一个普通的引用——其实并不包含 SHA-1 值,而是一个指向另外一个引用的指针。内容如下

HEAD~n

表示从当前HEAD指向的commit开始数的第几个(参见git log HEAD或git log)

从0开始计数,git log中第一个commit 表示HEAD~0

reset

下面这段话非常重要

git reset [<mode>] [<commit>]
This form resets the current branch head to <commit> and possibly updates the index
(resetting it to the tree of <commit>) and the working tree depending on <mode>.
!!!!!! If <mode> is omitted, defaults to "--mixed". The <mode> must be one of the following:

--soft
Does not touch the index file nor the working tree at all (but resets the head to <commit>,
 just like all modes do). This leaves all your changed files "Changes to be committed",
as git status would put it.

--mixed
Resets the index but not the working tree (i.e., the changed files are preserved but not marked for
commit) and reports what has not been updated. This is the default action.

--hard
Resets the index and working tree. Any changes to tracked files in the working tree since <commit> are discarded.

--merge
Resets the index and updates the files in the working tree that are different between <commit> and HEAD,
 but keeps those which are different between the index and working tree (i.e. which have changes which
 have not been added). If a file that is different between <commit> and the index has unstaged changes,
reset is aborted.

In other words, --merge does something like a git read-tree -u -m <commit>, but carries forward unmerged
index entries.

--keep
Resets index entries and updates files in the working tree that are different between <commit> and HEAD.
If a file that is different between <commit> and HEAD has local changes, reset is aborted.

!!!If you want to undo a commit other than the latest on a branch, git-revert(1) is your friend.

将当前的branch head重置到某个commit上面,这可能会影响index(暂存)区域。
默认情况下使用--mixed形式`

下面是各个形式的差别

注意,暂时只关注soft, mixed, hard,另外还有两种是merge和keep

working index HEAD target         working index HEAD
----------------------------------------------------
 A       B     C    D     --soft   A       B     D
                          --mixed  A       D     D
                          --hard   D       D     D

撤销上次add的,(但不想改变工作目录下面的代码)

git reset HEAD (该命令会改变index与HEAD,使得文件状态变成unstage)

如下图所示:默认情况下,HEAD可以不写。

该命令可以完整的写法是git reset HEAD~0 --mixed

解释为重定向到这次的提交

working index HEAD target         working index HEAD
----------------------------------------------------
 A       B     C    C     --mixed   A       C     C

另外,从上面看来,值得注意的是以下写法是等同的

  • git reset
  • git reset HEAD
  • git reset HEAD~0

撤销上次commit的,(但不想改变工作目录下面的代码)

git reset HEAD~1 --mixed

解释为重定位到上次提交

(该命令会改变index与HEAD,使得文件状态变成unstage)

working index HEAD target         working index HEAD
----------------------------------------------------
 A       B     C    D     --mixed   A       D     D

如果想完全忽略这次commit编辑的内容

1. 可以继续使用 git checkout – . 清除所有与index(此时index已经等于上次commit)不同的改变

2. 或者直接使用 git reset HEAD~1 --hard

revert

简单来说,执行某次commit操作的逆向操作,并且提交(默认提交)。

发布回滚

回滚有两种可能

  • 回滚线上项目正在使用的代码
  • 回滚版本控制器中主线的源代码

通常情况下,QA大叫出事啦出事啦,回滚回滚。意思是线上项目的回滚而非代码的回滚。(当然最好还是问清楚是不是这样)

源代码真的要回滚吗?

主线源代码回滚,能做是能做,但比较麻烦。所以先case by case考察一下必要性。线上回滚,并不意味着源代码一定要回滚。下面这些情况就不用回滚:

  • 线上回滚后,查出并不是因为源代码有问题。下次不用改源代码,再发一遍rtag就好啦。
  • 下次线上发布,是在修正前次失败的发布中的错误后,发布前次失败的发布想发布的内容。

只有当要修正前次失败的发布中的错误需要较长时间,而同时又有其他new feature或bug fix着急上线时,才需要主线上的源代码回滚。

是reset还是revert

不论是使用reset还是使用revert都会带来不同程度的麻烦

Reset比revert会带来更多地麻烦。情况会非常复杂。

我们系统中使用revert。

已经merge master的开发分支,只需要继续merge master即可(此次回滚完全不可见)

当前开发(正在发布的),需要merge master之后 revert掉master上revert的那次commit

reference

  1. Git 工作区、暂存区和版本库
  2. What is the benefit of git‘s two-stage commit process (staging)?
  3. What does ‘stage‘ mean in git?
时间: 2024-10-14 14:02:36

Git reset head revert 回滚的相关文章

git reset 操作后回滚

在使用git的过程中,虽然每次reset,rebase的时候你都小心翼翼,但是常在河边走,哪能不湿鞋?冷不丁一天状态不好,reset以后,发现你要的commit都不见了!心急如焚的你该如何处理这样的"突发事件"呢?显然,git是不会让你选择重写代码的.这时候,回滚操作就是你的最后一根救命稻草了! 1. $ git reflog 这条命令,基本上能让你知道你最近做的所有操作了,找到想回滚到哪一步,再执行 $ git reset --hard e0e9999 大功告成,刷新一下你的git界

git用法之[回滚代码]

我们在写代码的任何过程中,都有可能出错,任何过程都有可能要!回!滚!代!码!事关重大!一定要详细讲讲. 一.关于 工作区.暂存区.本地分支: 工作区:即自己当前分支所修改的代码,git add xx 之前的!不包括 git add xx 和 git commit xxx 之后的. 暂存区:已经 git add xxx 进去,且未 git commit xxx 的. 本地分支:已经git commit xxx 提交到本地分支的. 二.遇到想回滚代码时后怎么办? 1.在工作区的代码,被我写乱了,或者

git push错误,如何回滚

--> git push Counting objects: 81, done.Delta compression using up to 4 threads.Compressing objects: 100% (50/50), done.^Citing objects:  64% (52/81), 1.96 MiB | 75.00 KiB/s 此错表示提交的文件超过git接收文件上限.此时是已经取消不了,只能回滚到前版本再次提交. git log 查看提交的版本,找到版本号进行回滚. 回滚命令

git使用、版本回滚:

创建仓库git init: Initialized empty Git repository in E:/s27/.git/--已在E:/s27/.Git中初始化空Git存储库/ git init 文件夹(新建一个文件夹并且初始化仓库) Reinitialized existing Git repository in E:/s27/.git/--在E:/S27/GIT/中重新初始化现有Git存储库 git status--查看状态: On branch master--在分支主机上 No com

Git使用小技巧之回滚和撤销

想要获取更多文章可以访问我的博客?-?代码无止境. 日常的开发,我们难免会创建错误的git提交记录,整个时候git给我们提供了两个命令来解决这个问题.一个命令是git reset,另一个是git revert.两者有啥区别呢?两者主要的区别是,git reset命令是回滚某次提交,被回滚的提交将不会出现在提交记录中,而git revert命令是创建一个新的提交来达到撤销的目的,被撤销的提交和撤销的提交都会出现在提交记录中. 准备 首先呢,我们还是需要准备一个git仓库,并且准备一个可以修改的文件

#4.Git版本回滚

实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么.版本控制系统肯定有某个命令可以告诉我们历史记录, >1.在Git中,我们用git log命令查看: >2.如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数: 每提交一个新版本,实际上Git就会把它们自动串成一条时间线.如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线. >3.如何回退到上一个版本或指定版本 Git必须知道当前版本是哪个版本

[转] git reset简介

http://blog.csdn.net/hudashi/article/details/7664464 http://guibin.iteye.com/blog/1014369 http://hi.baidu.com/tiger_tnt/blog/item/a0464ffa6a8115d9b58f314d.html http://web.mit.edu/~mkgray/project/silk/root/afs/sipb/project/git/git-doc/git-reset.html 一

git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

[git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br  (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将最近3次的提交回滚 [远程代码库回滚]: 这个是重点要说的内容

Git 命令 四 git代码库回滚

git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id [本地代码库回滚]: git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将最近3次的提交回滚 [远程代码库回滚]: 这个是重点要说的内容,过程比本地回滚要复杂 应用场景:自动部署系统发布后发现问题,需要回滚到某一个commit,再重新发布 原理:先将本地分支退回到某个commit,删除远程分支