대화식으로 지정된 파일의 지정된 부분만 스테이지 [git]

7508 단어 CUISourceTreeGit
나는 단기적이고 번거롭기 때문에 잘 git add .
글쎄, git 마스터에게서는 미친 것일지도 모르지만, 아마 이런 git의 조작을하고있는 것은 나만이 아닌 것 같다.

하지만 작업 트리에 있는 모든 파일 스테이지에 대해 일을 하면 다음과 같은 일이 일어날 가능성이 있다(아니 실제로 잘 일어나고 있었다)
  • 에디터에서 자동으로 성형한 내용이 커밋(좋은지 나쁜지는 환경에 의하지만)
  • 키보드에 팔꿈치가 닿았는지 어떠한 예기치 않은 문자가 어느새 들어가 있어, 눈치채지 않고 커밋
  • tmp로 만든 테스트 파일이 함께 커밋

  • ... 등

    에디터의 자동 성형이 diff에 들어가면, GUI에서 diff를 보고 있는 사람으로부터 하면(자) 누가 코드 나 파일이 로그에 남아 있으면 무엇보다 당황합니다.

    그래서 다음은 파일이나 파일의 변경 행을 대화적으로 미세하게 커밋하는 방법

    하고 싶은 일


  • file : -b 라는 행만 커밋
  • new-file : 스테이지 하는 파일
  • tmp-file : 스테이지하지 않는 파일
  • $ git status --short
     M file
    ?? new-file
    ?? tmp-file
    
    $ git diff
    diff --git a/file b/file
    index c74fa01..fa0600c 100644
    --- a/file
    +++ b/file
    @@ -2,8 +2,9 @@ first commit
     first commit
     first commit
     first commit
    -
    +
     first commit
    +second commit
     first commit
     first commit
     first commit
    @@ -15,3 +16,4 @@ first commit
     first commit
     first commit
     first commit
    +
    

    작업



    대화 쉘 모드로 이동
    $ git add -i
               staged     unstaged path
      1:    unchanged        +2/-2 file
    
    *** Commands ***
      1: status   2: update   3: revert   4: add untracked
      5: patch    6: diff     7: quit     8: help
    What now>
    

    각 명령은 철자의 머리 글자를 입력하거나 숫자를 입력하여 실행합니다.
  • 1: status : 상태 확인
  • 2: update : 파일 스테이지
  • 3: revert : 스테이지를 취소한다
  • 4 : add untracked : 추적되지 않은 파일 (새 파일)을 스테이지
  • 5: patch : 부분적으로 스테이지
  • 6 : diff : 스테이지 된 파일의 차이를 확인합니다 (작업 트리의 파일이 아님).
               staged     unstaged path
      1:    unchanged        +3/-1 file
    
    *** Commands ***
      1: status   2: update   3: revert   4: add untracked
      5: patch    6: diff     7: quit     8: help
    What now> p #部分的にステージする
               staged     unstaged path
      1:    unchanged        +3/-1 file
    Patch update>> 1 #fileを選択する
               staged     unstaged path
    * 1:    unchanged        +3/-1 file # 選択された状態
    Patch update>> #Enterでファイル選択を終了する
    diff --git a/file b/file
    index c74fa01..fa0600c 100644
    --- a/file
    +++ b/file
    @@ -2,8 +2,9 @@ first commit
     first commit
     first commit
     first commit
    -
    +
     first commit
    +second commit
     first commit
     first commit
     first commit
    Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
    

    patch를 실행하면 대화 모드로 이행한다.
  • y : 스테이지
  • n : 무대 없음
  • q : 대화 모드 종료
  • a : 그 파일의 이후를 모두 스테이지
  • d : 그 파일의 이후를 모두 건너 뜁니다
  • g : 지정된 행크로 이동
  • K : 이전 행크로 이동
  • J : 다음 행크로 이동
  • e : 행크 편집
  • diff --git a/file b/file
    index c74fa01..fa0600c 100644
    --- a/file
    +++ b/file
    @@ -2,8 +2,9 @@ first commit
     first commit
     first commit
     first commit
    -
    +
     first commit
    +second commit
     first commit
     first commit
     first commit
    Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]? s #ハンクを分割する
    Split into 2 hunks.
    @@ -2,5 +2,5 @@
     first commit
     first commit
     first commit
    -
    +
     first commit
    Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]?  n #自動整形された行はステージしない
    @@ -6,4 +6,5 @@
     first commit
    +second commit
     first commit
     first commit
     first commit
    Stage this hunk [y,n,q,a,d,/,K,j,J,g,e,?]? y #ステージする
    @@ -15,3 +16,4 @@ first commit
     first commit
     first commit
     first commit
    +
    Stage this hunk [y,n,q,a,d,/,K,g,e,?]? n #自動整形された行はステージしない
    

    더 이상 행크가 없으면 자동으로 대화 모드가 종료됩니다.
    *** Commands ***
      1: status   2: update   3: revert   4: add untracked
      5: patch    6: diff     7: quit     8: help
    What now> a #トラッキングされていないファイルをステージするモードに移行
      1: new-file
      2: tmp-file
    Add untracked>> 1 #new-fileのみをステージ
    * 1: new-file
      2: tmp-file
    Add untracked>> #Enterで終了
    added one path
    
    *** Commands ***
      1: status   2: update   3: revert   4: add untracked
      5: patch    6: diff     7: quit     8: help
    What now> s #ステータスを確認
               staged     unstaged path
      1:        +1/-0        +2/-1 file
      2:        +0/-0      nothing new-file
    
    *** Commands ***
      1: status   2: update   3: revert   4: add untracked
      5: patch    6: diff     7: quit     8: help
    What now> q #終了
    

    이상의 조작으로 이하와 같은 스테이터스가 된다
    $ git status --short
    MM file
    A  new-file
    ?? tmp-file
    $ git diff
    diff --git a/file b/file
    index 928e9ef..fa0600c 100644
    --- a/file
    +++ b/file
    @@ -2,7 +2,7 @@ first commit
     first commit
     first commit
     first commit
    -
    +
     first commit
     second commit
     first commit
    @@ -16,3 +16,4 @@ first commit
     first commit
     first commit
     first commit
    +
    $ git diff --cached
    diff --git a/file b/file
    index c74fa01..928e9ef 100644
    --- a/file
    +++ b/file
    @@ -4,6 +4,7 @@ first commit
     first commit
    
     first commit
    +second commit
     first commit
     first commit
     first commit
    diff --git a/new-file b/new-file
    new file mode 100644
    index 0000000..e69de29
    

    그리고는 보통 커밋 뿐이지만, 버릇으로 second commit



    덧붙여서 SourceTree로 위의 내용을 조작하는 것은 매우 간단했다.



    커밋할 행 선택



    선택한 행을 스테이지로 이동 선택



    추가할 새 파일만 선택



    이상

    좋은 웹페이지 즐겨찾기