github错误地删除了文件 - 在不同时间撰写的多个分支.如何处理



以下方案详细介绍了远程git repo上错误的文件。如果您滚动浏览下面的提交,那么问题确实出现在COMMIT 4中,而实际上是关于它是否出乎意料/预期的,我想知道是否有一种常见的方法来解决此问题。最好避免在分支中完全避免使用不必要的文件,但是当遇到COMMIT 4中的情况时,但是我的问题是应该做什么?

COMMIT 1 (18 days ago): created on local repo file <code1.java> on branch [code1]
                        and pushed to remote branch [code1] for initial commit 
                        of the file
COMMIT 2 (14 days ago): changed a variable in the file <code1.java> on branch [code1] 
                        and pushed to remote branch and created PR 
COMMIT 3: (7 days ago): created on local repo the file <code2.java> on branch [code2]
                        and pushed to remote branch [code2] for initial commit 
COMMIT 4: (6 days ago): **noticed that on [code2] branch I somehow had checked in 
                        <code1.java> with commit 3** so I deleted the file <code1.java> 
                        from branch [code2] and pushed to remote branch [code2] 
                        and did a PR for [code2]
COMMIT 5: (5 days ago): changed formatting on file <code2.java> on branch [code2] 
COMMIT 6: (4 days ago): PR reviewer accepted changes to <code1.java>
                        and merged branch [code1] to master 
COMMIT 7: (3 days ago): PR reviewer accepted changes to <code2.java>
                        and merged branch [code2] to master 

code1.java现在消失了:( :( :(

(

听起来您是基于code1而不是mastercode2分支。当您这样做时,您包括当时该分支中的所有代码,包括code1.java

当您合并code2时,GIT仅考虑合并三分:合并基础(提交2(和两个头。由于该文件在一侧没有变化(提交6(,并且在另一侧进行了修改(删除(,因此GIT应用了修改并删除了文件。

在这种情况下,code2包含code1.java是可以的,因为它基于包含它的分支:这不是您包含的无关更改。通过删除它,您实际上确实引入了无关的更改(删除(,这与您的意图相反。

最简单的方法避免这种情况时总是要在项目上工作时分支master,这意味着您不会有多余的东西要删除。如果您意外地基于另一个分支,则可以进行git rebase --onto master code1,该分支将使您的分支基于code1并将其放在master上。然后,您可以检查它以查看将来是否需要添加或删除内容。

您可以用

检索它
git checkout <commit4-SHA1>^ -- path/to/code1.java

(请注意卡雷(^(的意思是"此提案的父母"(

然后将其作为新文件检测到git status。只需添加并提交。

如果删除是上述COMMIT 4中唯一的变化,则可以通过git revert <commit4-SHA1>

恢复提交

最新更新