将一个文件从一系列提交中拉出到自己的分支中,保留git历史记录

时间:2017-08-25 13:52:24

标签: git github

我有一个分支feature/10/,其中包含一个正在开发中的新项目,包含许多文件,分支foo.py中的一个脚本已经变成了它自己的切向边项目它不应该在feature/10/分支中,而应该进入feature/11/分支,然后完成然后再回到主分区。 foo.py取决于master中的文件,但不会与feature/10/中的任何新文件交互或依赖它们。

有没有办法让我创建这个新分支,复制到foo.py但没有别的东西并保留foo.py的git历史记录?

我显然可以创建一个新分支并手动复制粘贴文件,但这感觉它违背了git的精神,因为它切断了foo.py从它的修订历史中的未来发展。

1 个答案:

答案 0 :(得分:0)

(你实际上并没有用反斜杠命名你的分支,是吗?我会假设正斜杠。)

git filter-branch可以做到这一点。

git filter-branch $(git merge-base feature/10 feature/11)..feature/11 \
    --index-filter '
        BASE=$(git merge-base feature/10 feature/11)
        # Save the current state of foo.py
        FOO=$(git ls-files --stage -- foo.py)
        read -r mode object stage file <<<${FOO}
        # Set the entire tree back to the base state
        git read-tree ${BASE}^{tree}
        # Add the current foo.py to the tree
        git update-index --cacheinfo "${mode},${object},foo.py"
    ' \
    --prune-empty

注意,这将重写feature/11分支。您可以在重写之前找到版本original/feature/11