我直接推送到开发分支而没有拉请求如何撤消它?

Posted

技术标签:

【中文标题】我直接推送到开发分支而没有拉请求如何撤消它?【英文标题】:I pushed directly to the develop branch without pull request how do I undo it? 【发布时间】:2019-06-29 13:02:59 【问题描述】:

我正在尝试取消 james 推送的所有提交,并在我的本地获取他的提交,然后返回到 Brandon 推送的提交,即

d65fa2faf06a5c4d8d379f963feece2bf2edef98. 

我试过了

git revert a586cc1ff0c5abf535a4d0873c458a812dca28dd..1dcc0e8adc5433a5b092e3b813496ac52de7aa43

-- 但由于一些未知的原因,它抛出了这个错误

    hint: Waiting for your editor to close the file... error: There was a problem with the editor 'vi'.
Please supply the message using either -m or -F option.

最后它只恢复1dcc0e8adc5433a5b092e3b813496ac52de7aa43

这是我的开发分支的 git 日志

commit 1dcc0e8adc5433a5b092e3b813496ac52de7aa43 (origin/develop, feat_SS_250.fixes)
Author: <james@ueharanoMacBook-Pro.local>
Date:   Tue Feb 5 17:50:20 2019 +0900

    schema added

commit fee01a2dcf3432b7da6e9e6b1ff030ad288d919d
Author: <james@ueharanoMacBook-Pro.local>
Date:   Tue Feb 5 17:48:49 2019 +0900

    rebase

commit 7f226d84029e608721417b8e99be1a88c6ae3a84
Author: <james@ueharanoMacBook-Pro.local>
Date:   Tue Feb 5 16:03:07 2019 +0900

    initial commit

commit a586cc1ff0c5abf535a4d0873c458a812dca28dd
Author: <james@ueharanoMacBook-Pro.local>
Date:   Thu Jan 24 11:42:08 2019 +0900

    added login.php

commit d65fa2faf06a5c4d8d379f963feece2bf2edef98
Author: brandon <brandon@xxxx.co.jp>
Date:   Tue Feb 5 14:52:04 2019 +0900

    feat: fp 50

commit 9988b6587f9e2fa77d86e9e1f856bf57e667daca
Author: brandon <brandon@xxxx.co.jp>
Date:   Tue Feb 5 14:25:51 2019 +0900

    feat: contract 50

【问题讨论】:

HEAD 倒回到提交d65fa2faf06a5c4d8d379f963feece2bf2edef98force push'ing origin develop 回到那个状态是一个选项吗? 您的工作流程中是否提供重写历史记录?如果是这样,git reset --hard d65fa2f 然后用-f 推送它。再说一次,由于您的具体情况,它可能不在桌面上。 @RomainValeri 呵呵,以秒为单位。正是我的想法。 现在是半夜,所以我的 push 现在是最新的提交,所以我认为我可以安全地回到 Brandons 的最后一次提交。 【参考方案1】:

你可以...

git reset --hard d65fa2f
git push -f origin develop

注意:建议您在force 推送任何更改之前备份您的遥控器。此外,如果有人拉出了包含 James 更改的分支,他们下次尝试 pull 分支时可能会收到错误。

【讨论】:

我的更改是否仍会转到本地? @Johji 我在git log 中看不到您的任何更改。答案将force 重置origin develop 为布兰登的提交(覆盖log)。您可以在当前工作目录之外的临时目录中执行此操作(即cd /tmp/foogit init .git remote add origin ...git checkout -b developgit pull origin developgit reset --hard d65fa2fgit push -f origin develop)。这样您就可以确定它不会触及您当前本地工作目录中的任何内容。 我的更改是从 a586cc1ff0c5abf535a4d0873c458a812dca28dd 到 1dcc0e8adc5433a5b092e3b813496ac52de7aa43。我通过执行 git reset --hard d65fa2f 然后 git diff 1dcc0e8adc5433a5b092e3b813496ac52de7aa43 得到我的更改,它获取我的提交并将其放入文件。【参考方案2】:

就我而言,可能我会这样做:

(01) 重置最后提交的数量并保持提交为分阶段:

$ git reset --soft HEAD~<num_of_commit_from_HEAD>
$ git status
$ git log
$ git push -f origin <branch_name>

在这里,你的情况是 num_of_commit_from_HEAD = 4branch_name = develop

(02) 重置最后提交的数量并删除提交:

$ git reset --hard HEAD~<num_of_commit_from_HEAD>
$ git status
$ git log
$ git push -f origin <branch_name>

在这里,你的情况是 num_of_commit_from_HEAD = 4branch_name = develop

【讨论】:

以上是关于我直接推送到开发分支而没有拉请求如何撤消它?的主要内容,如果未能解决你的问题,请参考以下文章

VSTS - 防止推送到 master 但允许 PR 合并

从一个分支拉取所有提交,将指定的提交推送到另一个

从一个分支拉取所有提交,将指定的提交推送到另一个

如何撤消 git flow 功能完成?

git推送本地分支到远程分支

在功能分支上测试时如何使用 Git 拉取请求