【问题标题】:Git Revert On Remote远程 Git 还原
【发布时间】:2017-01-07 10:47:06
【问题描述】:

我是 Git 新手,使用 WebStorm 推送和拉取我的代码。我们正在做一个共同的项目。深夜我的朋友更新了一些代码并推送了更改。

今天我提取了代码并合并了更改,但我错误地保留了我的更改并丢弃了拉取请求提供的更改。然后将这些更改推送到 git remote..

所以基本上现在我想要的是:

  1. 在本地恢复到以前的状态,即拉取请求之前的状态,并且在远程我想要与昨晚相同的状态,即推送请求之前的状态。

所以,这就是我想做的:

  1. 远程恢复到以前的版本。
  2. 再次拉码。
  3. 进行合并。
  4. 推送新代码。

所以现在我在 Remote 上:

  • 我的朋友代码版本提交,
  • 然后我的错误版本提交不包括合并之前的代码提交,
  • 如果我遵循以下在本地还原然后推送的答案,那么我将提交新的还原代码版本。但最后我想要远程 1 + 3。

让我们从数学上看一下

  • X= 我打开计算机并更改代码和
    的本地状态 承诺。
  • Y= 我的朋友昨晚在他的本地计算机上进行更改并推送到远程的远程状态。
  • Z= 远程状态,当我拉出我的朋友代码并开始合并但犯了一些错误并丢弃了我朋友的更改,然后提交并将基本上是状态 x 的代码推送到远程时。

所以,基本上

  • 在我的本地我有 Z 州。
  • 在遥控器上我有状态 Z
  • 在我的朋友当地 Y 州。

我想要远程 X + Y。

【问题讨论】:

  • 您不能“推送未合并的代码”。只能推送已提交的代码。从你的问题中不清楚到底发生了什么。如果不知道不需要的 git 命令的确切顺序,也不知道您希望如何解决问题,就不可能给出权威的答案。
  • 清理这些乱七八糟的东西(尤其是在其他人不使用的 repo 上)基本上是清理本地分支。您可以重置为旧版本并挑选您想要保留的更改。一旦你的分支看起来不错,你的力量就会推动。这将修改历史,但它也会清理你的耻辱痕迹。如果有人(构建服务器)签出此分支,您可能会擦除/清除工作区并重新开始。
  • @SamVarshavchik 嗨,山姆,我想我犯了一些错误,在合并阶段我只保留了我的代码,因此它推送了我完成的合并代码,其中不包括拉取的代码更改。
  • 这仍然是一个模糊的描述,缺乏任何细节。如果没有看到所有执行命令的具体日志,只能给出一个模糊的答案:撤消本地分支中的所有更改,然后将其推送到远程,如有必要,使用--force。就是这样。
  • @SamVarshavchik 嗨,山姆的问题现在很清楚了。

标签: git


【解决方案1】:

如果你想恢复一个提交,你可以使用这个命令:

git revert commit id goes here

例子:

git revert aa12bb34

revert 就是这样做的:

还原一个提交意味着创建一个新的提交来撤消所有 在错误提交中所做的更改。就像上面一样,坏的 提交仍然存在,但它不再影响当前的主人 以及任何未来的提交。

【讨论】:

  • 但是这个命令只会改变本地权限。由于我正在使用的代码是共享空间,我想在远程恢复,以便每个人都能看到以前的版本。
  • @ArjunChaudhary 这应该适用于远程,而不仅仅是本地。
  • 我认为如果您需要在遥控器上使用它,那么在“还原”之后,您需要使用 git push 将新的提交集推送到遥控器。由于还原提交只是原始提交的反向,因此您可能不必强制推送。
  • @mrrogers 但那将再次覆盖远程权限。我必须再次与之前的 git 代码合并
  • 是的,您将继续前进。这不是你想做的吗?我建议这样做。
【解决方案2】:

根据您的部分描述,您似乎不太可能使用任何“危险”选项,并且您只是添加了一个错误的提交并将其推送到远程。

假设远程仓库是“origin”,而有问题的分支是“master”:

git log origin/master

这应该会为您提供远程提交的日志。您应该会看到错误的合并,然后是远程分支上的先前提交。

在您开始尝试修复此问题之前,请分叉一个新分支,作为标记您当前提示的一种方式,作为保险单。如果你搞砸了,你可以很容易地在提示上返回你的提交:

git checkout -b master-before-i-tried-to-fix-this-mess

现在,在合并之前获取提交哈希,首先,进行非破坏性检查:

git checkout <hash>

&lt;hash&gt; 是错误合并之前前一次提交的哈希值。

现在查看您的目录。在它搞砸之前说服自己这是远程分支的尖端。

然后,返回本地分支:

git checkout master

现在,将你的 master 分支强制重置为良好的提交:

git reset --hard <hash>

现在,您应该回到执行合并之前的状态。现在尝试再次合并:

git merge whatever-you-tried-to-merge

一旦你确信你正确地合并了所有东西:

git push --force

你真的需要确保你推送的是一个好的远程分支,如果其他人已经签出了远程存储库,你需要告诉他们你做了什么。

可以将您的固定远程作为普通提交推送,但这需要更多的工作,实际上是一个更危险的过程。你只需要接受你的肿块,并将其用作学习经验。

如果你发现你又搞砸了,你需要删除你本地的 master 分支,并使用你的保险单重新创建它:

git checkout master-before-i-tried-to-fix-this-mess
git branch -D master
git checkout -b master

然后再试一次。

【讨论】:

  • 现在,您应该回到执行合并之前的状态。现在尝试再次进行合并: git merge 不管你尝试过的合并;在此之前我不必拉前面的代码,只有我可以合并。
  • 我的意思是 git reset --hard 这个命令只会在本地恢复到之前的提交。现在要与昨晚的代码合并,我也必须在遥控器上恢复。这样当我再次拉动时,我可以合并两个代码。
  • 在远程恢复的唯一方法是从本地分支推送修复。 git 中没有“远程还原”。如果你不使用特性分支,而你只是在 master 上提交你的更改,牛仔风格,并且只是为了合并而拉取,那么你就是在自找麻烦。您应该使用功能分支,然后将其合并回主分支。这样可以更轻松地修复此类错误。现在,您唯一的选择是查看您的 reflog,尝试获取您以前的工作的点点滴滴,提交它,然后再次推送它。
  • 或者,或者,您可以在拉取之前执行 reset --hard 回到本地分支上的最后一次提交以进行合并,然后再次拉取,这次正确地进行合并。
  • 是的,我想做 OR 版本,但是当你再次提取我提交和上传的代码时,它与恢复相同。是的,我从现在开始吸取教训,我将在功能分支上工作。
猜你喜欢
  • 2015-06-12
  • 2017-08-07
  • 2011-03-13
  • 2012-12-05
  • 2021-08-12
  • 2011-12-19
  • 2014-02-07
  • 2022-12-01
  • 1970-01-01
相关资源
最近更新 更多