• J
    git-add --interactive · 5cde71d6
    Junio C Hamano 提交于
    A script to be driven when the user says "git add --interactive"
    is introduced.
    
    When it is run, first it runs its internal 'status' command to
    show the current status, and then goes into its internactive
    command loop.
    
    The command loop shows the list of subcommands available, and
    gives a prompt "What now> ".  In general, when the prompt ends
    with a single '>', you can pick only one of the choices given
    and type return, like this:
    
        *** Commands ***
          1: status       2: update       3: revert       4: add untracked
          5: patch        6: diff         7: quit         8: help
        What now> 1
    
    You also could say "s" or "sta" or "status" above as long as the
    choice is unique.
    
    The main command loop has 6 subcommands (plus help and quit).
    
     * 'status' shows the change between HEAD and index (i.e. what
       will be committed if you say "git commit"), and between index
       and working tree files (i.e. what you could stage further
       before "git commit" using "git-add") for each path.  A sample
       output looks like this:
    
                  staged     unstaged path
         1:       binary      nothing foo.png
         2:     +403/-35        +1/-1 git-add--interactive.perl
    
       It shows that foo.png has differences from HEAD (but that is
       binary so line count cannot be shown) and there is no
       difference between indexed copy and the working tree
       version (if the working tree version were also different,
       'binary' would have been shown in place of 'nothing').  The
       other file, git-add--interactive.perl, has 403 lines added
       and 35 lines deleted if you commit what is in the index, but
       working tree file has further modifications (one addition and
       one deletion).
    
     * 'update' shows the status information and gives prompt
       "Update>>".  When the prompt ends with double '>>', you can
       make more than one selection, concatenated with whitespace or
       comma.  Also you can say ranges.  E.g. "2-5 7,9" to choose
       2,3,4,5,7,9 from the list.  You can say '*' to choose
       everything.
    
       What you chose are then highlighted with '*', like this:
    
                  staged     unstaged path
         1:       binary      nothing foo.png
       * 2:     +403/-35        +1/-1 git-add--interactive.perl
    
       To remove selection, prefix the input with - like this:
    
            Update>> -2
    
       After making the selection, answer with an empty line to
       stage the contents of working tree files for selected paths
       in the index.
    
     * 'revert' has a very similar UI to 'update', and the staged
       information for selected paths are reverted to that of the
       HEAD version.  Reverting new paths makes them untracked.
    
     * 'add untracked' has a very similar UI to 'update' and
       'revert', and lets you add untracked paths to the index.
    
     * 'patch' lets you choose one path out of 'status' like
       selection.  After choosing the path, it presents diff between
       the index and the working tree file and asks you if you want
       to stage the change of each hunk.  You can say:
    
            y - add the change from that hunk to index
            n - do not add the change from that hunk to index
            a - add the change from that hunk and all the rest to index
            d - do not the change from that hunk nor any of the rest to index
            j - do not decide on this hunk now, and view the next
                undecided hunk
            J - do not decide on this hunk now, and view the next hunk
            k - do not decide on this hunk now, and view the previous
                undecided hunk
            K - do not decide on this hunk now, and view the previous hunk
    
       After deciding the fate for all hunks, if there is any hunk
       that was chosen, the index is updated with the selected hunks.
    
     * 'diff' lets you review what will be committed (i.e. between
       HEAD and index).
    
    This is still rough, but does everything except a few things I
    think are needed.
    
     * 'patch' should be able to allow splitting a hunk into
       multiple hunks.
    
     * 'patch' does not adjust the line offsets @@ -k,l +m,n @@
       in the hunk header.  This does not have major problem in
       practice, but it _should_ do the adjustment.
    
     * It does not have any explicit support for a merge in
       progress; it may not work at all.
    Signed-off-by: NJunio C Hamano <junkio@cox.net>
    5cde71d6
builtin-add.c 3.3 KB