如果我想将仅对特定提交中更改的部分文件(包括对多个文件的更改)进行的更改合并到Git分支中,如何实现这一点?
假设名为stuff的Git提交对文件A、B、C和D进行了更改,但我只想将stuff的更改合并到文件A和B。这听起来像Git cherry-pick的工作,但cherry pick只知道如何合并整个提交,而不是文件的子集。
如果我想将仅对特定提交中更改的部分文件(包括对多个文件的更改)进行的更改合并到Git分支中,如何实现这一点?
假设名为stuff的Git提交对文件A、B、C和D进行了更改,但我只想将stuff的更改合并到文件A和B。这听起来像Git cherry-pick的工作,但cherry pick只知道如何合并整个提交,而不是文件的子集。
当前回答
有时,使用签出从提交中获取特定文件可能更容易。在我看来,它给了你更多的控制权,而且在樱桃采摘后不必检查和拆封。
我会这样做:
git checkout <branch|hash> -- path/to/file1 path/to/filen
然后,在提交之前,取消编写必要的更改以适应代码并对其进行测试。如果一切按预期进行,那么提交。
其他回答
我会选择一切,然后这样做:
git reset --soft HEAD^
然后我会还原我不想要的更改,然后进行新的提交。
使用修补程序标志签出
完成您所描述内容的一个简单方法是通过签出补丁。修改我在顶部提供的四个变量。脚本执行以下操作:
克隆包含提交的分支(源分支)签出要将文件移动到的分支(目标分支)在所需的提交版本签出源分支,提供补丁标志和文件的相对位置作为参数。添加、提交、推送
对我来说,这一直是最简单的方法。步骤#3确实创建了一个交互式shell,但如果你想破坏目标,你可以默认整个选项。
source_branch=branch_with_file_you_want
destination_branch=file_go_here
rev=757c47d4
relative_file_path=structures/serializers/node.py
message="Patching a file from $source_branch to $destination_branch"
git clone https://github.com/yourepo/app.git -b $source_branch $source_branch
cd $source_branch
git checkout $destination_branch
git checkout $rev --patch $source_branch $relative_file_path
git add $relative_file_path
git commit -m "$message"
git push
如果您是远程GitLab,如果您需要MR,可以使用git push-o merge_request.create
有时,使用签出从提交中获取特定文件可能更容易。在我看来,它给了你更多的控制权,而且在樱桃采摘后不必检查和拆封。
我会这样做:
git checkout <branch|hash> -- path/to/file1 path/to/filen
然后,在提交之前,取消编写必要的更改以适应代码并对其进行测试。如果一切按预期进行,那么提交。
自动化程度更高:
#!/usr/bin/env bash
filter_commit_to_files() {
FILES="$1"
SHA="$2"
git show "$SHA" -- $FILES | git apply --index -
git commit -c "$SHA"
}
示例用法:
filter_commit_to_files "file1.txt file2.txt" 07271c5e
我通过复制并粘贴到外壳中来定义它。您不需要here文档。
我通常将-p标志与来自其他分支的git签出一起使用,我发现这比我遇到的大多数其他方法更容易和更精细。
原则上:
git checkout <other_branch_name> <files/to/grab in/list/separated/by/spaces> -p
例子:
git checkout mybranch config/important.yml app/models/important.rb -p
然后,您会看到一个对话框,询问您希望在“blobs”中进行哪些更改,这基本上适用于连续代码更改的每个块,然后您可以为每个代码块发出y(是)n(否)等信号。
-p或patch选项适用于git中的各种命令,包括git stash save-p,它允许您从当前工作中选择要隐藏的内容
当我做了很多工作,并希望将其分离出来,使用gitadd-p提交更多基于主题的提交,并选择每次提交所需的内容时,我有时会使用此技术:)