如何使用git回退部分修改(转)
如何使用git回退部分修改(转)
很多时候,git新手容易误操作,比如,在levelIISZ-1.4.dev分支下,运行了git pull idc cpp-1.0的结果,这样做麻烦很大,经常导致maven项目格式不正确,这个时候,可以用git reset --hard 去撤销这次修改
但是这样做也有问题,可能之前本地的,没有提交的修改,都消失了。可以尝试git revert命令
reset是指将当前head的内容重置,不会留任何痕迹。
Sets the current head to the specified commit and optionally resets the index and working tree to match.
git reset --hard HEAD~3
会将最新的3次提交全部重置,就像没有提交过一样。
根据--soft --mixed --hard,会对working tree和index和HEAD进行重置。
revert是撤销某次提交,但是这次撤销也会作为一次提交进行保存(这样就不会丢失原来修改过,但是没有提交的内容?)。
//////////////////////////////////////////////////////////////////////////////////
非常好的一篇文章
http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/
如何使用git回退部分修改
人总有犯错误的时候,如果发现不小心把私货提交到公共代码库,改如何挽回呢?
例如如下代码库:
$ mkdir git-partial-revert
$ cd git-partial-revert
$ echo "hello a" >a.txt
$ echo "hello b" >b.txt
$ git init
Initialized empty Git repository in /home/liang/project/git/git-partial-revert/.git/
$ git add *.txt
$ git commit -m "initial version"
[master (root-commit) b5e1a24] initial version
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 a.txt
create mode 100644 b.txt
$ git log
commit b5e1a24fc65202977b903435750dd9fb5e0d04d0
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:20:38 2010 +0800
initial version
以下是一次错误的修改。
$ echo "hello a from b" >>a.txt
$ echo "hello b from a" >>b.txt
$ git commit -a -m "hello a from b"
[master df3144e] hello a from b
2 files changed, 2 insertions(+), 0 deletions(-)
$ git push origin master
$ git log
commit df3144e3168f6ec189ed0b2b57908d8d4e862fe5
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:22:51 2010 +0800
hello a from b
commit b5e1a24fc65202977b903435750dd9fb5e0d04d0
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:20:38 2010 +0800
initial version
错误在于只应该提交对于a.txt的修改,b.txt的修改是私货,应该留在本地,以后提交。
第一种方法:纯手工修改。取决于要修改的内容多少,这可能是最简单也可能是最笨的方法。
如果错误发生在最新的commit里面,可以使用git reset修改。如下:
$ git reset b5e1a24f -- b.txt
Unstaged changes after reset:
M b.txt
$ cat b.txt
hello b
hello b from a
$ git log
commit df3144e3168f6ec189ed0b2b57908d8d4e862fe5
Author: Liang Wang <lwang1@marvell.com>
Date: Fri Jul 30 13:22:51 2010 +0800
hello a from b
commit b5e1a24fc65202977b903435750dd9fb5e0d04d0
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:20:38 2010 +0800
initial version
$ git diff
diff --git a/b.txt b/b.txt
index b1bdbca..ab47375 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +1,2 @@
hello b
+hello b from a
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: b.txt
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: b.txt
#
$ git diff --cached
diff --git a/b.txt b/b.txt
index ab47375..b1bdbca 100644
--- a/b.txt
+++ b/b.txt
@@ -1,2 +1 @@
hello b
-hello b from a
$ git commit -m "revert change in b"
[master d49f9f2] revert change in b
1 files changed, 0 insertions(+), 1 deletions(-)
$ git push origin master
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: b.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git diff
diff --git a/b.txt b/b.txt
index b1bdbca..ab47375 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +1,2 @@
hello b
+hello b from a
$ git log --stat
commit d49f9f2531ed9106ea53006bd698bbcdd54698e9
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:34:43 2010 +0800
revert change in b
b.txt | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
commit df3144e3168f6ec189ed0b2b57908d8d4e862fe5
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:22:51 2010 +0800
hello a from b
a.txt | 1 +
b.txt | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
commit b5e1a24fc65202977b903435750dd9fb5e0d04d0
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:20:38 2010 +0800
initial version
a.txt | 1 +
b.txt | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
这时b的修改就从公共代码库上拿掉了,但是还保留在本地。
或者也可以使用git revert。下面操作的缺点是没有保留对于b.txt的修改。如何保留修改留给读者作为习题 :-)
$ git revert -n df3144e31
Finished one revert.
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a.txt
# modified: b.txt
#
$ git diff --cached
diff --git a/a.txt b/a.txt
index 2c5e468..74614c9 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1 @@
hello a
-hello a from b
diff --git a/b.txt b/b.txt
index ab47375..b1bdbca 100644
--- a/b.txt
+++ b/b.txt
@@ -1,2 +1 @@
hello b
-hello b from a
$ git reset HEAD a.txt
Unstaged changes after reset:
M a.txt
$ cat a.txt
hello a
$ git checkout -- a.txt
$ cat a.txt
hello a
hello a from b
$ cat b.txt
hello b
$ git commit -m "revert change in b"
[master 5f6a2e1] revert change in b
1 files changed, 0 insertions(+), 1 deletions(-)
$ git log --stat
commit 5f6a2e16bfd59281d0150e3644aa1485dd6c0078
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 14:17:44 2010 +0800
revert change in b
b.txt | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
commit df3144e3168f6ec189ed0b2b57908d8d4e862fe5
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:22:51 2010 +0800
hello a from b
a.txt | 1 +
b.txt | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
commit b5e1a24fc65202977b903435750dd9fb5e0d04d0
Author: Liang Wang <a@b.c>
Date: Fri Jul 30 13:20:38 2010 +0800
initial version
a.txt | 1 +
b.txt | 1 +
2 files changed, 2 insertions(+), 0 deletions(-)
如果错误的修改已经不是最新的commit,则只能使用git revert。
/////////////////////////////////////////////////////////////////////////////
我们teamleader的总结,很不错的!!!
如何使用git回退部分修改(转)的更多相关文章
- git回退文件修改
假设git仓库某个文件的提交信息如下: [cxy@localhost-live mate-power-manager]$ git log -n3 SPECS/mate-power-manager.sp ...
- git使用---安装,提交,回退,修改,分支,标签等
下面是对git的各种使用及命令的基础使用,来自廖雪峰老师的git教程,这个收录下,作为git的使用总结. github上面地址为:https://github.com/Zhangguoliu/lear ...
- git回退操作
情况一:checkout 当你修改了某个文件,未提交暂存区,回退本次修改 git checkout -- file 情况三:reset 当你的代码,已提交到暂存区,还未提交到远程仓库 git log ...
- (转)git checkout 撤销修改
背景:学习git相关命令 git撤销修改和版本回退 git status查看当前仓库的状态 liuzhipeng@exdroid43:~/pad/pad-test$ git status 位于分支 m ...
- git 放弃本地修改
本文以转移至本人的个人博客,请多多关注! 如果在修改时发现修改错误,而要放弃本地修改时, 一, 未使用 git add 缓存代码时. 可以使用 git checkout -- filepathnam ...
- git 放弃本地修改(转)
如果在修改时发现修改错误,而要放弃本地修改时, 一, 未使用 git add 缓存代码时. 可以使用 git checkout -- filepathname (比如: git checkout -- ...
- git 放弃本地修改操作
如果在修改时发现修改错误,而要放弃本地修改时, 一, 未使用 git add 缓存代码时. 可以使用 git checkout -- filepathname (比如: git checkout ...
- [git 学习篇] git checkout 撤销修改
git status 查看当前创库情况 liuzhipeng@exdroid43:~/pad/pad-test$ git status 位于分支 master 您的分支与上游分支 'origin/ma ...
- git指令-撤销修改
git指令-撤销修改 如果在文件中添加了错误的内容,可以撤销修改 eg: 解决: 可以删掉最后一行,手动把文件恢复到上一个版本的状态: 使用git status 你可以发现,Git会告诉你,git c ...
随机推荐
- python高级 之(二) --- 类装饰器
装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...
- 【并行计算-CUDA开发】OpenCL、OpenGL和DirectX三者的区别
什么是OpenCL? OpenCL全称Open Computing Language,是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器 ...
- [Python3] 035 函数式编程 高阶函数
目录 函数式编程 之 高阶函数 1. 引子 2. 系统提供的高阶函数 3. functools 包提供的 reduce 4. 排序 函数式编程 之 高阶函数 把函数作为参数使用的函数,叫高阶函数 1. ...
- Python3图片处理头像
一. 简介: Python3图片处理头像右上角类似QQ,微信右上角未读信息效果,其实没有实质作用,只是简单练习. 1. 环境: python3.5 random模块:生成随机数 PIL模块:图像处理模 ...
- Go语言流程控制中的break,continue和goto(七)
break(跳出循环) break用于跳出整个循环,如下: func main() { ;i<;i++{ { break } fmt.Println(i) } } // 0 1 2 3 代码里只 ...
- (电脑重置之后)win10在桌面点右键鼠标一直转圈;无法点击桌面图标;
昨天重置系统之后,发现了这个毛病.桌面任务栏都能正常点击,就是一到桌面,无法点击桌面上面的图标(刚开机的时候还可以点).想新建文件夹来着,一点右键,鼠标即开始转圈圈.本来以为自己能好,结果第二天了还这 ...
- [BZOJ4180] 字符串计数
膜一发KsCla巨佬 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5 ...
- C++练习 | 模板与泛式编程练习(2)
#include <iostream> #include <cmath> #include <cstring> #include <string> #i ...
- Object 对象(对象的分类、属性(属性名和属性值)、基本数据类型与引用数据类型区别)
Object——引用数据类型 基本数据类型的不足之处:基本数据类型是单一的值,不能表现出值与值之间的所属关系 object分为内建对象.宿主对象和自定义对象 a 内建对象:ES标准中定义的对象,在任何 ...
- colspan和rowspan
colspan和rowspan这两个属性用于创建特殊的表格. colspan用来指定单元格横向跨越的列数:colspan就是合并列的,colspan=2的话就是合并两列. rowspan用来指定单元格 ...