【问题标题】:Should we put the commit higher or lower while rebasing if we want to push only it?如果我们只想推送它,我们应该在 rebase 时将提交提高还是降低?
【发布时间】:2018-06-03 23:26:18
【问题描述】:

我已经拉出了 master 分支。在本地大师中,我做了几次提交。现在我只想推送最后一次提交(而不是之前的提交)。我如何做到这一点?

我找到了一个很好的解释:How to push only one commit with Git。所以,命令应该是这样的:

git push origin 2dc2b7e393e6b712ef103eaac81050b9693395a4:master

或者,以更“抽象”的形式:

git push <remote name> <commit hash>:<remote branch name>

但是,据我了解,在一般情况下,它不会推送单个提交(由其哈希给出)。相反,它将推送指定的提交以及在指定提交之前完成的所有提交。

因此,为了实现目标(仅推送一个提交),我们首先需要对提交进行重新排序,以便我们想要推送的提交被视为最旧的提交(提交序列中的第一个)。如何做到这一点在这里描述:How to reorder commits with Git。这个描述很清楚,唯一让我困惑的是这句话:

就我而言,我想将我最重要的提交带到我修复了 项目文件到底部,这样我就可以只推那个 提交到远程服务器。

但我们不是想做一种相反的事情吗?如果我们将提交“降到最低”,它将被视为最后一次(最近的)提交,如果我们在推送时使用它的哈希,我们将推送它之前的所有内容(这意味着“所有提交”) .

所以,我们想要做的是将我们的提交放在我们执行git rebase -i HEAD~5 时看到的文件中更高的位置。我说的对吗?

【问题讨论】:

    标签: git git-rebase git-push


    【解决方案1】:

    如果您只想将一个提交 cfoo 推送到分支 bbar,这里有一个简单的解决方案:

    git fetch origin bbar
    git checkout FETCH_HEAD
    git cherry-pick cfoo
    git push origin HEAD:bbar
    

    在实际情况下,您可能需要运行 git stash 或执行其他操作来备份解决方法。

    至于“higher”,是的,在git rebase -i之后弹出的文本编辑器中,第一行是最旧的commit。如果您只想推送一个提交,请将其放在第一行。

    【讨论】:

    • 但是如果我不从我推送到的存储库中拉取呢?
    • @Roman 没关系。您可以在运行git pushgit pull(包括git fetch)时动态指定远程仓库的url。 git push &lt;urlA&gt; HEAD:&lt;branchA&gt;git pull &lt;urlB&gt; &lt;branchB&gt;,其中branchAbranchB 可以具有相同的名称。如果urlAurlB 不变,您可以将它们添加为一个或两个遥控器。一个遥控器有两个值,一个用于推送,另一个用于获取。
    • @Roman 如果您不介意本地分支的历史记录被git rebase -i 更改,那么您的方法是可以的。
    • 是的,我不介意历史被改变了。我唯一的问题是我不知道将我的提交(我想要推送的那个)放在提交列表中的哪个位置。我认为它应该放得更高,但在我链接的文章中说我需要把它放在按钮上。所以,我很困惑。
    • @Roman by "higher" 如果你的意思是“靠近分支的尖端”,它应该尽可能远离远程分支包含其父提交的尖端。正如你所提到的,当你推送一个提交时,它的所有祖先也将被推送。如果远程分支已经拥有它的所有祖先,那么它就是唯一将被推送的分支。
    猜你喜欢
    • 2011-08-14
    • 2017-04-29
    • 1970-01-01
    • 2017-10-05
    • 2015-03-12
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多