【问题标题】:git cherry-pick to another branchgit cherry-pick 到另一个分支
【发布时间】:2012-12-02 11:13:38
【问题描述】:

我想知道是否有办法将一个提交复制到另一个分支而不检查该分支。

例如,我有两个分支:masterparallel_version

我在 parallel_version 分支上,我在这些分支的通用文件中发现了一个错误。

我已修复并承诺。假设我使用的是 git-svn,如何将此提交复制到另一个分支?

通常我会这样做:

$ git checkout master
$ git cherry-pick parallel_version
$ git checkout parallel_version

有没有更好的方法?

【问题讨论】:

    标签: git branch cherry-pick


    【解决方案1】:

    这是不可能的 - 想象一下如果发生无法自动解决的冲突会发生什么。出于同样的原因,您也无法更新当前未签出的分支(即使可以进行快进)。

    【讨论】:

    • 你可以更新其他分支:git fetch origin & git branch mybranch origin/mybranch -f
    • @mnaoumov 更简单:git fetch <remote> <branch>:<branch>
    • “在当前实现中不可能”,是的。 “不值得麻烦正确实施”-也许。但是一个潜在的无法解决的冲突并不是一个很好的论据:在这种情况下,樱桃挑选应该失败而不改变工作目录或回购状态。
    • “出于同样的原因,您也无法更新当前未签出的分支(即使可以进行快进)。”这句话是假的:stackoverflow.com/a/17722977/86845
    【解决方案2】:

    https://github.com/lennartcl/gitl 提供“git cherry-copy”和“git cherry-move”脚本来执行此操作并处理大多数极端情况。

    【讨论】:

    • 看起来“git cherry-copy”只是自动化了 OP 概述的 3 个手动步骤。因此,它与@ThiefMaster 并不矛盾。我希望在编译当前分支时 将提交复制到分支。那并不顺利……
    【解决方案3】:

    疯狂的想法(基于 mnaoumov 的评论)如果你真的想避免接触签出的文件(说你不想打扰你的构建系统)......这就是我想要的.

    1. 将整个 git 存储库克隆到一个临时目录。
    2. 在克隆中完成工作。
    3. 将克隆添加为远程。
    4. git fetch clone && git branch mybranch clone/mybranch -f
    5. 清理干净。

    这将是一件自动化的事情。如果你有文件系统快照,那么克隆整个 repo 很便宜——毕竟也许没那么疯狂……

    【讨论】:

    • 在这种情况下,最好使用git worktree 而不是克隆。它不会复制整个.git
    • 这实际上是一个很好的技巧。对于小型项目来说,低效率应该无关紧要。
    • 您可以将 from 克隆推送到它的原点,而不是将 tmp 克隆添加为远程 - FFD 推送到远程上未签出的分支毕竟没问题。
    【解决方案4】:

    这是一个创建存储库临时克隆的小脚本,如suggested by user2394284

    /usr/bin/git-tmp-clone~/bin/git-tmp-clone

    #!/bin/bash
    
    gitTopLevel=$(git rev-parse --show-toplevel)
    
    # Unique name for the temporary clone.
    totalhash=$(tar -c "$gitTopLevel/.git" 2> /dev/null | sha256sum | head -c8)
    
    tmprepo="/tmp/$(basename $(pwd))_${totalhash}"
    
    git clone "$gitTopLevel" ${tmprepo}
    
    # Start an interactive shell in the clone. Pass any
    # arguments as initial commands to be executed.
    /bin/bash --init-file <(echo "cd ${tmprepo}; $@")
    
    # Clean up the clone.
    rm -rf ${tmprepo} && echo "Deleted ${tmprepo}"
    

    (这个脚本不够健壮,但在 Ubuntu 上似乎对我有用。)

    您可以使用它来挑选例如当前分支上的最后一次提交到另一个分支,通过运行

    git-tmp-clone "git checkout TARGET_BRANCH
                && git cherry-pick $(git rev-parse --short @)
                && git push origin HEAD"
    

    (请注意,在此示例中,rev-parse 在创建克隆之前在 origin 存储库中进行评估!这就是它指向最近提交的原因。根据需要进行调整。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多