git cherry-pick到另一个分支

时间:2012-12-14 12:40:10

标签: git branch cherry-pick

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

例如,我有两个分支:masterparallel_version

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

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

通常我会这样做:

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

有更好的方法吗?

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

疯狂的想法(基于 mnaoumov 评论)如果你真的想避免触及已检出的文件(比如说你不想打扰你的构建系统)......无论如何,这就是我想要的。

  1. 将整个git repo克隆到临时目录。
  2. 在克隆中完成工作。
  3. 将克隆添加为遥控器。
  4. git fetch clone && git branch mybranch clone/mybranch -f
  5. 清理。
  6. 这将是一个自动化的事情。如果你有文件系统快照,克隆整个仓库很便宜 - 毕竟可能不那么疯狂......

答案 3 :(得分:1)

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

/ usr / bin / git-tmp-clone 〜/ bin / git-tmp-clone

#!/bin/bash

# Unique name for the temporary clone.
totalhash=$(tar -c $(git rev-parse --show-toplevel)/.git | sha256sum | head -c8)

tmprepo="/tmp/$(basename $(pwd))_${totalhash}"

git clone . ${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"

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

相关问题