git回到上一个版本|如何用 Git 将代码恢复到一个历史的版本

『壹』 git 怎么把一个文件回退成上一个版本

git最小单位是一个提交,因此是不能单独回退某个文件的。当然,如果有个提交只修改了一个文件,就可以回退,gitrevert这个提交就可以了。

『贰』 git下载历史版本

1.git 获取历史版本的几种方式

我们简单的描述一个例子:a)初始化操作有两个文件file1.txt和file2.txt1, 初始化的时候就有这两个文件操作:git initgit statusgit add .git mit -m “init version”2, 在master分支上修改了file1.txt,并提交操作:(修改file1.txt)git add file1.txtgit mit -m “change file1”3, 然后新建分支banana,并切换到banana分支上操作:git branch bananagit checkout banana4, 修改file1.txt和file2.txt,并提交。

操作:(修改file1.txt和file2.txt)git add file1.txt file2.txtgit mit -m “change by banana”这个时候,我们可以输入 gitk,查看一下当前的版本情况。如下图:蠢悄派git-0015, 然后,切换到master分支上,修改file2.txt,并提交。

操作:git checkout master(修改file2.txt)git add file2.txtgit mit -m “change by master”输入gitk,查看当前版本情况,如下图:git-002b)发现问题需要查看历史版本我们现在发现当前的版本有点问题,还不能提交到版本库。1,我们需要从git mit中返回.则输入:git reset –soft HEAD^解释一下,HEAD是当前分支的最新版本。

^表示父节点。当前节点的父节点,就是上一次提交的版本。

也就是标记为“change file1”的版本。问为什么不是”change by banana”这个版本呢?不同的分支哦。”

change by banana”是banana分支的最新代码,和master分支不同的。这个时候输入git status看看,是不是显示file2.txt修改了没有提交呢。

2,我们需要从git add中返回再仔细查看之后,我们发现file2.txt真的写错了,需要返回到git add之前的状态。输入:git reset -q file2.txt这个时候,file2.txt就回到了解放前了。

用git status查看一下,file2.txt是”change not staged for mit”状态。3,回到没有做过的情况我们最终确定,最后一次修改的file2.txt是无用的代码,我们需要废弃掉。

注意,这个操作不能恢复的哦。git reset –hard这个命令,不能指定具体的文件。

是把当前的修改全部清除,恢复到最后一次提交的版本。这个时候,用gitk查看一下:git-003已经彻底回复到了“change file 1”的版本了。

4,直接回复到某个版本我们现在切换到banana分支。git checkout banana然后用gitk看一下。

可以看出,我们之前的操作,对banana分支一点影响也没有。现在我们需要把banana分支回复到初始状态,但是当前的改动的代码还是需要留着。

我们可以看,init版本是当前版本的父节点的父节点。我们可以这么操作:git reset –soft HEAD^^然后用gitk看一下:git-004最近的版本已经变成了init version了。

所有的改动都是add未提交状态。5,得到当前最新代码最后。

我们把file1.txt和file2.txt都删掉。我们需要从版本库中取得当前最新的代码。

很简单:git checkout master如果是要banana分支的最新代码,则:git checkout banana以上的操作,我们知道了如何查看版本分支,和如何回复运册到以前的版本。

2.如何用 Git 将代码恢复到一个历史的版本

有些时候,在一些特殊情况下,我们需要将代码恢复到一个历史的提交版本上。

而这个历史提交版本,离最新的提交已经比较久远了。比如,我希望将如下的仓库的提交,恢复到上上上上次提交。

当然,我可以一次一次的带贺 revert,但是有没有更快更简单的办法呢?暴力的方式如果你的仓库是自己在用(不影响别人),那么你可以使用 git reset –hard 来恢复到指定的提交,再用 git push -f 来强制更新远程的分支指针。为了保证万一需要找回历史提交,我们可以先打一个 tag 来备份。

对于刚刚的例子,需要执行的命令就是:// 备份当前的分支到 backup_mitgit tag backup_mitgit push origin backup_mit// 重置 source 分支git reset –hard 23801b2// 强制 push 更新远程分支git push origin source -f温和的方式如果你的仓库是多人在协作,那么你这么操作会使用别人本地的代码库混乱,所以只能建一个新的提交,这个新的提交中把想取消的提交都 revert 掉,那么具体应该如何做呢?方法如下:首先,和刚刚一样,用 git reset –hard 23801b2 将代码切换到目标提交的 id。接下来,用 git reset –soft origin/source 命令,将当前代码切换回最新的提交。

执行完上面两步后,你的仓库还是最新的提交,但是工作区变成了历史的提交内容,这个时候用 git add 和 git mit 即可。最终完成的效果如下:不过经过念茜的提醒,该方法需要保证 reset 的时候没有别人做新的提交,如果有的话,会一并把别人的提交也撤销了。

所以还是挺危险的,慎用。虽然用到的时候很少,但是理解它的原理有助于大家理解 Git 的工作区,暂存区和版本库的各种指针操作的意义,希望对大家有用。

3.git 代码上传后,怎么回退版本

总有一天你会遇到下面的问题.

(1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚.

(2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚.

这些开发中很常见的问题,所以git的取消提交,回退甚至返回上一版本都是特别重要的.

大致分为下面2种情况:

1.没有push

这种情况发生在你的本地代码仓库,可能你add ,mit 以后发现代码有点问题,准备取消提交,用到下面命令

reset

git reset [–soft | –mixed | –hard

上面常见三种类型

–mixed

会保留源码,只是将git mit和index 信息回退到了某个版本.

git reset 默认是 –mixed 模式

git reset –mixed 等价于 git reset

–soft

保留源码,只回退到mit 信息到某个版本.不涉及index的回退,如果还需要提交,直接mit即可.

–hard

源码也会回退到某个版本,mit和index 都 *** 退到某个版本.(注意,这种方式是改变本地代码仓库源码)

当然有人在push代码以后,也使用 reset –hard <mit。>; 回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变,线上mit,index都没有变,当你把本地代码修改完提交的时候你会发现权是冲突。..

所以,这种情况你要使用下面的方式

2.已经push

对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令

revert

git revert用于反转提交,执行evert命令时要求工作树必须是干净的.

git revert用一个新提交来消除一个历史提交所做的任何修改.

revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)

revert 使用,需要先找到你想回滚版本唯一的mit标识代码,可以用 git log 或者在adgit搭建的web环境历史提交记录里查看.

git revert

通常,前几位即可

git revert c011eb3

git revert是用一次新的mit来回滚之前的mit,git reset是直接删除指定的mit

看似达到的效果是一样的,其实完全不同.

第一:

上面我们说的如果你已经push到线上代码库, reset 删除指定mit以后,你git push可能导致一大堆冲突.但是revert 并不会.

第二:

如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的mit 并不会出现在历史分支里.

第三:

reset 是在正常的mit历史中,删除了指定的mit,这时 HEAD 是向后移动了,而 revert 是在正常的mit历史中再mit一次,只不过是反向提交,他的 HEAD 是一直向前的.

4.git怎么创建本地版本仓库

我们都知道,使用git的好处是可以很好地对项目版本进行控制。

我们可以很清楚地看到修改了哪些代码,并可以恢复到我们想要的版本。

使用的话,平常我们都是先将改动的代码提交到本地仓库,再推送到远程仓库。

那如果我们不需要推送到远程仓库,只需要在本地仓库进行管理呢?

最近就在做项目时,需要建立本地仓库。

于是上网查了下资料,找到了建立本地git仓库的方法,下面简单描述一下:

1、在项目的根目录下,使用git init 命令创建一个版本库。执行过后会发现根目录下多了一个.git的目录。

其中包括许多的空文件。比如:

config # 项目的配置信息

description # 项目的描述信息

HEAD # 项目当前在哪个分支的信息

hooks/ # 默认的“hooks” 脚本文件

index # 索引文件,git add 后把要添加的项暂存到这里

info/ # 里面有一个exclude文件,指定本项目要忽略的文件 #

logs/ # 各个refs的历史信息

objects/ # 这个目录非常重要,里面存储都是Git的数据对象

2、本地仓库创建成功后,使用git add 命令。把当前目录下的所有文件全部添加到暂存区。

3、再使用git mit 命令,将文件提交到本地仓库。

至此,本地仓库创建成功。当本地的源文件改动时,只需要再添加、提交到本地仓库即可。

使用git log 命令,可以看出有哪些内容被提交了。

甚至可以恢复到想要恢复的版本,这样及再也不用担心代码不能恢复的情况了。

『叁』 Git怎么还原上一个版本

第一步: git log 查看之前的commit的id,找到想要还原的版本第二步: git reset –hard 还原到之前的某个版本第三步: git push -f origin master 强制回push到远程

前两步在eclipse中也可答操作:

team –> show in hostory

找到想还原的版本

然后再强制push (git push -f origin master)

『肆』 intellij idea用git怎么退回上个版本

gitreset[commit哈希值]但是这样做抄只能把本地分支回滚到该commit上,远程分支还在原来的地方。可以这样操作:在你想要回滚的commit上另外建一个新分支,然后gitcheckout[该分支],然后把原来的分支删除掉,gitbranch-d[老分支]可以删除本地的老分支,同样,远程分支还是老状态,可以gitpushorigin:[老分支],把远程的老分支删除,这样你需要回滚的commit之后的信息在本地和远程都彻底消灭了(慎重,确保你真的不要这些信息了哦)。而你需要回滚的commit之前的信息全部保存了,只不过是分支名字换了一下,你也可以把分支改名回来。这时远程的新分支还不存在,你之后又改动commit并且push之后,远程也和本地同步上了。

『伍』 git获取历史版本的几种方式

我们简单的描述一个例子:

a)初始化操作

有两个文件file1.txt和file2.txt

1, 初始化的时候就有首配这两个文件

操作:

git init

git status

git add .

git mit -m “init version”

2, 在master分支上修改了file1.txt,并提交

操作:

(修改file1.txt)

git add file1.txt

git mit -m “change file1”

3, 然后新建分支banana,并切换到banana分支上

操作:

git branch banana

git checkout banana

4, 修改file1.txt和file2.txt,并提交。

操作:

(修改file1.txt和file2.txt)

git add file1.txt file2.txt

git mit -m “change by banana”

这个时候,我们可以输入 gitk,查看一下当前的版本情况。

如下图:git-001

5, 然后,切换到master分支上,修改file2.txt,并提交。

操作:

git checkout master

(修改file2.txt)

git add file2.txt

git mit -m “change by master”

输入gitk,查看当前版本情况,如下图:git-002

b)发现问题需要查看历史版本

我们现在发现当前的版本有点问题,还不能提交到版本库。

1,我们需要从git mit中返回.

则输入:

git reset –soft HEAD^

解释一下,HEAD是当前分支的最新版本。

^表示父节点。

当前节点的父节点,就是上一次提交的版本。

也就是标记为“change file1”的版本。

问为什么不是”change by banana”这个版本呢者扒指?不同的分支哦。

”change by banana”是banana分支的最新代码,和master分支不同的。

这个时候输入

git status

看看,是不是显示file2.txt修改了没有提交呢。

2,我们需要从git add中返回

再仔细查看之后,我们发现file2.txt真的写错了,需要返回到此悔git add之前的状态。

输入:

git reset -q file2.txt

这个时候,file2.txt就回到了解放前了。

用git status查看一下,file2.txt是”change not staged for mit”状态。

3,回到没有做过的情况

我们最终确定,最后一次修改的file2.txt是无用的代码,我们需要废弃掉。

注意,这个操作不能恢复的哦。

git reset –hard

这个命令,不能指定具体的文件。

是把当前的修改全部清除,恢复到最后一次提交的版本。

这个时候,用gitk查看一下:git-003

已经彻底回复到了“change file 1”的版本了。

4,直接回复到某个版本

我们现在切换到banana分支。

git checkout banana

然后用gitk看一下。

可以看出,我们之前的操作,对banana分支一点影响也没有。

现在我们需要把banana分支回复到初始状态,但是当前的改动的代码还是需要留着。

我们可以看,init版本是当前版本的父节点的父节点。

我们可以这么操作:

git reset –soft HEAD^^

然后用gitk看一下:git-004

最近的版本已经变成了init version了。

所有的改动都是add未提交状态。

5,得到当前最新代码

最后。

我们把file1.txt和file2.txt都删掉。

我们需要从版本库中取得当前最新的代码。

很简单:

git checkout master

如果是要banana分支的最新代码,则:

git checkout banana

以上的操作,我们知道了如何查看版本分支,和如何回复到以前的版本。

『陆』 git怎样回退到上一个

这些开发中很常见的问题,所以git的取消提交,回退甚至返回上一版本都是特别重要的.大致分为下面2种情况:1.没有push这种情况发生在你的本地代码仓库,可能你add ,commit 以后发现代码有点问题,准备取消提交,用到下面命令resetgit reset [–soft | –mixed | –hard上面常见三种类型–mixed会保留源码,只是将git commit和index 信息回退到了某个版本.git reset 默认是 –mixed 模式 git reset –mixed 等价于 git reset–soft保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.–hard源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码)当然有人在push代码以后,也使用 reset –hard <commit…> 回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变,线上commit,index都没有变,当你把本地代码修改完提交的时候你会发现权是冲突…..所以,这种情况你要使用下面的方式2.已经push对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令revertgit revert用于反转提交,执行evert命令时要求工作树必须是干净的.git revert用一个新提交来消除一个历史提交所做的任何修改.revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)revert 使用,需要先找到你想回滚版本唯一的commit标识代码,可以用 git log 或者在adgit搭建的web环境历史提交记录里查看.git revert 通常,前几位即可git revert c011eb3git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit看似达到的效果是一样的,其实完全不同.第一:上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会.第二:如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里.第三:reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的.

『柒』 git 还原某个文件到之前的版本

场景: 对于修改了 Git 控制下的某个文件,但是不满意,想回退到之前的版本。假定该文件为含渗 src/main/main.c 解决方法: 第一步: 得到该文件的commit 历史 第二步: 复制需要回退版本的hash 第三步:检出弯丛对应版本,格式为: git checkout <谈闹脊hash> <filename> 第四步: 提交检出下来的版本。

『捌』 如何用 Git 将代码恢复到一个历史的版本

有些时候,在一些特殊情况下,我们需要将代码恢复到一个历史的提交版本上。而这个历史提交版本,离最新的提交已经比较久远了。比如,我希望将如下的仓库的提交,恢复到上上上上次提交。当然,我可以一次一次的 revert,但是有没有更快更简单的办法呢?暴力的方式如果你的仓库是自己在用(不影响别人),那么你可以使用 git reset –hard <target_commit_id> 来恢复到指定的提交,再用 git push -f 来强制更新远程的分支指针。为了保证万一需要找回历史提交,我们可以先打一个 tag 来备份。对于刚刚的例子,需要执行的命令就是:// 备份当前的分支到 backup_commitgit tag backup_commitgit push origin backup_commit// 重置 source 分支git reset –hard 23801b2// 强制 push 更新远程分支git push origin source -f温和的方式如果你的仓库是多人在协作,那么你这么操作会使用别人本地的代码库混乱,所以只能建一个新的提交,这个新的提交中把想取消的提交都 revert 掉,那么具体应该如何做呢?方法如下:首先,和刚刚一样,用 git reset –hard 23801b2 将代码切换到目标提交的 id。接下来,用 git reset –soft origin/source 命令,将当前代码切换回最新的提交。执行完上面两步后,你的仓库还是最新的提交,但是工作区变成了历史的提交内容,这个时候用 git add 和 git commit 即可。最终完成的效果如下:不过经过念茜的提醒,该方法需要保证 reset 的时候没有别人做新的提交,如果有的话,会一并把别人的提交也撤销了。所以还是挺危险的,慎用。虽然用到的时候很少,但是理解它的原理有助于大家理解 Git 的工作区,暂存区和版本库的各种指针操作的意义,希望对大家有用。

『玖』 63.Git Reset 详解版本回滚的三种模式

意思就是可以让HEAD这个指针指向其他版本。说白了就是通过此命令在版本之间进行穿梭。 它有三种模式,soft,mixed,hard,具体的使用方法下面这张图,展示的很全面了。

这三个模式理解了,对于使用这个命令很有帮助。在理解这三个模悔敬简式之前,需要略微知道一点Git的基本流程。正如上图,Git会有三个区域:

Working Tree 当前的工作区域 Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面 Repository 提交的历史,即使用git commit提交后的结果

首先, Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,以此类推,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100 。

–hard 会在重置 HEAD 和branch的同时,重置缓存区和工作目录里的内容。当你在 reset 后面加了 –hard 参数时,你的缓存区和工作目录里的内容会被完全重置为和HEAD的新位置相同的内容。换句话说,就是你的没稿芹有commit的修改会被全部擦掉。

回退到上一版本:

回退到指定版本号(以1a2b3c为例)的版本:

reset –hard:重置stage区和工作目录:

–soft 则会保留工作目录的内容,并把因为重置 HEAD 所带来的新的文件差异放进暂存区。

什么是「重置 HEAD 所带来的新的差异」?就是这里:

由于 HEAD 从 4 移动到了 3,而且在 reset 的过程中工作目录和暂存区的内容没有被清理掉,所以 4 中的改动在 reset 后就也成了工作目录新增的「工作目录和 HEAD 的差异」。这就是上面一段中所说的「重置 HEAD 所带来的差异」。

这就是–soft 和 –hard 的区别:–hard 会清空工作目录和暂碧裤存区的改动,*而 –soft则会保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区。

git reset 如果不加参数,那么默认使用 –mixed 参数。此时表示要:保留工作目录,并清空暂存区。也就是说,工作目录的修改、暂存区的内容以及由 reset 所导致的新的文件差异,都会被放进工作目录。简而言之,就是「把所有差异都混合(mixed)放在工作目录中」。

首先, Git 必须知道当前版本是哪个版本,在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^ ,上上一个版本就是 HEAD^^ ,以此类推,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成 HEAD~100 。

回退到上一版本:

回退到指定版本号(以1a2b3c为例)的版本:

–hard 会清空工作目录和暂存区的改动, –soft则会保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区。 –mixed 参数。git reset 如果不加参数,那么默认使用 –mixed 参数。此时表示要:保留工作目录,并清空暂存区。

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令 git reset –hard commit_id

穿梭前,用 git log 可以查看提交历史,以便确定要回退到哪个版本。 要重返未来,用 git reflog 查看命令历史,以便确定要回到未来的哪个版本。


赞 (0)