问几个 git 撤消的问题

2015-07-29 14:53:01 +08:00
 recall704
git 的add .commit. branch,merge 都基本能用了.
但是撤消,还是不太理解.

求科普.

我有一 branch 如下:

dev5 -> dev4 -> dev3 -> dev2 -> dev1 -> dev0

其中 dev0是最新提交的,现在我突然发现其中有段代码出错了,我想撤消 这次提交.
即撤消 git add , git commit 这两个动作.
同时我之前的修改要还在,不然我又得重新写代码,哭死啊.


同时求解释 rebase, revert, reset 作用与区别.
4228 次点击
所在节点    git
32 条回复
limuxy
2015-07-29 15:09:13 +08:00
同时撤销的add和commit的话 应该git reset --hard HEAD~1 就可以了
moe3000
2015-07-29 15:16:27 +08:00
楼上+1
morethansean
2015-07-29 15:26:52 +08:00
。。。楼上的方法会丢掉你的改动的
123123
2015-07-29 15:27:42 +08:00
用 git reset HEAD~1

加 --hard 参数修改也没了
networm
2015-07-29 15:28:14 +08:00
@limuxy 你这个操作会将文件弄丢的啊,楼主要求之前的修改都在,很显然去掉 --hard 参数调用这个就可以了:git reset HEAD~1

在此,强烈推荐阅读 ProGit v2 http://git-scm.com/book/zh/v2,同时欢迎来审校中文版: https://github.com/progit/progit2-zh/issues/160
lijinma
2015-07-29 15:29:10 +08:00
git reset --soft HEAD~1
networm
2015-07-29 15:29:19 +08:00
链接发错了,链接和内容之间还必须隔一个半角空格。
ProGit v2 http://git-scm.com/book/zh/v2
lijinma
2015-07-29 15:29:38 +08:00
git reset HEAD~1 应该等同 git reset --soft HEAD~1
morethansean
2015-07-29 15:31:52 +08:00
--mixed 回到 commit 和 add 之前的状态
--soft 回到 commit 之前的状态
--hard 回到 commit 和 add 之前的状态并且丢掉你的改动
limuxy
2015-07-29 15:32:20 +08:00
@morethansean
@networm 对不起我没看清LZ问题…… TAT
--hard会删掉修改的,LZ你千万别听我的啊!!!!
6楼正解 git reset --soft HEAD~1
123123
2015-07-29 15:38:02 +08:00
@lijinma 不对 默认参数是 --mixed
123123
2015-07-29 15:38:25 +08:00
@limuxy 为什么无视 4L
123123
2015-07-29 15:39:00 +08:00
再说 6L 的也不对
YoungShook
2015-07-29 15:42:43 +08:00
@limuxy 楼主还需要保留修改,--hard 不得哭了....

使用 git reset --mixed HEAD~1 才是正解。😄
chuan2015
2015-07-29 15:46:20 +08:00
给个思路,先stash,再reset,再stash pop
limuxy
2015-07-29 15:50:46 +08:00
补张图,关于--mixed, --soft, --hard
lijinma
2015-07-29 15:53:10 +08:00
@YoungShook
@123123

哈哈,我查了,也试验了,--mixed 和 --soft 有一点点差别,不过不大,都可以。

--soft
Does not touch the index file or 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.

If -N is specified, removed paths are marked as intent-to-add (see git-add(1)).



@chuan2015 如果直接使用 reset --mixed 或 --soft 话,不会丢失现在的修改,所以没必要 stash.
1ang
2015-07-29 16:07:53 +08:00
如果你的dev0还没提交的话最简单的方法是先修改好改成你要的样子
然后 git commit --amend 这个命令会直接修改你上一次的commit,加上你现在修改的东西,所以不需要stash 也不需要reset
FrankFang128
2015-07-29 16:10:13 +08:00
hard reset 并不会把 commit 删掉,只是将其从 history 里删掉。
lijinma
2015-07-29 16:10:38 +08:00
@1ang 哈哈,有道理,如果是刚好是上一次修改,amend 就可以,如果是上上次等修改,就需要 reset

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/209245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX