본문 바로가기

책/프로 Git

Git 도구-2 - 대화형 명령어

대화형 명령어

git add 명령에 -i 나 --interactive 옵션을 주고 실행하면 대화형 모드로 들어간다.

$ git add -i
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now>

Staging Area 파일 추가하고 추가 취소하기

위의 Commands 처럼 2, 나 u 입력하고 엔터

What now> 2
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

 

TODO, index.html 파일 Stage 하려면 1, 2를 입력 엔터 하면 * 붙은 파일이 state하도록 선택된 것이다.

Update>> 1,2
           staged     unstaged path
* 1:    unchanged        +0/-1 TODO
* 2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

 

여기서 그냥 엔터를 치면 * 파일이 Staging Area로 추가된다. 

Update>>
updated 2 paths

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 1
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

 

TODO 파일을 Unstage하고 싶으면 3 이나 r 을 입력한다.

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 3
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> 1
           staged     unstaged path
* 1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Revert>> [enter]
reverted one path

 

상태를 다시 확인하면 TODO 파일이 Unstaged가 되어 있다.

*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

 

Stated 파일의 변경 내용을 보려면 6 이나 d를 입력한다. 그리고 Staged 된 파일 (1)을 선택한다.

  • git diff --cached 라고 실행한 결과와 같다.
*** Commands ***
  1: status     2: update      3: revert     4: add untracked
  5: patch      6: diff        7: quit       8: help
What now> 6
           staged     unstaged path
  1:        +1/-1      nothing index.html
Review diff>> 1
diff --git a/index.html b/index.html
index 4d07108..4335f49 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,7 @@ Date Finder

 <p id="out">...</p>

-<div id="footer">contact : support@github.com</div>
+<div id="footer">contact : email.support@github.com</div>

 <script type="text/javascript">

파일의 일부분만 Stating Area에 추가하기

예를 들어 simplegit.rb 파일은 고친 부분이 두 군데이다. 그 중 하나를 추가하고 나머지는 그대로 두고 싶다 고 하자.

  • 대화형 프롬프트에서 5 나 p를 입력한다. 
  • 그러면 Git은 부분적으로 Staging Area에 추가할 파일이 있는지 묻는다. 
  • 파일을 선택하면 파일의 특정부분을 Staging Area에 추가할 것인지 부분별로 구분하여 묻는다.
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..57399e0 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -22,7 +22,7 @@ class SimpleGit
   end

   def log(treeish = 'master')
-    command("git log -n 25 #{treeish}")
+    command("git log -n 30 #{treeish}")
   end

   def blame(path)
Stage this hunk [y,n,a,d,/,j,J,g,e,?]?

 

여기에서 ?를 입력하면 선택 가능한 명령어를 설명해준다.

Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

 

y 나 n을 입력 하면 각 부분을 Stage할지 말지 결정할 수 있다. status 명령으로 확인해보면 결과는 다음과 같다.

  • simplegit.rb 파일은 부분적으로 Stage했다. 
  • 이제 대화형 모드를 종료하고 일부분만 Stage한 파일을 커밋할 수 있다.
  • git add -p 나 git add --patch 로도 같은일을 할 수 있다.
What now> 1
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:        +1/-1        +4/-0 lib/simplegit.rb