我如何重新推送先前的提交?

Posted

技术标签:

【中文标题】我如何重新推送先前的提交?【英文标题】:how do I re push a prior commit? 【发布时间】:2019-07-07 00:15:09 【问题描述】:

我目前的情况是,我的一些最新提交覆盖了旧提交的内容。

我正在使用工具 git 扩展,从 GUI 界面,我可以签出某个修订 - 提交。

所以我检查了修订版,并且可以在本地看到文件存在 - 但似乎没有任何要提交的内容?我猜哪个有道理?

如何重新推送之前的提交?

【问题讨论】:

我会小心重置,正如@YesThatIsMyName 所建议的那样,因为(硬)重置具有潜在的破坏性。相反,this answer 中有解决您问题的方法:git show COMMIT_ID | git apply 你所说的“覆盖”是什么确切,你的意思是更改已被还原,还是你的意思是有人从历史记录中删除了提交?跨度> 不要使用重置,直到你知道后果。该命令是针对大多数奇怪情况的提示,并且通常会导致比以前更多的问题。 【参考方案1】:

您是否尝试挑选最上面的提交? git 樱桃挑选

【讨论】:

【参考方案2】:

假设我们有一个场景,我们之前的提交日志是这样的

git status
commit-1 [ bad commit ]
commit-2 [ bad commit ]
commit-3 [ bad commit ]
commit-4 [ good commit ]
commit-5 [ good commit ]

现在我们可能想要两件事。

第一个案例

我们可能想要删除所有错误的 git 提交,并希望进入最后一个良好的提交阶段。像下面这样说

git status
commit-4 [ good commit ]
commit-5 [ good commit ]

我们可以像这样休息前三个提交来做到这一点

git reset --hard HEAD~3 
# for n number of last commit reset 
git reset --hard HEAD~n

我必须提到这是撤消您的工作的非常困难的方法。当你完全确定你为什么喜欢这样做时,请这样做。

第二种情况

你可能想把你的 commit-4 放在最前面

git status
commit-4 [ good commit ]
commit-1 [ bad commit ]
commit-2 [ bad commit ]
commit-3 [ bad commit ]
commit-4 [ good commit ]
commit-5 [ good commit ]

你可以这样做

git cherry-pick -n <commit-4 sha1>

这些会将 commit-4 放在那些错误提交的顶部。

【讨论】:

【参考方案3】:

我建议两种方法之一。

还原

如果你的新提交没有贡献任何有用的东西。它只是取消了您在之前的提交中使用 git-revert 所做的事情。它将创建一个新的提交,该提交取消执行恢复的提交所做的任何事情。

在 git 命令行中,您使用

标识错误提交
git log

保留其 ID(例如 12345abcd)。然后恢复那个提交

git revert 12345abcd

樱桃采摘

如果您的新提交除了破坏旧提交之外还做了一些好事,您可能会挑选您喜欢的旧提交。它将应用与先前提交相同的代码更改。但是,它将成为一个新的提交。这使您的分支与旧拉保持一致。

首先使用git log 确定您想再次申请的提交,然后 保留ID(例如fedc9876)

git cherry-pick fedc9876

如果您想更好地控制樱桃选择,请使用 -n 标志来防止立即提交

git cherry-pick -n fedc9876

你提到你使用了一个 git 工具。 git 命令可能会帮助您找到如何将其用于此目的。

【讨论】:

【参考方案4】:

所以我最终创建了一个新分支并将我的文件移到那里, 后来我遇到了类似的问题,我注意到本地分支和远程分支的命名方式并不相同。

我执行了一个 git push -f,因为我想和我们的主人一起变基, 但是本地分支名称与远程分支名称不同,这意味着创建了一个远程分支并且该分支包含新的提交。

似乎 gitExtension 默认使用大写开头字母创建本地分支 - 当我创建远程分支时并非总是如此。

【讨论】:

当你重新建立一个分支时,请不要push -f。如果分支只是本地的,则可以重新设置基准。但是一旦你从origin 得到一个分支,重新设置它,然后再次强制它回来,你就破坏了其他人的提交历史。单独使用 origin 时甚至不要这样做。你训练不好的做法,如果你有多个克隆,你可能会为自己破坏事情。要么建立新的分支,要么在不改变历史的情况下纠正你的错误。当提交表明您犯了错误并进行了更改时,这通常是可以的。

以上是关于我如何重新推送先前的提交?的主要内容,如果未能解决你的问题,请参考以下文章

如何重新创作 Git 存储库中的所有提交? [复制]

如何将项目恢复到android studio中的先前提交

如何使用函数重新评估 Python 中先前评估的变量?

带有 Back4App 的 ios 推送通知证书

git推送提示the-remote-end-hung-up-unexpectedly错误

RestKit:重新认证后如何重新提交失败的请求?