【问题标题】:git: push a single commitgit:推送单个提交
【发布时间】:2010-12-19 19:53:15
【问题描述】:

假设我做了几个提交,并希望挑选出我推送到远程存储库的那些。我该怎么做(在 ascii 中:C1->C2->C3->C4 并且我想推动 C2 和 C4)。使用 rebase 重新排序、重置、推送然后重置是否有效? (C1->C2->C3->C4 => C2->C4->C1->C3 => 重置 C4 => 推 => 重置 C3)。有更好的方法吗?

【问题讨论】:

  • 是的,您可以重写历史记录(或创建具有所需历史记录的单独分支)然后推送。这是唯一的方法。
  • 我也在寻找同样的问题。这个资源可能有用miteshshah.github.io/linux/git/…

标签: git


【解决方案1】:

您可能正在寻找:

git push origin $commit:$branch

信用:http://blog.dennisrobinson.name/push-only-one-commit-with-git/

解释性说明:

  • 推送一个提交会将所有提交推送到它之前(正如 Amber 所说)。这 关键是首先重新排序你的提交(git rebase -i),所以它们是 按照您想要推送它们的顺序。
  • $commit 不必是 sha1。例如, "HEAD~N" 会在最后 N 次提交之前推送所有内容。
  • $branch(通常是“master”或“main”)是您推送的分支——远程分支。它不必与本地分支相同。
  • 推荐分支+cherry-pick方式(midtiby推荐) 也可以工作,但出于重新排序的目的(例如获取 prework 首先),这样可以避免创建一次性分支。

如果远程分支不存在,而您想创建它,则必须以refs/heads/ 为前缀(以消除分支与标签的歧义):

git push origin $commit:refs/heads/$new_branch

专业提示:git-revise 是一个类似但比 git rebase 更好的工具(专门用于本地提交)。出于我的目的,作为一个日常的 git 用户,我认为如果你经常使用 git revise -i 应该是强制性的(这对于产生高质量的提交当然是非常必要的)。

【讨论】:

    【解决方案2】:

    如果您在私有分支上有提交,您可以从私有分支中挑选提交并将它们应用到官方分支。此时,您现在可以将所有提交推送到官方分支(这是您之前挑选的子集)。

    【讨论】:

    • 或者,如果您提交在官方分支上,您可以选择一个临时分支并将其推送到远程官方分支。嗯……对吧?
    • 恕我直言,最简单、最实用的技术。
    【解决方案3】:
    $ git push <remote name> <commit hash>:<remote branch name>
    
    # Example:
    $ git push origin 2dc2b7e393e6b712ef103eaac81050b9693395a4:master
    

    【讨论】:

      【解决方案4】:

      IIRC,由于 git 认为提交工作的方式,C4 固有地包含 C3,因此“推送 C4 但不推送 C3”的概念对 git 没有意义(同样 C2 相对于 C1)。 (见this previous question的答案。)

      【讨论】:

      • 不真实! C4 引用 C3 作为其父级,但另一个答案更正确:您可以从历史中挑选提交并将它们应用于不同的父级。
      • 这不是更像 C4 固有地将其更改应用于 C3 但 C4 的更改是它自己的。
      • C4 上使用git cherry-pick 将其应用到不同的分支不会导致新分支上的C4,而是C4',一个不同(但相似)的提交。如果后来有人合并到带有C4 的分支中,可能会出现问题。
      猜你喜欢
      • 2013-12-17
      • 2015-03-03
      • 2017-02-20
      • 2014-05-06
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多