5

我有这个补丁文件,它包含一堆我想应用于 git 分支的修改。但我不想对所有这些修改做出一个独特的提交,而是想将它分成 2 或 3 个提交

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

git apply mypatch
git add -p

我只是想知道是否可以在一个 git 命令中做到这一点。我git applygit add.

编辑

我认为这个问题不应被视为具有多个命令的 Git 别名语法的副本,因为该问题(及其答案)不需要不涉及传递给别名的参数。

4

3 回答 3

8

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

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

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

所以这就是我最终添加到我的 global 的内容.gitconfig

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

然后我只需要这样做:

git ipatch mypatchfile
于 2016-01-22T21:04:17.143 回答
2

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

function git() {
    # Allows you to call `git ipatch patchfile`
    # Change ipatch to whatever you want the git command to be
    if [[ "$1" = 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语句,而不是一长串ifs。

于 2016-01-22T20:23:17.263 回答
-1

您可以使用 unix“补丁”命令(与 git 分开)。这样,Git 就不会知道任何关于“补丁”的信息——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”来创建你想要的提交序列。

于 2016-01-21T20:01:11.593 回答