git:如何在重命名时以交互方式添加(-p)

时间:2014-06-11 12:36:59

标签: git

假设我更改了一个版本化的文件并使用GIT以外的其他内容重命名,但我只想在该文件中包含一些差异?我该怎么做?

问题是GIT只能添加完整的新文件。

通过示例可能更好地理解该场景:

$ mkdir temp
$ cd temp
$ git init
$ nano 1.txt
$ cat 1.txt
I am file 1.txt
2
3
4
5

$ git add 1.txt
$ git commit -m "1st commit"
$ #edit some stuff and rename using something else than git
$ cat 2.txt #note, 1.txt is renamed to 2.txt
1 I am file 1.txt
2 I am now file 2.txt
3
4
5
6

$ #note the line with '6 'is added

我现在有什么选择,只提交重命名和“2”的行更改为“2我现在是文件2.txt”但不添加带有'6'的行。

在我的情况下,外部重命名和使用git mv并不是真正的解决方案,因为IDE中的重构可以进行多次重命名。

基本上,我希望通过完成git mv 1.txt 2.txt来获得你通常会得到的情况,在这种情况下,你可以交互式地选择你想要进行的2.txt中的那些行。

2 个答案:

答案 0 :(得分:3)

git add命令具有漂亮的-N标志:

-N, --intent-to-add
    Record only the fact that the path will be added later. An entry for
    the path is placed in the index with no content. This is useful for,
    among other things, showing the unstaged content of such files with
    git diff and committing them with git commit -a.

毋庸置疑,此标记也适用于git add -p


无需使用git mv。正如下面@ Ajedi32正确指出的那样,git mv 做了一些特别的事情。索引条目重命名(read-cache.c处的rename_index_entry_at)归结为:

remove_index_entry_at(istate, nr);
add_index_entry(istate, new, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);

编辑。(基于@ Math上面的评论)。由于git跟踪文件名,它只有两个命令:

mv 2.txt 1.txt                # Rename it back to the first name
git mv 1.txt git 2.txt        # Tell git you've moved it

git add -p -- 2.txt           # You can now stage the hunks

<击>

答案 1 :(得分:1)

如果我理解正确,您的问题源于这样一个事实:您无法以交互方式将块(使用-p)添加到文件中,只能修改文件。

你可以告诉git你打算用-N标志添加文件,然后git add -p应该有效:

$ mv 1.txt 2.txt    # not `git mv`
$ git add -N 2.txt  # Stages an empty file; you can now see the contents with `git diff`
...
$ git add -p        # Will include changes to `2.txt`