29

我想知道是否有办法在不签出该分支的情况下将一个提交复制到另一个分支。

例如,我有两个分支:masterparallel_version.

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

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

通常我会这样做:

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

有更好的方法吗?

4

4 回答 4

10

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

于 2012-12-14T12:43:26.897 回答
5

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

于 2015-09-16T04:33:25.983 回答
1

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

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

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

于 2018-03-07T13:47:38.067 回答
1

根据 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存储库中评估!这就是它指向最近提交的原因。根据需要进行调整。)

于 2018-10-16T09:36:37.547 回答