如何在git add --patch的交互界面中,逐块应用文件及其内容的差异?

编程语言 2026-07-09

到现在为止,我已经搞清楚如何显示差异(diff):

diff -u "$old_file" <(echo "$new_file_content")
# or
git diff --no-index "$old_file" <(echo "$new_file_content")

然后如果对改动感到满意,我可以 echo "$new_file_content" > "$old_file"。但有时我只想合并diff中的一小段。

在Git仓库的情境下,我喜欢使用 git add --patch file(我只使用y/n/s,s表示将差异分成更小的块)。“将这段差异暂存”。

理想情况下,我希望拥有与 git add --patch 相同的界面,从diff中合并部分内容,并尽可能把块/段做得更小。如果无法使用 git 来实现这个目的,那么对我的用例来说,在 git add --patch 中最重要的部分是:

  1. 能够添加/合并块/段或跳过
  2. 能够把块/段拆分成更小的部分

我尝试过 patch --merge=merge,但它没有带来交互式菜单。我也尝试过 nvim -d,但对我这个不熟练的Vim用户来说非常困惑,我也没能成功合并单个文件。

解决方案

受到 How to apply patch hunk by hunk? 的回答启发,我在经典的 git add --patch 和一个临时目录的帮助下,解决了这个问题。

old_file_name=file_name
temp_dir=$(mktemp -d)
temp_file=$temp_dir/$old_file_name

git -C $temp_dir init $temp_dir

cp $old_file $temp_dir
git -C $temp_dir add .
echo "$new_file_content" > $temp_file
# User can select hunks to stage/merge.
git -C $temp_dir add --patch .
# Restores unstaged changes.
git -C $temp_dir restore .

cp "$temp_file" "$old_file"

rm -rf $temp_dir
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章