( 출처 : https://wikidocs.net/book/7060 )

2. 기본 명령어

2-1) add와 commit

add해야 할 파일이 여러개인 경우?

  • 일일히 하나씩 번거로워!

git add [경로명] : 해당 경로의 모든 파일을 일괄적으로!

git add . : (untrack된거 제외하고) 모든 파일을 한번에!

  • .gitignore안에 있는 파일은, add되지 않는다!


[기타]

  • git commit -a : modified 상태인 파일 전부 add 하고 commit

  • git commit -am "[메시지]" : add & commit 한번에


2-2) status, log, show

git status

저장소 내의 파일 상태정보 출력

  • 파일 상태 정보
    • untracked
    • modified
    • unmodified
  • git status -s : 간결하게 ( short ) 출력


example )

$ touch test.txt
$ git status -s
--------------------------
?? test.txt
  • ?? : untracked
  • M : modified
  • MM : 수정 상태가 staged 된 후, 다시 modified
  • A : 경로가 staged 된 후, 경로내에 untracked 파일 발생


git log

저장소에 기록된 이력 (commit history) 출력

$ git log
------------------------------------------------
# [ 내역 4 (most recent)]
commit 5858e921bc9294d7e2a7dc6b7b97ab3011b78c05 (HEAD -> master)
Author: User1 <User1@gmail.com>
Date:   Mon Oct 18 14:14:11 2021 +0900

    Add listbox and modify OnBnClickedMsgBtn function

# [ 내역 3 ]
commit cd9938f779744e6b9ac254d558deb5f2d5588d2a
Author: User1 <User1@gmail.com>
Date:   Fri Oct 15 14:29:47 2021 +0900

    Add OnBnClickedMsgBtn() function

# [ 내역 2 ]
commit e5b578b3c060fe26385c14a6cd9a57100e90d120
Author: User1 <User1@gmail.com>
Date:   Fri Oct 15 14:07:13 2021 +0900

    Apply .gitignore

# [ 내역 1 (oldest) ]
commit 635225a9d36f99c4298a0de1ef4dfcdfa44cd16a
Author: User1 <User1@gmail.com>
Date:   Thu Oct 14 15:37:26 2021 +0900

    Create empty project


로그 해석하기

  • commit ID : 635225a9d36f99c4298a0de1ef4dfcdfa44cd16a
  • 작성자 : User1 User1@gmail.com
  • 작성일자 : Thu Oct 14 15:37:26 2021 +0900
  • commit 메시지 : Create empty project


기타

  • git log -5 : 최근 5개만큼의 commit 이력 확인하기
  • git log -p : log 상세 정보 표현

  • git log --pretty=oneline : commit 이력을 한 줄로! (간결하게)

  • git log --oneline : 보다 더욱 간결하게!

    ( commit ID의 7번째 값 까지 )

  • git log --oneline --decorate=full : 브랜치(master)나 태그와 관련된 정보를 상세히!

  • git log --oneline --decorate --graph : commit 이력을 그래프 형태로

figure2


git show

특정 commit의 상세정보를 출력

  • ex) git show e5b578b


[ 요약 ]

  • git status : 저장소 파일의 상태정보 출력
  • git status -s : 파일 상태정보를 간략하게 표시
  • git log : 저장소의 commit이력을 출력
  • git log --pretty=oneline : 각 commit을 한줄로 출력(–pretty 옵션 사용)
  • git log --oneline : 각 commit을 한줄로 출력
  • git log --decorate=full : 브랜치나 태그정보를 상세히 출력
  • git log --graph : 그래프 형태로 출력
  • git show : 가장 최근의 commit 정보 출력
  • git show [commit hash] : 해당 commit의 정보 출력
  • git show HEAD : HEAD가 참조하는 commit의 정보 출력
  • git show HEAD^^^ : HEAD를 기준으로 3단계 이전의 commit정보 출력
  • git show HEAD~[n] : HEAD를 기준으로 n단계 이전의 commit정보 출력


2-3) diff

파일의 수정 내용을 비교하기

git show vs git diff

  • git show : 직전 commit과, 비교한 수정내용을 출력
  • git diff: 비교 대상을 지정


아무런 옵션 없이 git diff : 아무런 출력 X

  • Unstaged 상태의 파일 & 최신 commit의 파일 내용을 비교


파일을 수정한 이후…

아무런 옵션 없이 git diff : 이번엔 출력 O

  • 파일 변경 사항들이 나옴
$ git diff
---------------------------------------------------
diff --git a/SimpleTest/Resource.h b/SimpleTest/Resource.h
index 346ed42..032e3f9 100644
--- a/SimpleTest/Resource.h
+++ b/SimpleTest/Resource.h
@@ -10,6 +10,8 @@
 #define IDC_MSG_BTN                     1000
 #define IDC_LIST1                       1001
 #define IDC_LIST                        1001
+#define IDC_BUTTON1                     1002
+#define IDC_RESET_BTN                   1002

 // Next default values for new objects
 //
@@ -17,7 +19,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        130
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1002
+#define _APS_NEXT_CONTROL_VALUE         1003
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif

--- (생 략)


[ 요약 ]

  • git diff : 최근 commit과 변경사항이 발생한(Unstaged) 파일들의 내용비교
  • git diff --staged : 최근 commit과 Staging area의 파일들 간의 변경사항 출력
  • git diff [commit hash1] [commit hash2] : 두 commit의 파일들 간의 변경사항 출력


2-4) reset, amend

git add나, git commit 명령을 취소해야 하는 상황에서!


git reset

staging area에 올라간 파일 일부/전체를 unstaging하기

( 즉, git add 취소하기 )

figure2


$ touch test1.txt
$ touch test2.txt

$ git status
------------------------------------------
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   test1.txt
        new file:   test2.txt
$ git reset

$ git status
----------------------------------------------
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test1.txt
        test2.txt
  • add 되기 이전인 untracked 상태로 돌아온 것을 확인함


특정 파일만 unstage하고 싶다면?

$ git reset test2.txt

figure2


git commit –amend

add가 아닌, commit된 파일을 빠꾸시키기!


commit 메시지를 수정하는 실습!

$ git log --oneline
------------------------------
6df2700 (HEAD -> master) Add file
(생략)


“Add file”에서 “Add test1.txt”로 수정하기

$ git commit --amend -m "Add test1.txt"

$ git log --oneline
------------------------------
6f4850f (HEAD -> master) Add test1.txt
(생략)

git commit --amend로 commit 메시지만 수정한 것 처럼 보이지만, 실은 새로운 commit을 생성한 것! ( 새롭게 hash 부여 )

figure2


[ 요약 ]

  • git reset : Staging area의 파일 전체를 unstaged 상태로 되돌리기
  • git reset [파일명] : 해당 파일을 unstaged 상태로 되돌리기
  • git commit --amend : 최근 커밋을 수정하기
  • git commit --amend -m "[commit 메시지]" : 해당 메시지로 commit 수정하기


2-5) checkout

과거에 commit한 프로그램을 잠시 사용하고자!

과거에 작성한 프로그램 파일로 복원하기!


git checkout

$ git log --oneline
----------------------------------------
6f4850f (HEAD -> master) Add test1.txt
a9aca7e Add OnBnClickedResetBtn function
5858e92 Add listbox and modify OnBnClickedMsgBtn function
cd9938f Add OnBnClickedMsgBtn() function
e5b578b Apply .gitignore
635225a Create empty project


figure2

아래와 같이 되돌리고 (rollback) 싶음

  • git checkout [이동할 commit의 hash]
$ git checkout cd9938f
$ git log --oneline
----------------------------------------
cd9938f (HEAD) Add OnBnClickedMsgBtn() function
e5b578b Apply .gitignore
635225a Create empty project


다시 최근 commit으로 돌아가기

$ git checkout -

$ git log --oneline
-------------------------------------
6f4850f (HEAD -> master) Add test1.txt
a9aca7e Add OnBnClickedResetBtn function
5858e92 Add listbox and modify OnBnClickedMsgBtn function
cd9938f Add OnBnClickedMsgBtn() function
e5b578b Apply .gitignore
635225a Create empty project


[ 요약 ]

  • git checkout [commit hash] : 해당 commit으로 파일상태 변경
  • git checkout - : HEAD가 이전에 참조했던 commit으로 상태변경
  • git checkout master : HEAD가 master를 참조
  • git checkout HEAD~n : HEAD를 기준으로 n단계 이전 commit으로 상태변경


2-6) reset (2)

상황 :

  • 2개의 파일 ( Test1.txt & Test2.txt )를 지우기로함
  • 파일 상황
    • Test1.txt : 이미 commit
    • Test2.txt : 아직 commit X

figure2


방법 :

  • 해결책 1 ) 파일 삭제 & commit
  • 해결책 2 ) 파일 추가하기 전으로 복귀 & commit 삭제하기


결과

  • if 해결책 1 ) Test1.txt & Test2.txt을 추가했었던 이력이 남음
  • if 해결책 2 ) 이력도 삭제 => git reset


figure2


process

Step 1) 현재 상황 확인하기

  • test1.txt : 이미 commit되어 있음
  • test2.txt : 아직 add하지 않은 상태
$ git status
-------------------------------------------------------------
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test2.txt

nothing added to commit but untracked files present (use "git add" to track)


Step 2) test2.txt 지우기

$ rm test2.txt


Step 3) 현재 상황 확인하기

  • CLEAN
$ git status
-----------------------------------------------------------
On branch master
nothing to commit, working tree clean


하지만, 위의 경우에는, 이미 commit까지 완료한 test1.txt 파일의 이력도 정리해야한다!

따라서, 보다 간편하게 git reset을 사용하자!


git reset

Step 1) 로그 확인하기

  • 6f4850f (HEAD -> master) Add test1.txt 를 취소시키고 싶음

  • 따라서, 그 전 단계인

    a9aca7e Add OnBnClickedResetBtn function 로 되돌리기(reset하기)

$ git log --oneline
------------------------------------------
6f4850f (HEAD -> master) Add test1.txt
a9aca7e Add OnBnClickedResetBtn function
5858e92 Add listbox and modify OnBnClickedMsgBtn function
cd9938f Add OnBnClickedMsgBtn() function
e5b578b Apply .gitignore
635225a Create empty project


[ reset의 옵션 ]

  • --soft, --mixed, --hard

figure2


Step 2) reset하기

$ git reset --hard a9aca7e
----------------------------------
HEAD is now at a9aca7e Add OnBnClickedResetBtn function


[ 참고 ]

  • 실제로 commit이 삭제된 것은 아니다!

  • 기존에는, HEAD는 브랜치(master)를 참조하고있었음

    ( & 브랜치는 항상 최신 commit을 참조 )

  • 하지만, reset을 통해 브랜치가 참조하는 (최신으로 인식되는) commit이 변경된 것일 뿐!

  • 따라서, 아래와 같이 다시 복귀하기 전으로 또 복귀할 수 있다.

    $ git reset --hard 6f4850f
    -------------------------------------
    HEAD is now at 6f4850f Add test1.txt
    

figure2


2-7) reflog

방금 앞선 2-6)에서, hard reset을 한 이후, 다시 복원할 수 있었음

( 가장 최근 commit의 hash 6f4850f 를 알았으므로 )

BUT, what if 모른다면? => git reflog


git reflog

  • HEAD가 참조했던 commit들을 출력
  • 시간 역순으로 정렬 ( 가장 위 = 가장 최신 )


이렇게 hash를 알아내서 reset해도 되지만, (``6f4850f`)

대신 다음과 같이도 가능하다 ( git reset --hard HEAD@{1} )


2-8) HEAD & master

브랜치 (branch)

브랜치란?

  • 저장소(Repository) 내에 존재하는 독립적인 작업관리의 영역

    ( 독립적 = 다른 공간에 영향을 받지 않는다 )

  • 마스터 브랜치?

    • git init 명령으로 자동 생성 ( 최초의 (main) 브랜치 )
    • default 브랜치 명 = master
  • 한 저장소 (repository) 내에 여러 브랜치 있을 수 있음!

    ( 현재 어느 branch에서 작업중인지 잘 확인해야! )

  • 현재의 HEAD가 참조하고 있는 branch 확인하기

    figure2


HEAD와 브랜치의 관계

figure2

figure2

  • HEADmaster를 참조하고 있고

  • master해당 commit을 참조


checkout, reset시 HEAD의 이동

git checkout

  • “HEAD의 참조 값”이 변경
    • master는 그대로 있고,
    • HEAD만 이동하는 형태

figure2


git reset

  • “master의 참조 값”이 변경
    • master는 항상 최신 commit을 참조하는 것으로 간주되므로, reset 지정한 이후 시점의 commit은 모두 무시되고, 지정한 시점으로 이동해서 master가 참조하는 commit이 최신으로 인식
    • 이후의 commit은 실제로 삭제된 것은 아니지만, 그런 것 처럼 보이는 이유!

figure2


[ 요약 ]

  • 브랜치(branch) : 저장소(repository) 내의 독립적인 관리영역
  • master 브랜치 : 저장소를 처음 생성할 때 만들어지는 브랜치
  • master : 해당 브랜치의 끝(최신 commit)을 참조하는 개체
  • HEAD : 어떤 commit을 가리키는 개체, HEAD가 이전 commit을 참조하면 Working directory의 내용이 이전 commit의 내용으로 변경됨
  • HEAD는 참조를 참조할 수 있음. (master를 참조하거나 commit을 직접 참조 가능)
  • HEAD는 git에서 사용되는 공식 명침임. master, origin 또한 공통적으로 사용되는 명칭이나 필수는 아님(다른 이름으로 변경가능)

Categories:

Updated: