我如何重新推送先前的提交?
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 时甚至不要这样做。你训练不好的做法,如果你有多个克隆,你可能会为自己破坏事情。要么建立新的分支,要么在不改变历史的情况下纠正你的错误。当提交表明您犯了错误并进行了更改时,这通常是可以的。以上是关于我如何重新推送先前的提交?的主要内容,如果未能解决你的问题,请参考以下文章