2016-12-01 145 views
2

我是新来的git,不知道如何处理这个。恢复过去的git提交,但保持更改自

我想撤销一系列特定的提交(与单个文件有关),我们认为这不是一个好的解决方案,但我想保留自从引入的所有其他提交。

我不想只编辑文件来删除那段代码,因为我觉得在这里恢复更明确,并且更好地传达了这种意图。

它是这样的东西:

X - >Ÿ - > X - > -X - >Ÿ - > X - > X

ÿ指与该特定功能相关的提交,并且X是我们想要保持完整的提交,结束于:

X - > X - > -X - > X - > X

我不知道怎么会底垫在这里工作,因为我不希望只是包括所有从某一点开始提交。

樱桃采摘会更好吗?

编辑:可能值得一提的是,所有这些提交都被推送。

+1

互动底垫,只需删除有问题的承诺选秀名单。 –

回答

1

您可以使用git rebase --onto如下解释:https://blog.pivotal.io/labs/labs/git-rebase-onto

你的具体情况:

X1 -> Y1 -> X2 -> X3 -> Y2 -> X4 -> X5 

的命令是:

git rebase --onto X3 Y2 # strips Y2 
git rebase --onto X1 Y1 # strips Y1 
+0

只需确认一下,这需要按照倒序的顺序完成?从最新到最早? – Nobilis

+0

@Nobilis:你可以按任意顺序来完成,但编辑早期的历史记录可能会改变后面的哈希值,所以我选择这样做,因为你可以在流程开始时记下哈希值,然后使用它们而不必检查他们再次。如果你这样做,反过来不应该做任何事情,但我认为它可能会失败,你必须在每一步之前再次查看哈希值。 –

+0

谢谢你的提示,我会考虑在未来我没有意识到的rebase - - 但是在推动这些提交之后,似乎重写历史记录在我们的案例中不是可取的选择。我必须走下“恢复”路径。 – Nobilis

0

您可以还原特定的文件到以前的提交:

git reset <commit hash> <filename>

这可能是件好事,审查该文件第一次所做的更改:

git diff <commit hash> <file name>

你可以提交哈希有git log

或者,你可以从版本控制签出文件的以前版本:

git checkout -- <file name>

编辑:更多信息here

0

我个人比较喜欢git rebase -i HEAD〜10(最近10次提交的交互式rebase),在那里我会通过评论他们的行来放弃不好的提交。

请注意,这需要一个总是要小心的推力。

2

可以使用互动变基为了解决你的错误如果您提交尚未共享(仍然是在你的仓库本地提交)

的syntaxe是:git的变基--interactive提交的哈希(或者只是git rebase -i commit的哈希)

在你的情况下,让我们说你的第一个x提交的散列是x1(使用git log来git这个提交的散列代码),然后你可以使用:git rebase -i x1

enter image description here

对于每一个承诺要删除替换通过下降挑

然后退出编辑模式(通过使用ESC键):WQ