如何将特定提交推送到远程,而不是以前的提交?

我已经对不同的文件进行了多次提交,但到目前为止,我只想将特定的提交推送到我的远程存储库。

这可能吗?

692086 次浏览

我相信你必须“git恢复”回该提交,然后推送它。或者你可以cherry-pick将提交到一个新分支,并将其推送到远程存储库上的分支。类似于:

git branch onecommitgit checkout onecommitgit cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branchgit push origin {branch}

要推送一直到给定的提交,您可以编写:

git push <remotename> <commit SHA>:<remotebranchname>

如果<remotebranchname>已经存在于远程上。(如果没有,您可以使用git push <remotename> <commit SHA>:refs/heads/<remotebranchname>自动创建它。)

如果你想推送一个提交没有来推送以前的提交,你应该首先使用git rebase -i来重新排序提交。

我建议使用git rebase -i;将你要推送的提交移动到你已经提交的提交的顶部。然后使用git log获取重新基提交的SHA,检查它,然后推送。rebase将确保你所有其他提交现在都是你推送的提交的子提交,所以将来的推送也可以正常工作。

与所有其他方法相比,Cherry-选择在推送特定提交时效果最好。

这样做的方法是:

创建一个新分支-

git branch <new-branch>

用你的原始分支更新你的新分支-

git fetch
git rebase

这些行动将确保你拥有与你的起源完全相同的东西。

樱桃-选择sha id你想做推-

git cherry-pick <sha id of the commit>

您可以通过运行获得sha id

git log

把它推到你的起源-

git push

运行gitk以查看所有内容看起来都与您想要的相同。

其他答案缺乏重新排序的描述。

git push <remotename> <commit SHA>:<remotebranchname>

将推送单个提交,但该提交必须是你本地非推送提交的最旧提交,不要与顶部、第一次或提示提交混淆,在我看来,这些都是模棱两可的描述。提交需要到你最旧的提交,即离你最近的提交最远的。如果它不是最旧的提交,那么从你最旧的本地非推送SHA到指定SHA的所有提交都将被推送。要重新排序提交,请使用:

git rebase -i HEAD~xxx

重新排序提交后,您可以安全地将其推送到远程存储库。

总而言之,我用

git rebase -i HEAD~<number of commits to SHA>git push origin <post-rebase SHA>:master

将单个提交推送到我的远程主分支。

参考文献:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

另见:

  1. git:本地重写后重复提交,然后拉取
  2. git:推送单个提交,使用rebase重新排序,重复提交

您也可以在另一个目录中:

  • git clone[您的存储库]
  • 用您现在刚刚克隆的存储库的. git目录覆盖原始存储库中的. git目录。
  • git添加和git提交你的原创

完成此操作的最简单方法是使用两个命令。

首先,让本地目录进入您想要的状态。然后,

git push origin +HEAD^:someBranch

仅从远程中的someBranch中删除最后一次提交,而不是本地。您可以连续执行几次,或者更改+HEAD^以反映您要从远程批量删除的提交数。现在您重新站起来,并使用

git push origin someBranch

正常更新遥控器。

我只是用

git chury-的选择'shaid的承诺'

然后

git推送

在我的例子中,我的本地分支名称是'master',远程默认分支名称也是'master'。