我在一段时间后从我的代码中删除了一个类,并提交了删除。该功能是作为具有BDD样式规范的单个类实现的,并且在使用该功能时,在删除提交中更改了一些其他类。提交是干净的,因为提交中唯一的更改是删除这一个功能。
现在,我已经改变了主意,并决定只是因为我删除它才恢复功能我已经做了一大堆修改。 (我知道这是一种可能性,但我没有保留副本,因为我知道我可以将其从版本控制中删除)。我找到了提交:cb2a6b1
,当我:git show cb2a6b1
时,我可以看到删除的行。问题是我现在如何将这些行应用到我的代码中?
git diff cb2a6b1 cb2a6b1~1
生成一个差异,它会将删除重新设置为添加,但不会git apply
,主要是因为行号已更改。我可以手动将这些东西放回去进行一些手动文本编辑,但是有更自动的替代方法吗?
答案 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.