Git 用于交互式应用补丁的一行代码

Git one-liner for applying a patch interactively

我有这个 补丁文件 ,它包含我想应用到 git 分支的一系列修改。但我不想对所有这些修改进行一次独特的提交,而是想 将其拆分为 2 或 3 次提交

我知道我可以通过首先应用补丁,然后进行 交互式添加 (逐块添加)来实现此目的,如下所示:

git apply mypatch
git add -p

我只是想知道是否可以在一个 git 命令中做到这一点。 我在 git apply 的联机帮助页和 git add.

中都找不到任何内容

编辑

我不认为这个问题应该被视为 Syntax for Git aliases with multiple commands 的重复问题,因为该问题(及其答案)不需要不涉及传递给别名的参数。

您可以使用 unix "patch" 命令(与 git 分开)。这样 Git 就不会知道 'patch' 的任何信息 --- Git 只会认为您进行了常规编辑。 "git show" 和 "git diff" 的输出与 unix "patch" 命令兼容:

# assuming "my-git-repo" is clean...
cd my-git-repo
patch -p1 < my.patch
git status

此时您可以使用 "git add" / "git commit" 来创建您想要的提交序列。

正如我在评论中提到的,您可以使用函数获得类似的效果。经过更多考虑,我不确定别名是否有效,因为您需要指定补丁文件和可能的一些选项。这是您可以添加到 .bashrc 的示例函数,如果您使用 shell 而不是 Bash,则可能需要进行调整。我认为它应该适用于 Zsh,也许还有 Ksh,但我还没有用它们测试过。

function git() {
    # Allows you to call `git ipatch patchfile`
    # Change ipatch to whatever you want the git command to be
    if [[ "" = ipatch ]]; then
        shift
        # Specify the full path to git, otherwise infinite recursion
        # Alternatively, name the function something else
        /usr/bin/git apply "$@"
        /usr/bin/git add -p
    else
        /usr/bin/git "$@"
    fi
}

如果您想添加更多自定义 git 命令,可能值得研究 case statement,而不是一长串 if

我正在回答我自己的问题,感谢@8bittree 的评论。

至少有两种方法可以做到这一点:

  • 使用 shell 函数 ()
  • 使用 git 别名。我更喜欢这个解决方案,因为它只涉及 .gitconfig,不需要修改 .bashrc,并且 git shell completion 适用于新的别名,它与其他标准 git 命令一起显示在完成列表

这就是我最后添加到我的全局 .gitconfig:

[alias]
    # interactive apply patch
    ipatch = "!f() { git apply ; git add -p; }; f"

然后我只需要做:

git ipatch mypatchfile