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

时间:2010-07-12 16:07:14

标签: git commit push

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

这可能吗?

9 个答案:

答案 0 :(得分:942)

要通过向上推送给定的提交,您可以写:

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

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

如果你想在没有推送先前提交的情况下推送提交,你应该首先使用git rebase -i来重新提交提交。

答案 1 :(得分:140)

尝试了建议的解决方案:

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

像这样:

git push origin 712acff81033eddc90bb2b45e1e4cd031fefc50f:master

在我的情况下,master提前5次提交,我只是想推送我的最后一次提交,但上面的内容最终将我的所有更改推送到包括命名提交。在我看来,樱桃挑选方法可能是这个用例的更好方法。

答案 2 :(得分:62)

其他答案缺少重新排序的说明。

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

将推送单个提交,但该提交必须是本地,非推送,提交的OLDEST,不要与top,first或tip提交混淆,在我看来这些都是模棱两可的描述。提交需要最早的提交,即距离您最近的提交最远的提交。如果它不是最早的提交,则将推送从最旧的,本地的,未推送的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/
  3. 另见:

    1. git: Duplicate Commits After Local Rebase Followed by Pull
    2. git: Pushing Single Commits, Reordering with rebase, Duplicate Commits

答案 3 :(得分:25)

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

答案 4 :(得分:20)

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

这样做的方法是:

创建一个新分支 -

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,看看所有内容都与您想要的一样。

答案 5 :(得分:11)

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

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

答案 6 :(得分:1)

最简单的方法是使用两个命令。

首先,使本地目录进入所需状态。然后,

$ git push origin +HEAD^:someBranch

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

$ git push origin someBranch

正常更新遥控器。

答案 7 :(得分:0)

您也可以在另一个目录中

  • git clone [您的存储库]
  • 用您刚才克隆的存储库的.git目录覆盖原始存储库中的.git目录。
  • git add和git提交原始

答案 8 :(得分:0)

我确实想忘记一个古老的历史,并从我选择的新提交开始:

with open('mac.txt', 'w') as mac:
    print(str(os.system('arp -a')

现在对旧仓库进行更改时,我可以将补丁应用于新仓库,以将它们重新构建在新仓库上。