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
上。然后您可以检查它,看看您以后是否需要添加或删除内容。
下面的场景详细说明了远程 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
上。然后您可以检查它,看看您以后是否需要添加或删除内容。