( 출처 : 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
??
: untrackedM
: modifiedMM
: 수정 상태가 staged 된 후, 다시 modifiedA
: 경로가 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 +0900commit 메시지
: 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 이력을 그래프 형태로
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
취소하기 )
$ 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
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 부여 )
[ 요약 ]
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
아래와 같이 되돌리고 (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
방법 :
- 해결책 1 ) 파일 삭제 & commit
- 해결책 2 ) 파일 추가하기 전으로 복귀 & commit 삭제하기
결과
- if 해결책 1 ) Test1.txt & Test2.txt을 추가했었던 이력이 남음
- if 해결책 2 ) 이력도 삭제 =>
git reset
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
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
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 확인하기
HEAD와 브랜치의 관계
-
HEAD가 master를 참조하고 있고
-
master가 해당 commit을 참조
checkout, reset시 HEAD의 이동
git checkout
- “HEAD의 참조 값”이 변경
- master는 그대로 있고,
- HEAD만 이동하는 형태
git reset
- “master의 참조 값”이 변경
- master는 항상 최신 commit을 참조하는 것으로 간주되므로, reset 지정한 이후 시점의 commit은 모두 무시되고, 지정한 시점으로 이동해서 master가 참조하는 commit이 최신으로 인식
- 이후의 commit은 실제로 삭제된 것은 아니지만, 그런 것 처럼 보이는 이유!
[ 요약 ]
브랜치(branch)
: 저장소(repository) 내의 독립적인 관리영역master
브랜치 : 저장소를 처음 생성할 때 만들어지는 브랜치master
: 해당 브랜치의 끝(최신 commit)을 참조하는 개체HEAD
: 어떤 commit을 가리키는 개체, HEAD가 이전 commit을 참조하면 Working directory의 내용이 이전 commit의 내용으로 변경됨- HEAD는 참조를 참조할 수 있음. (master를 참조하거나 commit을 직접 참조 가능)
- HEAD는 git에서 사용되는 공식 명침임. master, origin 또한 공통적으로 사용되는 명칭이나 필수는 아님(다른 이름으로 변경가능)