问几个 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 条回复
ZackYang
2015-07-29 16:11:37 +08:00
sorcerer
2015-07-29 16:59:21 +08:00
感谢楼主的问题楼上诸位的回答,终于把这一块弄明白了
kchum
2015-07-29 17:02:22 +08:00
不是应该不管它,这次提交修改好就 OK 了
julyclyde
2015-07-29 18:00:08 +08:00
lz把时间顺序明确一下吧,总觉得0是最早的,但看语义似乎0是最近的?

reset应该只是把HEAD往古代方向挪了一下
但所有commit都是存在repo里的,还可以checkout出被reset掉的那个。但只有 有名字(HEAD、branch、tag、或者与他们有历史关系等) 的commits才会通过clone、push、pull传输到其他repo
bombless
2015-07-29 18:07:52 +08:00
如果只是撤销到add动作之前,还是用soft吧
CodingMonkey
2015-07-29 18:08:13 +08:00
HEAD~1 中的 ~1 指什么?
neoblackcap
2015-07-29 18:11:13 +08:00
@CodingMonkey HEAD的上一个commit
proudzhu
2015-07-29 19:10:37 +08:00
这种情况不是改好之后 git commit --amend 不就行了
msg7086
2015-07-29 23:05:32 +08:00
也可以先再提交一次,然后interactive rebase把两个提交合并。
当然amend最方便。
reset也可以只不过意义不大。
mcfog
2015-07-30 00:14:58 +08:00
想要保险,先commit 后 ammend/rebase是最保险的,因为有reflog保底绝对一行也不会丢
18000rpm
2015-07-30 01:20:07 +08:00
https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/commit-level-operations
https://www.atlassian.com/git/tutorials/rewriting-history/git-commit--amend

被这个教程领进门的,Git 要用的淡定就得先把内部结构看完,然后还要把每个命令与那几个区域的变化关系理清楚。
w359405949
2015-07-30 11:33:53 +08:00
一般不建议使用reset,这玩意会丢弃历史。

如果只是个别文件和个别行出问题,git checkout commit_id /path/to/file 把该版本中该文件弄出来,进行修改调整后,再add, commit。

如果对log有洁癖,等这部分工作结束后,使用rebase对提交历史进行集体处理,会好看很多。

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

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

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

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

© 2021 V2EX