# 이 챕터에서 내가 기억해야 할 만한 것들만 정리
- 깃 초기화하기
$ git init
이 명령을 사용하면 Git을 사용할 수 있도록 디렉토리를 초기화해 준다.
Initialized empty Git repository in C:/Users/~~~~~/.git/ 가 출력된다면 해당 디렉토리에서 Git을 사용할 수 있게 된다.
※ /.git 디렉토리는 앞으로 버전이 저장될 저장소(Repository)라고 부른다. 이 디렉토리는 평소 윈도우 탐색기에서는 숨겨져 있기 때문에 숨긴 항목을 체크하여 탐색기에서도 확인할 수 있다.
- 작업 트리에서 빔으로 문서 수정하기
$ git status
이 명령을 사용하면 현재 Git의 상태를 나타내는 메시지가 출력된다.
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
1. On branch master: 현재 master 브랜치에 있다. 브랜치에 관한 내용은 다음 장에서 다룰 예정.
2. No commits yet: 아직 커밋한 파일이 없음
3. Untracked files: 아직 한번도 버전 관리하지 않은 파일.
4. nothing added to commit: 현재 커밋할 파일이 없음.
- 수정한 파일을 스테이징하기
- Git에게 버전 만들 준비를 하랄고 알려주기 위해 스테이지에 수정한 파일을 추가한다. 이 작업을 '스테이징' 또는 '스테이지에 올린다'라고 표현하며, 스테이징 내용이 .git/index에 저장되기 때문에 '인덱스에 등록한다'라는 표현도 사용한다.
$ git add hello.txt
이 명령을 사용하여 스테이징을 완료하면 아무 일도 일어나지 않은 것 처럼 보인다.
$ git status
다시 Git 상태를 확인하면 아까 전과는 다소 달라진 모습을 확인할 수 있다.
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
↓
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
※ warning: in the working copy of 'hello.txt', LF will be replaced by CRLF the next time Git touches it
-윈도우의 줄바꿈 문자와 리눅스의 줄바꿈 문자가 달라서 생기는 경고이다. Git이 알아서 변환해서 커밋할 것이므로 우리가 딱히 터치하지 않아도 된다.
- 스테이지에 올라온 파일 커밋하기
$ git commit -m "message1"
이 명령을 통해 파일을 커밋할 수 있다.
* 뒤에 -m 옵션을 붙이면 커밋과 함께 저장할 메시지를 작성할 수 있으며, 이를 커밋 메시지라고 한다.
$ git commit -m "message1"
[master (root-commit) ba64dc1] message1
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
성공적으로 파일 1개가 변경되고, 파일에 1개의 내용이 추가된 것을 확인할 수 있다.
$ git status
On branch master
nothing to commit, working tree clean
커밋한 이후에는 작업 트리에도 아무것도 없고, 커밋할 파일도 없다고 출력된다.
$ git log
이 명령을 통해 방금 커밋한 버전에 대한 설명을 확인할 수 있다.
- 스테이징과 커밋 한꺼번에 처리하기
$ git commit -am "message2"
한 번 커밋한 파일이라면 git commit 명령에 -am 옵션을 붙여서 스테이징과 커밋을 한꺼번에 처리할 수 있다.
- 커밋 기록 자세히 살펴보기
dndkg@kei MINGW64 ~/myfirstgit (master)
$ git log
commit 2fc9b097e13ba8800aea0ddd5e2572ad84c8a65d (HEAD -> master)
Author: Aqua <dndkgds@gmail.com>
Date: Mon Jul 11 17:16:57 2022 +0900
message2
commit ba64dc19054ab05067650194dc9b7a4d42c11454
Author: Aqua <dndkgds@gmail.com>
Date: Mon Jul 11 17:10:56 2022 +0900
message1
* 커밋 해시 or 깃 해시 : commit 옆에 나타나는 영문과 숫자로 된 긴 문자열
* (HEAD -> master) : 이 버전이 가장 최신이라는 표시
- 그 외 버전을 제작한 사람, 버전이 제작된 날짜, 커밋 메시지를 확인할 수 있으며 이러한 정보를 묶어 간단히 커밋 로그라고 부른다.
- 변경 사항 확인하기
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
-현재 hello.txt 파일이 수정되었지만 아직 스테이징 상태는 아니라고 출력되었다.
$ git diff
이 명령을 통해 방금 수정된 txt 파일과 저장소에 존재하는 최신 버전의 txt 파일이 어떻게 다른지 확인할 수 있다.
- Tracked 파일과 Untracked 파일
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: hello.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello2.txt
no changes added to commit (use "git add" and/or "git commit -a")
- 한 번이라도 커밋을 한 파일은 Git이 계속해서 수정 여부를 추적하기 때문에 Tracked 파일이라고 부른다. 반면에 한 번도 Git에서 버전 관리를 하지 않은 파일은 수정 내역을 추적하지 않기 때문에 Untracked 파일이라고 부른다.
$ git log --stat
- 커밋에 관련된 파일까지 함께 살펴보려면 --stat 옵션을 사용해야 한다.
※ .gitignore 파일로 버전 관리에서 제외하기
- 버전 관리 중인 디렉토리 안에 버전 관리를 하지 않을 특정 파일 또는 디렉토리가 있다면 .gitignore 파일을 만들어 목록을 지정할 수 있다. vim을 이용해 파일을 만들고 그 안에 관리하지 않을 파일 또는 디렉토리 이름, 파일 확장자를 입력하면 된다.
e.g. mynote.txt // temp/ // .swp 등으로 지정
- Unmodified, Modified, Staged 상태
1. Unmodified 상태 : 작업 트리에 변경 사항이 없어 'working tree clean'이 출력된다. 모든 파일의 상태는 unmodified, 즉 수정되지 않은 상태이다.
2. Modified 상태 : 'Changes not staged for commit'이 출력된다. 파일이 수정만 된 modified 상태이다.
3. Staged 상태 : 'Changes to be committed'가 출력된다. 커밋 직전의 단계인 staged 상태이다.
※ 방금 커밋한 메시지 수정하기
$ git commit --amend
- 가장 최근의 커밋 메시지를 수정하려면 git commit 명령에 '--amend'를 입력한다. 바로 vim이 열리며 커밋 메시지를 수정할 수 있게 되니 평소처럼 저장하고 종료하면 된다.
- 작업 트리에서 수정한 파일 되돌리기
- 이 책(초판 6쇄, git 2.21.0 버전 사용)에서는 작업 트리의 변경 사항을 취소하려면 checkout를 사용하라고 알려주고 있다.
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
그런데... 직접 실습해보니 (git 2.37.0 사용중) checkout 대신 restore 명령을 사용하라고 알려주고 있다. 어떻게 된 일일까?
불꽃 구글링 결과 git 2.23.0 버전부터는 checkout 기능을 switch와 restore 명령으로 분할하였고 git help에서도 checkout 명령어를 제외했다고 알려주고 있다. 이에 따라 책과는 다르게 restore 명령을 사용해 보겠다. (단, checkout 명령을 사용해도 정상 작동한다.)
기존 checkout 기능은 뒤에서 다루게 될 branch를 변경하거나 파일을 복원할 때 사용하게 되는데 이를 switch와 restore로 분리해서 사용하게 만들었다고 한다.
그래서 branch를 변경할 때에는 switch, 파일을 복원할 때는 restore 명령어를 사용하면 되겠다. 후에 책에서 branch를 다루게 될 때 checkout 기능이 재등장한다면 그 때에도 다시 짚고 넘어가야겠다.
$ git restore hello.txt
책에서 checkout -- 부분만 restore로 대체하면 됨.
결과적으로는 이렇게 쓰면 된다.
- 스테이징 되돌리기
- 아앗... 이번에도 책과 나의 실습이 다르다.
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: hello2.txt
책에서는 git reset HEAD 기능을 사용하라고 알려주고 있는데, 나의 최신 Git은 restore 명령에 --staged 옵션만 추가하면 된다고 알려주고 있다.
다시 한번 불꽃 구글링 결과, 최신 Git의 명령어를 사용하면 된다고 알려주고 있다.
$ git restore --staged hello2.txt
책의 reset HEAD를 restore --staged로 변경.
- 최신 커밋 되돌리기
$ git reset HEAD^
- 이 명령을 사용하면 HEAD가 가리키는 브랜치의 최신 커밋을 취소하고 스테이지에서도 내린다. 작업 트리에만 남게 되는 것이다.
* 최근 3개의 커밋을 취소하려면 $ git reset HEAD~3 의 형태로 사용하면 된다.
$ git reset HEAD^
Unstaged changes after reset:
M hello2.txt
정상적으로 커밋이 취소되고 스테이지에서도 내려간 모습이다.
※ git reset 명령의 옵션
명령 | 설명 |
--soft HEAD^ | 최근 커밋을 하기 전 상태로 작업 트리를 되돌린다. |
--mixed HEAD^ | 최근 커밋과 스테이징을 하기 전 상태로 작업 트리를 되돌린다. 별도의 옵션을 적지 않으면 이 옵션이 기본으로 적용된다. |
--hard HEAD^ | 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌린다. 이 옵션으로 되돌린 내용은 복구할 수 없다. |
- 특정 커밋으로 되돌리기
- 특정 커밋으로 되돌릴 때는 git 명령 다음에 커밋 해시를 사용하면 된다.
* 주의할 점 : reset A라고 표기했을 때, 이는 A 커밋을 리셋하는 것이 아니라, A 커밋 이후 최근 커밋까지 모든 커밋을 삭제하고 A 커밋으로 이동하겠다는 의미이다.
$ git reset --hard 복사한 커밋 해시
$ git reset --hard bd815995144030db9e2c859991f3d8c593871df0
HEAD is now at bd81599 R2
HEAD가 방금 복사해서 붙인 커밋 해시 위치로 옮겨져, 가장 최신 커밋이 되었다.
* 커밋 해시의 앞자리 7자리만 사용해도 큰 문제는 없다. 이를 짧은 커밋 해시라고 부른다고 함... 실제로 두 번째 블록 2번째 줄을 보면 7자리만 표기된 것을 볼 수 있다.
- 커밋 삭제하지 않고 되돌리기
- 커밋을 되돌리더라도 취소한 커밋을 남겨둬야 할 때가 있을텐데, 이 때는 reset이 아닌 revert 명령을 사용하게 된다.
* 주의할 점 : revert를 사용할 때는 reset과는 다르게 취소하려고 하는 버전의 커밋 해시를 사용해야 한다. 헷갈리지 말자.
*팁: 로그 화면이 너무 길다면 Q를 눌러서 프롬프트($)를 바로 표시할 수 있다.
$ git revert 복사한 커밋 해시
revert 명령을 실행하면 Git 설치 시 지정했던 기본 편집기가 자동으로 나타나면서 커밋 메시지를 입력할 수 있다. 커밋 메시지 맨 위에는 어떤 버전을 revert했는지 나타난다. 추가로 남길 내용이 있다면 적으면 된다.
$ git revert ea4c8a3
[master 07be67b] Revert "R5" 일시적으로 커밋 보류함.
1 file changed, 1 deletion(-)
정상적으로 'R5' 버전이 revert 된 모습이다.
* log를 확인해보면 "R5" 버전과 "R5"를 revert한 새로운 커밋이 생기게 된다.
'Git' 카테고리의 다른 글
[Do it! Git&GitHub] Ch.04 깃허브로 백업하기 (0) | 2022.07.19 |
---|---|
[Do it! Git&GitHub] Ch.03 깃과 브랜치 (0) | 2022.07.18 |
[Do it! Git&GitHub] Ch.01 깃 시작하기 (0) | 2022.07.10 |