【发布时间】:2011-03-14 21:23:05
【问题描述】:
我已经对不同的文件进行了多次提交,但到目前为止,我只想将特定的提交推送到我的远程存储库。
这可能吗?
【问题讨论】:
-
git: push a single commit 的可能重复项
-
在这里查看好的技术:stackoverflow.com/a/1789142/1579667
我已经对不同的文件进行了多次提交,但到目前为止,我只想将特定的提交推送到我的远程存储库。
这可能吗?
【问题讨论】:
要推动通过一个给定的提交,你可以这样写:
git push <remotename> <commit SHA>:<remotebranchname>
如果<remotebranchname> 已经存在于遥控器上。 (如果没有,您可以使用git push <remotename> <commit SHA>:refs/heads/<remotebranchname> 自动创建它。)
如果你想推送一个提交而不推送之前的提交,你应该首先使用git rebase -i 重新排序提交。
【讨论】:
git push <remotename> <commit SHA>:<remotebranchname> 有效。诀窍是将它与git rebase -i 结合起来移动你想要的提交作为第一个提交,并指定commit-sha
git push <remotename> <commit SHA>:refs/heads/<new remote branch name> 创建分支。在此之后,按照答案描述推送。
git push origin HEAD~1:master。
-f 标志。
重新排序描述中缺少其他答案。
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
将单个提交推送到我的远程主分支。
参考资料:
另见:
【讨论】:
我建议使用git rebase -i;将您要推送的提交移到您所做的提交的顶部。然后使用git log 获取rebased 提交的SHA,检查出来,然后推送。变基将确保您所有其他提交现在都是您推送的提交的子项,因此未来的推送也可以正常工作。
【讨论】:
git log 步骤?
与所有其他方法相比,Cherry-pick 在推送特定提交时效果最好。
这样做的方法是:
创建一个新分支 -
git branch <new-branch>
使用您的原始分支更新您的新分支 -
git fetch
git rebase
这些操作将确保您拥有与您的来源完全相同的东西。
Cherry-pick你想要推送的sha id -
git cherry-pick <sha id of the commit>
你可以通过运行得到sha id
git log
将其推送到您的原点 -
git push
运行 gitk 以查看一切是否与您想要的一样。
【讨论】:
git rebase -i 将是上述解决方案中建议的理想解决方案。只有在您想要复制提交时才必须使用 Cherry pick。
我相信你必须“git revert”回到那个提交然后推送它。或者您可以cherry-pick 提交到一个新分支,然后将其推送到远程存储库上的分支。比如:
git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}
【讨论】:
cherry-pick你想要的提交。
最简单的方法是使用两个命令。
首先,让本地目录进入你想要的状态。那么,
$ git push origin +HEAD^:someBranch
仅在远程而不是本地从someBranch 中删除最后一次提交。您可以连续执行几次,或更改 +HEAD^ 以反映您希望从远程批量删除的提交数。现在你重新站起来,使用
$ git push origin someBranch
照常更新遥控器。
【讨论】:
您也可以在另一个目录中:
【讨论】:
我确实想忘记一段古老的大历史,并从我选择的新提交开始:
rsync -a --exclude '.git' old-repo/ new-repo/
cd new-repo
git push
当现在旧仓库更改时,我可以将补丁应用到新仓库,以将它们重新定位到新仓库。
【讨论】: