如何恢复已在master中删除且没有修改或推送到master的权限的文件?

wgxvkvu9  于 2022-10-23  发布在  Git
关注(0)|答案(2)|浏览(176)

1.运行git log,显示如下

commit on master( in my case, it is develop branch) a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

1.由于我无法将主分支还原或重置为某个提交,因此从旧提交创建了一个新分支,其中包含通过运行以下命令删除的分支
git checkout-b“branch_name”0d1d7fc32e5a947fbd92ee598033d85bfc445a50
使用2010年11月3日的git哈希创建了一个新分支(此提交包含xyz.java文件,该文件在master(develop)分支的最新提交中不存在)
1.在这个新分支(在上面的步骤2中创建)中没有任何其他更改要做。创建这个新分支的目的是恢复xyz。java文件,已在master中删除。将此新分支推到远程。
Git不允许我为这个新分支创建PR,因为它显示了一个错误,即这个新分支不包含任何更改,而这些更改还没有包含在develop中。
若我通过运行以下命令用master(在我的例子中是develop)重新设置我的新分支,它将删除xyz。我的新分支的java文件。

git pull origin develop

你怎么得到xyz。我的新分支中的java文件,它允许git识别这个包含xyz的新分支。java文件,在master分支中已被删除?

eoigrqb6

eoigrqb61#

TL;博士

您需要从一个分支创建PR,该分支从master的最新状态开始,并将文件添加回,而不是从旧分支。

我的解决方案

您没有推送到master的权限,这并不意味着您不能向master添加提交。这仅仅意味着你必须使用公关来做到这一点。
应遵循的步骤:

  • 从最新状态的master创建一个新分支。
  • 在该分支上添加并提交文件(例如,使用@Ivan的答案,或在删除文件的提交上使用git revert)。
  • 把那根树枝推到遥控器上。
  • 提交一份请购单,一旦批准并合并,就会将文件重新添加到master中。

master上设置推送保护的目的不是阻止您将提交添加到master上,而是强制您通过PR执行,通常是为了在合并之前对其进行审查。

为什么你的方法无效

在您在问题中描述的尝试中,您从旧分支开始,而不是从master的最新版本开始。问题是,主分支继续有一个删除该文件的提交,因此再次合并旧分支时,Git继续(正确地)说,好吧,我将一个分支与该文件合并为一个分支,该分支表示删除该文件,因此该文件应保持删除状态。
相反,重新添加的新分支在合并到main中时会重新添加,因为您要合并一个没有它的分支和一个添加它的分支。

46qrfjad

46qrfjad2#

在删除此文件之前查找最后一次提交。记住哈希。然后将此文件 checkout 到当前分支。

git checkout <hash> -- <full/path/to/the/file>

例如:

git checkout 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 -- xyz.java

然后做出承诺。

相关问题