【问题标题】:git copy one commit to new branchgit 将一个提交复制到新分支
【发布时间】:2017-02-01 09:36:06
【问题描述】:

我想创建一个仅包含一个特定提交副本的新分支(即来自 master)。我该怎么做?

我最接近的是这样的:

git checkout --orphan NEWBRANCH
git rm -rf .
git commit "MESSAGE MESSAGE MESSAGE"
git cherry-pick -x <hash>

基本上,我想要上面没有“MESSAGE MESSAGE MESSAGE”提交。

cherry-pick 后出现错误:

$ git cherry-pick -x 68cc6733a14ec571c0abb0d4e77f53d93446f009
error: could not apply 68cc673... asdvasdflmdamfvla
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

【问题讨论】:

  • 问题不清楚。您想创建一个以空存储库开始并选择单个提交的新分支吗?或者你想在一个特定的提交(包括它的所有历史)开始一个新的分支?还是别的什么?
  • 在新分支中我只想要一个提交,没有历史记录。

标签: git


【解决方案1】:
git checkout --orphan NEWBRANCH <commitid>
git commit -a

git checkout --orphan &lt;new_branch&gt; [&lt;start_point&gt;]

创建一个新的孤儿分支,命名为&lt;new_branch&gt;,从 &lt;start_point&gt; 并切换到它。对这个新的第一个提交 分支将没有父母,它将成为新的根 历史与所有其他分支完全脱节,并且 提交。

索引和工作树的调整就像你有 以前运行“git checkout &lt;start_point&gt;”。这使您可以 开始一个记录一组路径的新历史,类似于 &lt;start_point&gt; 通过轻松运行“git commit -a”来创建根目录 提交。


编辑

以下脚本将一次性完成这项工作(请注意,为了消除可能的失败原因,它需要从未跟踪的文件中清除工作树,但它会请求允许这样做):

copy_as_root_commit

#!/bin/sh

myname="$(basename "$0")"

if [ $# -ne 2 ]
then
    echo 1>&2 "Usage: $myname <commitid> <new_branch>"
    exit 1
fi


commitid=$(git rev-parse "$1")
new_branch="$2"

set -e
untracked_stuff="$(git clean -dxf -n)"
if [ "$untracked_stuff" ]
then
    echo "$myname needs to clean the working tree before proceeding:"
    printf "%s\n" "$untracked_stuff"
    while read -p "Remove above files? (y/n) " answer
    do
        case "$answer" in
            [yY]) break ;;
            [nN]) exit 1 ;;
        esac
    done
fi

git clean -dxf                                               \
&& git checkout --orphan "$new_branch" "$commitid"           \
&& git commit -m "Initial commit (a copy of $commitid)"      \
&& echo "Successfully created new root branch '$new_branch'" \
|| echo "Failed to create new root branch '$new_branch'"

用法

copy_as_root_commit <commitid> <new_branch>

示例

copy_as_root_commit master~4 NEW_ROOT

copy_as_root_commit ce04aa6 NEWBRANCH

【讨论】:

  • 这种方式不会留下它来自哪个提交的痕迹。使用cherry-pick -x 的替代方案解决了这个问题。
  • @KcFnMi 对于git cherry-pick -x,与源提交的唯一连接是通过提交消息。没有什么可以阻止您将该信息放入您的提交消息中,例如git commit -a -m "Copy of commit &lt;commitid&gt;"
  • 我认为git cherry-pick -x 是自动的:)
  • @KcFnMi 如果您需要定期执行此操作,那么它也可以通过简单的脚本自动执行。
  • 这很酷。在答案中提供有关此的更多详细信息会很有趣。
猜你喜欢
  • 2014-05-24
  • 2021-11-28
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2016-03-23
  • 2011-03-11
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多