Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在git中还原以前删除的代码(不一定是单个或整个文件)_Git_Dvcs - Fatal编程技术网

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

在git中还原以前删除的代码(不一定是单个或整个文件),git,dvcs,Git,Dvcs,不久前,我从代码中删除了一个a类功能,并承诺进行删除。该特性被实现为一个具有BDD样式规范的单个类,其他几个类在使用该特性时在删除提交中被修改。提交是干净的,因为提交中唯一的变化就是删除了这一特性 现在,我改变了主意,决定只在删除该功能后才重新使用它。我做了一系列的更改。(我知道这是可能的,但我没有保留副本,因为我知道我可以将其从版本控制中拉出)。我找到了commit:cb2a6b1,当我:git show cb2a6b1时,我可以看到删除的行。问题是我现在如何将这些行应用到我的代码中 git

不久前,我从代码中删除了一个a类功能,并承诺进行删除。该特性被实现为一个具有BDD样式规范的单个类,其他几个类在使用该特性时在删除提交中被修改。提交是干净的,因为提交中唯一的变化就是删除了这一特性

现在,我改变了主意,决定只在删除该功能后才重新使用它。我做了一系列的更改。(我知道这是可能的,但我没有保留副本,因为我知道我可以将其从版本控制中拉出)。我找到了commit:
cb2a6b1
,当我:
git show cb2a6b1
时,我可以看到删除的行。问题是我现在如何将这些行应用到我的代码中


git diff cb2a6b1 cb2a6b1~1
生成一个diff,该diff将删除重新定义为一个加法,但它不会
git apply
,主要是因为行号已更改。我可以通过一些手动文本编辑手动将内容放回,但是有没有更自动的替代方法?

试试
git revert cb2a6b1


如果它不能自动找出正确的操作,那么它应该向您提供可以手动修复的合并冲突。

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

假设您有一个只包含自述文件的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'
现在,我们的自述文件和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
$ cat README
This is line alpha.
Line Beta.
Line Gamma.
Line Delta.
Line Epsilon.
现在我们决定,我们不应该删除测试线<代码>git rebase救命!无论何时我做任何重定基址,我都喜欢使用临时分支,因为我正在更改历史记录

$ git checkout -b fixingthings
现在,我们想重新确定自最初提交以来发生的一切。查看日志,这是commit
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 Gamma.
Line Delta.
Line Epsilon.
$ git log --pretty=oneline
56ae2db58905607270434045b2a7218237d3716e added epsilon
058ec4b92fb279370f6e5b81c4aebb6250f93c6b added delta
19801b380956b60f36b4922796ea86935a75e569 removed beta
bc9057cebf05352eb5596eaf753708a14de589d2 initial commit
$ 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< /Cord>确实认为每个提交都是一个补丁,并按顺序(或不按您所说的那样)重放它们。这意味着您可能存在合并冲突。如果这种情况发生在您身上,rebase将暂停并让您解决冲突。有很多关于在这种情况下该怎么做的教程