GitHub 错误地删除了文件 - 在不同时间提交了多个分支。怎么处理?

GitHub mistakenly deleted file - multiple branches committed at different times. How to handle?

下面的场景详细说明了远程 git 存储库中错误删除的文件。如果您滚动浏览下面的提交,问题确实出现在 COMMIT 4 中,实际上就它是否是 unexpected/expected 而言,我想知道是否有一种通用的方法来解决这个问题。显然最好避免在分支中完全放置不需要的文件,但是当 运行 出现 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 现在不见了:( :( :(

您可以使用

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

(注意小车(^)的意思是"this commit's parent")

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

如果删除是上述 COMMIT 4 中的唯一更改,您也可以使用 git revert <commit4-SHA1>

恢复提交

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

当您合并 code2 时,Git 只考虑合并的三个点:合并基础(提交 2)和两个头。由于文件一侧未更改(提交 6)而另一侧进行了修改(删除),因此 Git 应用了修改并删除了文件。

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

避免这种情况的最简单方法是在处理项目时始终分支 master,这意味着您不会有多余的东西要删除。如果你不小心基于另一个分支,你可以做 git rebase --onto master code1 这将把你的分支基于 code1 并把它放到 master 上。然后您可以检查它,看看您以后是否需要添加或删除内容。