如何将特定的提交推送到远程仓库,而不是之前的提交?
推送特定提交到远程仓库的问题是由于需要将特定的提交推送到远程仓库而产生的。解决方法是使用cherry-pick命令。具体步骤如下:
1. 创建一个新的分支:
git branch
2. 更新新分支与原始分支的内容:
git fetch git rebase
这些操作将确保你的新分支与原始分支的内容完全相同。
3. 使用cherry-pick命令选择要推送的提交:
git cherry-pick
可以通过运行`git log`命令获取提交的sha id。
4. 将提交推送到远程仓库:
git push
5. 运行`gitk`命令查看是否符合预期。
使用`git rebase -i`命令也是解决该问题的理想方法,cherry-pick命令仅在需要复制提交时使用。
如何将特定的提交推送到远程,而不是之前的提交?
有一些答案在重新排序方面描述不足。
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
将单个提交推送到我的远程主分支。
参考资料:
- http://blog.dennisrobinson.name/push-only-one-commit-with-git/
- http://blog.dennisrobinson.name/reorder-commits-with-git/
另请参阅:
- git: Duplicate Commits After Local Rebase Followed by Pull
- git: Pushing Single Commits, Reordering with rebase, Duplicate Commits
某些源可能不允许这样做。例如,在GitLab中,我看到“您无权将代码强制推送到此项目的受保护分支。”这有点奇怪,因为我没有认为我在强制任何操作,只是进行了正常的推送。有什么办法可以在不“强制”操作的情况下进行吗?
不应该有必要进行强制推送。听起来你的特定git设置有问题。也许你在重定基时超过了远程HEAD提交?我不知道什么是受保护的分支,听起来像是权限问题。
Samuel - 这样说起来很有道理,但是git rebase -i只会显示晚于远程HEAD的本地提交,所以我不知道我怎么可能会这样做。
Samuel - 的确,我现在可以进行部分推送,所以我不知道出了什么问题,但肯定是试图推送一个与远程HEAD不相关的提交的方式出了问题。
你说“git rebase -i只会显示晚于远程HEAD的本地提交”,我不认为这是正确的。我进行了测试,并成功地将重定基超过了远程HEAD。
当你运行'git rebase -i'时,它只会显示一组特定的提交:“与git log <upstream>..HEAD
显示的提交集合相同”,根据文档。我原以为这意味着您对这些提交所做的任何更改都不会超过上游HEAD,但我猜这可能比我想的更微妙。
它是最后一次获取的上游HEAD,而不是当前状态(如果它在上次获取之后更新)会被rebase -i考虑到。
如何将特定的提交推送到远程,而不是之前的提交?
有时候我们想要将特定的提交推送到远程仓库,而不是之前的所有提交。这种情况下,我们可以使用以下命令:
git push <远程仓库名称> <提交的SHA>:<远程分支名称>
前提是<远程分支名称>在远程仓库中已经存在。(如果不存在,我们可以使用git push <远程仓库名称> <提交的SHA>:refs/heads/<远程分支名称>
来自动创建远程分支。)
如果想要推送一个提交,而不推送之前的提交,我们首先需要使用git rebase -i
命令来重新排序提交。
git push <远程仓库名称> <提交的SHA>:<远程分支名称>
命令可以实现我们的目标。关键是将其与git rebase -i
命令结合使用,将需要的提交移动到第一个提交位置,并指定该提交的SHA。
需要注意的是,如果远程分支尚不存在,则上述方法会失败。我们可以使用git push <远程仓库名称> <提交的SHA>:refs/heads/<新的远程分支名称>
来创建远程分支。之后,按照上述答案描述的步骤进行推送。
例如,要推送除最后一个提交以外的所有提交,可以使用以下命令:git push origin HEAD~1:master
。
还要注意,如果已经将后续的SHA提交推送到远程分支,那么需要使用强制推送(force push)。可以使用-f
标志进行强制推送。
问,如果我们不指定heads
,例如:refs/<分支名称>,会发生什么?另外,还有人建议在git rebase -i
之前使用git tag <标签名称>
创建标签,并在完成后使用git tag -d <标签名称>
进行清理。
还有人好奇为什么git push <远程仓库名称> <提交的SHA>
不像git push
那样默认推送到当前分支?
尽管这些回答可能并没有完全回答问题,但对于我想要做的事情(例如回滚Heroku上的更改)非常有用。
有人觉得这样一个简单的事情,需要使用如此复杂的命令。在Mercurial中,只需使用hg push -r
即可。
我们还可以使用git log origin/master..master
命令来检查尚未推送到远程仓库的所有提交的SHA。
希望以上这些回答能帮助更多人,如果提供一个示例将会更加有帮助。
如果不想输入<远程分支名称>
,而是要推送到当前跟踪分支,那么应该是可以自动推断的。
对于英语为母语的人来说,这个答案中的"up through"的意思是"up to and including"。