我已将Java应用程序推送到一个bitbucket存储库,其中包括几个空包。从master分支创建了两个开发分支,并将某些类添加到了不同的包中。当我尝试合并本地开发分支中的另一个分支时,没有冲突出现,但是我的包被删除了。我可以在错误日志中看到我的提交,甚至可以通过Verion Control窗口在IntelliJ中打开我的类,但是它们被合并提交删除。
如何恢复我的更改?我不能选择提交,因为它已经包含在分支中。 Git重置也不起作用。如果没有其他事情要做,我可以重新创建相同的类并逐个复制更改,但是必须有更好的解决方案。
答案 0 :(得分:-1)
发生这种情况是因为有人(大概不是您)删除了代码。
请记住,合并并不意味着使它们相同。您告诉Git:
git checkout somebranch
git merge anotherbranch
这并不意味着在somebranch
中进行一次新提交,使其与anotherbranch
中的最后一次提交完全匹配。而是告诉Git:
在somebranch
的提示处 或之前找到一些提交,也在anotherbranch
的提示处 之前。任一提示之前的提交都必须在两个分支上,并且应该是最佳共同祖先。 Git将此提交称为合并基础。
现在我们知道,也许是制造somebranch
的人(也许是我们)始于commit B (以base为基础),而制造anotherbranch
的人(也许是我们改为 从提交 B 开始,将提交 B 与somebranch
的尖端进行比较,以查看我们/他们所做的更改。然后,将 B 与anotherbranch
的尖端进行比较,以了解它们/我们所做的更改。
现在,合并合并这两组更改。为了使合并决定应该{em>删除文件somedir/somepackage.java
,从 B 到一个提示的更改必须是:什么都不做< / em>。从 B 到另一个提示的更改必须是:删除文件somedir/somepackage.java
。这两个更改的组合很明显:删除文件!
因此,正确的合并结果-表示删除文件的somebranch
的人S所做的更改与{{1 }}谁也没说什么,就是删除文件,而Git做到了。 (或者,如果我交换了两个分支,没关系:这仍然是自动正确的结果。即使通过您比Git聪明的人工评估,这对Git也是正确的。)
在合并之前的两次提交之一以及在基于合并的提交中,文件仍是完整完整的完整文件。 (显然,另一个中不存在。)只需从具有它的任何提交中将其提取。这些提交仍然存在,并且永远将所有文件保持在提交状态:这就是为什么要使用版本控制系统来保存每个人所做的一切的原因。
要从提交 H (其中anotherbranch
是一些提交哈希,例如H
)中获取路径为 P 的文件,请运行:< / p>
a123456
例如git checkout H -- P
。这将提取提交中的副本,并将其放入索引(准备下一次提交)和工作树(准备查看中)。