git 如何用 revert 回滚代码到某个 commit?

2016-08-01 10:47:10 +08:00
 zeroten

比如有 commit asda21313123,我给它打了 tag v100 ,如果使用git revert git revert v100..HEAD的方式,如果中间有 merge commit 就不行。

要求不能用 reset 、 rebase 这样重写提交记录的方法。

34061 次点击
所在节点    git
45 条回复
jsfaint
2016-08-01 11:00:20 +08:00
为啥不能用 git reset ?
git reset --hard 不就是做这事的吗?
henius
2016-08-01 11:08:59 +08:00
git reset --hard
hosiet
2016-08-01 11:13:22 +08:00
为啥不能用 git reset?

说实在的,只想检出代码又怕影响历史纪录的话, git checkout 都行,就是不知道你的需求是什么

如果想用一个提交解决一切, git diff 导出区别再 apply 如何?
zeroten
2016-08-01 11:39:26 +08:00
@jsfaint
@henius
@hosiet 不想用 reset 是为了避免其他人如果从 v101 checkout 一个分之开发去了,现在 reset 到 v100 ,那么他如果再合并代码不就又会把 v100 带回来或者产生冲突,这些不必要的麻烦。
zeroten
2016-08-01 11:39:50 +08:00
@hosiet diff 再 apply 是怎么个方案,可以说具体点么
Havee
2016-08-01 11:50:54 +08:00
你的需求到底是什么,有点看不懂。
如果要从 v100 从头开始来过, reset/checkout 都行,最好是 checkout 个分支,人家仍然 push 到原分支。
zeroten
2016-08-01 11:51:51 +08:00
简而言之, reset 可能会给团队中其他人带来困扰,且 reset 太暴力,操作不当可能丢失提交记录
zeroten
2016-08-01 11:56:43 +08:00
@Havee 见问题补充
zeroch
2016-08-01 12:05:47 +08:00
你要知道, 如果你在 remote master branch 上进行了回滚操作,然后在 push 回到 master 上面.那么, 无论如何你已经和 diverge, *不可避免*的对别人造成影响..

如果你在 local 的任意 branch 上操作..上面的回复说的, 不论是 reset 还是 checkout 都是可以的。甚至还有一种方法.你先 checkout 1, 然后从 1 到 4 进行 cherry-pick 。 cherry-pick 不会 hash 出新的 commit id 。
fangdingjun
2016-08-01 12:26:34 +08:00
像这样, 用历史文件覆盖当前文件,并产生一个新的 commit

git checkout -b temp
git reset --hard c7
git archive HEAD > /tmp/t.tar
git checkout master
tar xf /tmp/t.tar
git add .
git commit -m 'reset to c7'
axb
2016-08-01 12:32:04 +08:00
xi_lin
2016-08-01 12:42:51 +08:00
BOYPT
2016-08-01 13:26:37 +08:00
感觉就像朋友圈里面那些不许用方程解小学数学题,好难~
networm
2016-08-01 15:48:45 +08:00
git reset --hard 4
git reset --soft 8
git commit -m 'Reverted 5 6 7 8'

其实楼主怕的是丢失提交记录,而不是使用 reset rebase 命令
julyclyde
2016-08-01 15:52:01 +08:00
revert 是回滚某个 commit ,不是回滚“到”某个
你需要 checkout 或者 reset 之类的
zzzreg
2016-08-01 16:51:34 +08:00
切个新 branch 再 reset 怎么样?
pagxir
2016-08-01 17:03:48 +08:00
这么简单的操作,有你们想的那么复杂吗。
git rm -r -f *
git checkout <rev> .
git commit -m xxxx
就所有文件恢复到版本 rev 的状态,同时不进行分支修剪。
zeroten
2016-08-01 17:20:44 +08:00
@julyclyde 你看我主题中发的 git revert git revert v100..HEAD ,就有了回滚“到”的效果,只是有 merge commit 就不行了
zeroten
2016-08-01 17:22:06 +08:00
@BOYPT reset 那些会丢失提交记录,会产生冲突等等
zeroten
2016-08-01 17:27:05 +08:00
那些用 reset 、 rebase 的同学就不考虑到团购开发中不可能给所有人强制提交 master 的权限,而且这种操作太危险。而用 revert 或其他不修改提交记录的方式,就可以走正常的分之开发流程。
@jsfaint @henius @hosiet @Havee @zeroch @fangdingjun @axb @xi_lin @BOYPT @networm @julyclyde @zzzreg @pagxir

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

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

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

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

© 2021 V2EX