在git中恢复以前删除的代码(不一定是单个或整个文件)

时间:2009-11-21 04:05:46

标签: git dvcs

我在一段时间后从我的代码中删除了一个类,并提交了删除。该功能是作为具有BDD样式规范的单个类实现的,并且在使用该功能时,在删除提交中更改了一些其他类。提交是干净的,因为提交中唯一的更改是删除这一个功能。

现在,我已经改变了主意,并决定只是因为我删除它才恢复功能我已经做了一大堆修改。 (我知道这是一种可能性,但我没有保留副本,因为我知道我可以将其从版本控制中删除)。我找到了提交:cb2a6b1,当我:git show cb2a6b1时,我可以看到删除的行。问题是我现在如何将这些行应用到我的代码中?

git diff cb2a6b1 cb2a6b1~1生成一个差异,它会将删除重新设置为添加,但不会git apply,主要是因为行号已更改。我可以手动将这些东西放回去进行一些手动文本编辑,但是有更自动的替代方法吗?

2 个答案:

答案 0 :(得分:7)

尝试git revert cb2a6b1

如果它无法自动找出正确的事情,那么它应该为您提供可以手动修复的合并冲突。

答案 1 :(得分:1)

另一个选项是git rebase -i。它比git revert更复杂,但你也有更多的选择。

假设您有一个仅包含README文件的git repo:

$ cat README
This is line alpha.
Line Beta.
Line Gamma.

然后您删除测试版并提交更改:

(make changes)
$ git commit -am 'removed beta'

现在你再添加一些行,提交:

(make changes)
$git commit -am 'added delta'
(make changes)
$git commit -am 'added epsilon'

现在我们的README文件和git日志看起来像这样:

$ cat README
This is line alpha.
Line Gamma.
Line Delta.
Line Epsilon.
$ git log --pretty=oneline
56ae2db58905607270434045b2a7218237d3716e added epsilon
058ec4b92fb279370f6e5b81c4aebb6250f93c6b added delta
19801b380956b60f36b4922796ea86935a75e569 removed beta
bc9057cebf05352eb5596eaf753708a14de589d2 initial commit

现在我们决定不应该删除beta线。 git rebase救援!每当我做任何变基时,我都喜欢使用临时分支,因为我正在改变历史。

$ git checkout -b fixingthings

现在我们要重新定义自初始提交以来发生的所有事情。查看日志,即提交bc9057c...

$ git rebase -i bc9057c

现在,您将在编辑器中看到这一点:

pick 19801b3 removed beta
pick 058ec4b added delta
pick 56ae2db added epsilon

# Rebase bc9057c..56ae2db onto bc9057c
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

底部的评论很有帮助。只需删除你想要删除的提交行,保存并退出,git将负责其余部分。现在您的自述文件看起来像这样:

$ cat README
This is line alpha.
Line Beta.
Line Gamma.
Line Delta.
Line Epsilon.

就像魔术一样!

如果您愿意,可以立即合并回主分支并删除临时分支。

$ git checkout master
Switched to branch "master"
$ git merge fixingthings
Auto-merging README
Merge made by recursive.
$ git branch -d fixed
Deleted branch fixingthings (was 1247141).

git rebase所做的是将每次提交视为补丁并按顺序重放它们(或者不是,如你所说)。这意味着你可以有合并冲突。如果发生这种情况,rebase将暂停并让您解决冲突。有很多关于在这种情况下该做什么的教程。 This one looked good to me.