'git checkout -p'后手动编辑

时间:2018-06-16 07:44:51

标签: git vim

我想从未分阶段的更改中撤消一些更改。为此,我跑了:

$ git checkout -p

然后我选择 e 选项手动编辑我感兴趣的hunk并按下ENTER:

@@ -320,6 +326,7 @@ public class TtsPresenterImpl implements TtsPresenter {
     public void onStopClicked() {
         model.stopPlayList();
         model.loadCurrentFile();
+
     }

     public static List<String> getFiles(File dir, String regex, boolean recursive) {
Discard this hunk from worktree [y,n,q,a,d,/,K,j,J,g,e,?]? e

底部的帮助告诉我:

# To remove '+' lines, make them ' ' lines (context).
# To remove '-' lines, delete them.
# Lines starting with # will be removed.

所以我用空格替换了+。我使用VIM,所以我将光标放在该位置,然后按下r后跟一个空格。对于那些不使用VIM的人来说 - 这是一个用空格替换光标下的字符的命令。不多也不少。

但是在我保存更改并使用:x命令离开编辑器之后 Git通知我:

fatal: corrupt patch at line 26
Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]? 

有什么问题?我预计这一变化将被取消。我也按照帮助中的建议尝试了#,但结果相同。

请不要建议丢弃大块头。是的,它有效,但我认为手动编辑存在一般问题。已经发生在我身上的事情,我'删除'只是一个方法中的一行,但整个方法后消失了。这很奇怪。

$ git --version
git version 2.7.4

另一次尝试(2次更改)。目标是保持更改y,但撤消x更改:

@@ -50,8 +50,9 @@ public class TtsModelImpl implements TtsModel, Serializable {
         listeners = new ArrayList<>();
         state = State.PLAYLIST_STOPPED;
         sentenceIterator = new TextSplitterForTts();
-
+        x
         load();
+        y
     }

     @Override
Discard this hunk from worktree [y,n,q,a,d,/,s,e,?]? e

在我用x行中的空格替换后,我得到了以下内容

...
        x
        load();
    }

y在哪里?

1 个答案:

答案 0 :(得分:1)

你不能制造一个不改变任何东西的大块头;你必须在这种情况下使用y / n。同样的问题一般不会扩展到手动编辑。

但是,请按照说明中的一些短语进行操作:

  

我预计这项改变将被取消。

  

请不要建议丢弃大块头。是的,它有效

您试图从工作树中删除该行。当Git解释如何“移除'+'行”时,在git checkout -p的上下文中,将从要删除的补丁中移除 。这可能是你消失方法的原因。

为了以更直观和可逆的方式处理这个问题,一个选项是要保留git add -p个更改,进行临时提交,丢弃未提交的更改,以及重置临时提交。