티스토리 뷰

깃에서는 문서를 수정할 때마다 간단한 메모와 함께 수정 내용을 스냅샷으로 찍어서 저장 ⇒ 버전

1. 깃 저장소 만들기

1-1. 깃 초기화하기 — git init

1) 깃 저장소를 만들 디렉토리 생성

$ mkdir hello-git
$ cd hello-git
$ ls -la
total 0 # 아직 아무 파일도 없음
drwxr-xr-x@  2 jieunpark  staff    64  9 30 11:44 .   # 현재 디렉토리
drwxr-xr-x@ 34 jieunpark  staff  1088  9 30 11:44 ..  # 상위 디렉토리

2) 저장소 생성

  • 디렉토리에 저장소를 만들기 위해 git init으로 디렉토리 초기화
  • .git 디렉토리가 깃을 사용하며 버전이 저장될 저장소(repository)
$ git init
/Users/jieunpark/Desktop/Archive/hello-git/.git/ 안의 빈 깃 저장소를 다시 초기화했습니다
$ ls -la
total 0
drwxr-xr-x@  3 jieunpark  staff    96  9 30 11:48 .
drwxr-xr-x@ 34 jieunpark  staff  1088  9 30 11:48 ..
drwxr-xr-x@  9 jieunpark  staff   288  9 30 11:48 .git # .git 디렉토리는 감춰져있음

2. 버전 만들기

깃에서 버전을 관리하면 파일 이름은 그대로 유지하며 파일에서 무엇을 변경했는지 변경 시점마다 저장할 수 있음

또 각 버전마다 작업했던 내용을 확인할 수 있고, 그 버전으로 되돌아갈 수도 있음

2-1. 스테이지와 커밋 이해하기

작업 트리 (working tree / working directory)

  • 파일 수정, 저장 등의 작업을 하는 디렉토리
  • 우리 눈에 보이는 디렉토리
  • ex. hello-git 디렉토리

스테이지 (stage)

  • 버전으로 만들 파일이 대기하는 곳, 스테이징 영역 (staging area)
  • .git/index 파일에 저장
  • ex. 작업 트리에서 10개의 파일을 수정했는데 4개의 파일만 버전으로 만드려면 4개의 파일만 스테이지로 넘겨주면 됨

저장소 (repository)

  • 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳
  • ./git/HEAD 파일에 저장

2-2. 깃이 버전을 만드는 과정

1) 작업 트리에서 문서 수정

  • hello.txt 파일 문서를 수정하고 저장하면 그 파일은 작업 트리에 있게 됨

2) 수정한 파일 중 버전으로 만들고 싶은 것을 스테이지에 저장

  • 수정한 hello.txt 파일을 버전으로 만들고 싶을 때 스테이지에 넣음
  • 다른 파일도 수정한 뒤 버전으로 만들겠다면 스테이지에 넣어둠

3) 스테이지에 있던 파일을 저장소로 커밋

  • 파일 수정을 끝내고 스테이지에 다 넣으면 버전을 만들기 위해 깃에게 commit 명령을 내림
  • commit 명령을 내리면 새로운 버전이 생성되며 스테이지에 대기하던 파일이 모두 저장소에 저장됨

2-3. 작업 트리에서 VIM으로 문서 수정하기

깃 상태 확인

$ git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 사항 없음 (파일을 만들거나 복사하고 "git add"를 사용하면 추적합니다)

새로운 파일 생성 후 깃 상태 확인

현재 브랜치 master

아직 커밋이 없습니다

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
    hello.txt

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)
  • untracked files: 아직 한 번도 버전 관리하지 않은 파일

2-4. 수정한 파일을 스테이징 하기 — git add

  • 작업 트리에서 파일을 생성 및 수정 후 스테이지에 수정한 파일 추가
  • 스테이징(staging): 깃에게 버전 만들 준비를 하라고 알려주는 것
  • 스테이징 내용을 .git/index 파일에 저장 (= 인덱스에 등록)
$ git add hello.txt
$ git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
    새 파일:       hello.txt
  • 새 파일 hello.txt를 앞으로 커밋할 것이라는 뜻

2-5. 스테이지에 올라온 파일 커밋하기 — git commit

  • 파일이 스테이지에 있다면 이제 버전을 만들 수가 있음
  • 깃에서는 버전을 만드는 것을 commit한다고 말함
  • commit할 때는 그 버전에 어떤 변경 사항이 있었는지 확인하기 위해 메시지를 함께 기록

커밋 메시지

$ git commit -m 'message1'
[master (최상위-커밋) 5fe650e] message1
 1 file changed, 1 insertion(+)
 create mode 100644 hello.txt
(base) jieunpark@JieunuicBookPro hello-git % git status
현재 브랜치 master
커밋할 사항 없음, 작업 폴더 깨끗함
  • 파일 1개가 변경되었고, 파일에 1개의 내용이 추가되었다고 나타냄
  • 스테이지에 있던 hello.txt 파일이 저장소에 추가

버전 확인

$ git log
commit 5fe650ebd2300f8a842cb07b051d5900bef9662a (HEAD -> master)
Author: Jieun-Enna <fornanaa@gmail.com>
Date:   Fri Sep 30 14:34:42 2022 +0900

    message1
  • 방금 커밋한 버전에 대한 설명이 나타남
  • 커밋을 만든 사람, 만든 시간, 커밋 메시지

2-6. 스테이징과 커밋 한꺼번에 처리하기 — git commit -am

  • commit 명령에 -am 옵션을 사용하면 스테이지에 올리고 커밋하는 과정을 한꺼번에 처리 (-a -m도 가능)
  • 한 번이라도 커밋한 적이 있는 파일을 다시 커밋할 때만 사용할 수 있음
$ git commit -am 'message2'
commit cde1f9dbab22f52b7ceac6030b78b3a6d5b96b76 (HEAD -> master)
Author: Jieun-Enna <fornanaa@gmail.com>
Date:   Fri Sep 30 14:43:14 2022 +0900

    message2

commit 5fe650ebd2300f8a842cb07b051d5900bef9662a
Author: Jieun-Enna <fornanaa@gmail.com>
Date:   Fri Sep 30 14:34:42 2022 +0900

    message1

3. 커밋 내용 확인하기

3-1. 커밋 기록 자세히 살펴보기 — git log

  • 지금까지 커밋했던 기록을 살펴보기 위한 명령
  • 지금까지 만든 버전이 화면에 나타나고, 각 버전마다 설명도 함께 나타남

커밋 로그

  • 커밋 해시 (commit hash) / 깃 해시 (git hash): 커밋을 구별하는 아이디
  • HEAD -> master: 이 버전이 가장 최신이라는 표시
  • Author: 버전을 누가 만들었는지
  • Date: 버전이 언제 만들어졌는지
  • 커밋 메시지

3-2. 변경 사항 확인하기 — git diff

  • 소스 코드를 수정한 다음 저장소에 있느 최근 버전과 비교해서 어떤 부분이 다른지 찾아야하는 경우
  • 커밋 메시지를 참고해도 구체적으로 어디가 어떻게 수정되었는지 파악하기가 어려움
  • git diff 명령을 사용하여 작업 트리에 있는 파일과 스테이지에 있는 파일을 비교하거나, 스테이지에 있는 파일과 저장소에 있는 최신 커밋을 비교해서 수정한 파일을 커밋하하기 전에 최종적으로 검토

git diff

  • hello.txt 수정 후 깃 상태 확인
    • hello.txt 파일이 수정되었고, 아직 스테이징 상태가 아니라고 나옴
    • $ git status 현재 브랜치 master 커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: hello.txt 커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오)
  • 수정한 hello.txt 파일이 저장소에 있는 최신 버전의 hello.txt와 어떻게 다른지 확인
  • $ git diff diff --git a/hello.txt b/hello.txt index 1191247..0b66db0 100644 --- a/hello.txt +++ b/hello.txt @@ -1,2 +1,2 @@ 1 -2 # 최신 버전과 비교할 때 hello.txt 파일에서 '2'가 삭제됨 +two # hello.txt 파일에 'two'라는 내용이 추가됨
  • 수정한 내용으로 다시 버전을 만드려면 스테이지에 올린 후 커밋
  • 수정한 내용을 버리려면 git checkout 명령으로 수정 내용 취소

4. 버전 만드는 단계마다 파일 상태 알아보기

깃에서는 버전을 만드는 각 단계마다 파일 상태를 다르게 표시

⇒ 파일의 상태를 이해하면 이 파일이 버전 관리의 여러 단계 중 어디에 있는지, 그 상태에서 어떤 일을 할 수 있는지 알 수 있음

4-1. tracked 파일과 untracked 파일

  • 작업 트리에 있는 파일은 크게 tracked 상태와 untracked 상태로 나뉨
  • hello.txt 파일을 수정하고 hello2.txt 파일을 새로 생성한 경우
    • 커밋하도록 정하지 않은 변경 사항: 변경된 파일이 아직 스테이지에 올라가지 않았음
    • 수정함: hello.txt 파일이 수정됨
    • ⇒ 이렇게 깃은 한 번이라도 수정된 파일의 수정 여부를 계속 추적함 - tracked 파일
    • 추적하지 않는 파일: hello2.txt 파일은 한 번도 깃에서 버전 관리를 하지 않았기 때문에 수정 내역을 추적하지 않음 - untracked 파일
  • $ git status 현재 브랜치 master 커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: hello.txt 추적하지 않는 파일: (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오) hello2.txt 커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오)
  • 수정했던 hello.txt 파일과 hello2.txt 파일은 모두 git add 명령을 사용해서 스테이지에 올릴 수 있음
    • git add 명령 뒤에 파일 이름 대신 마침표(.)를 붙이면 작업 트리에서 수정한 파일들을 한꺼번에 스테이지에 올릴 수 있음
    • 마지막 버전 이후에 수정된 hello.txt수정함:으로 표시됨
    • 한 번도 버전 관리하지 않았던 hello2.txt새 파일:로 표시됨
    • tracked 파일이나 untracked 파일 모두 스테이지에 올라온 것을 확인
    • $ git status 현재 브랜치 master 커밋할 변경 사항: (use "git restore --staged <file>..." to unstage) 수정함: hello.txt 새 파일: hello2.txt
  • 해당 커밋에는 hello.txt를 수정한 내용과 새로 만든 hello2.txt 내용이 다 포함됨
    • 그러나 각 커밋에 어떤 파일들이 관련된 것인지 알 수 없음
  • $ git commit -m 'message3' $ git log commit e5cd7374d72ef6149be95b24984fced78018d034 (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 15:44:55 2022 +0900 message3 commit cde1f9dbab22f52b7ceac6030b78b3a6d5b96b76 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:43:14 2022 +0900 message2 commit 5fe650ebd2300f8a842cb07b051d5900bef9662a Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:34:42 2022 +0900
  • 커밋에 관련된 파일까지 함께 살펴보려면 git log 명령에 —-stat 옵션을 사용
    • 로그 메시지가 너무 많은 경우 한 화면씩 나누어 보여줌
      • Enter → 다음 로그 화면
      • Q → 로그 화면을 빠져나와 다시 깃 명령 입력 가능
  • $ git log --stat commit e5cd7374d72ef6149be95b24984fced78018d034 (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 15:44:55 2022 +0900 message3 hello.txt | 1 + hello2.txt | 4 ++++ 2 files changed, 5 insertions(+) commit cde1f9dbab22f52b7ceac6030b78b3a6d5b96b76 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:43:14 2022 +0900 message2 hello.txt | 1 + 1 file changed, 1 insertion(+) commit 5fe650ebd2300f8a842cb07b051d5900bef9662a Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:34:42 2022 +0900 message1 hello.txt | 1 + 1 file changed, 1 insertion(+)

.gitignore 파일로 버전 관리에서 제외하기

  • 버전 관리 중인 디렉토리 안에서 버전 관리를 하지 않을 특정 파일 또는 디렉토리가 있다면 .gitignore 파일을 만들어 목록을 지정할 수 있음
  • VIM을 사용해서 .gitignore 파일을 만들어 그 안에 버전 관리하지 않을 파일 또는 디렉토리 이름이나 파일 확장자를 입력
    • ex. 개인적으로 메모해 놓은 파일이나 프로그램 사용중에 자동으로 생성된 swp 파일, 백업 파일 등
    • ex. mynote.txt 파일, temp 디렉토리, 확장자가 .swp인 파일을 버전 관리에서 제외
    • # .gitignore 파일 내용 mynote.txt temp/ .swp

4-2. unmodified, modified, staged 상태

  • tracked 상태인 파일은 깃 명령으로 파일 상태를 확인하면 현재 작업 트리에 있는지, 스테이지에 있는지 등 더 구체적인 상태를 알려줌
    • 작업 트리에 아무 변경 사항도 없음
    • working tree clean: 현재 작업 트리에 있는 모든 파일은 수정되지 않은 unmodified 상태
  • $ git status 현재 브랜치 master 커밋할 사항 없음, 작업 폴더 깨끗함
  • hello2.txt를 수정한 이후의 깃 상태
    • 커밋하도록 정하지 않은 변경 사항 (Changes not staged for commit): 파일이 수정만 된 modified 상태
  • $ git status 현재 브랜치 master 커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: hello2.txt 커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오)
  • git add 명령을 사용해 스테이지에 올리고 git status 명령을 실행
    • 커밋할 변경 사항 (Changes to be commited)
    • 커밋할 변경사항이 있음, 커밋 직전 단계, staged 상태
  • $ git add hello2.txt $ git status 현재 브랜치 master 커밋할 변경 사항: (use "git restore --staged <file>..." to unstage) 수정함: hello2.txt
  • 스테이지에 있는 hello2.txt 파일 커밋 후 git status 명령 실행
    • 커밋을 끝내고 난 후 hello2.txt 파일의 상태는 수정이 없던 unmodified로 돌아감
  • $ git commit -m 'delete b, c, d' $ git status 현재 브랜치 master 커밋할 사항 없음, 작업 폴더 깨끗함

방금 커밋한 메시지 수정하기

  • 문서의 수정 내용을 기록해둔 commit message를 잘못 입력한 경우, 커밋을 만든 즉시 commit message를 수정할 수 있음
  • 가장 최근의 커밋 메시지를 수정하려면 git commit 명령에 —-amend를 붙임
  • 명령을 입력하면 기본 편집기인 VIM이 실행되며 원래 커밋 메시지가 화면 위쪽에 나타남

5. 작업 되돌리기

5-1. 작업 트리에서 수정한 파일 되돌리기 — git checkout (git restore)

  • 파일을 수정한 뒤 소스가 정상적으로 동작하지 않는 등의 이유로 수정한 내용을 취소하고 가장 최신 버전 상태로 되돌려야 할 때
  • checkout 명령을 사용하면 작업 트리에서 수정한 내용을 쉽게 취소할 수 있음
  • checkout으로 되돌린 내용은 다시 복구할 수 없음
  • 파일 수정 후 깃의 상태 (1 2 3 ⇒ 1 2 three)
    • hello.txt가 수정되었지만 아직 스테이지에 올라가있지 않음
    • use "git restore <file>..." to discard changes in working directory
      • 교재에서는 restore 대신 checkout을 사용하지만, Git 2.23에서 checkout을 대신할 switch, restore가 도입되었고, git -—help에도 이젠 checkout 명령어가 나오지 않음
      • 작업 트리(디렉토리)의 변경 사항을 취소하려면 checkout (restore) 사용
  • $ git status 현재 브랜치 master 커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: hello.txt 커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오)
  • git checkout —- 파일 이름
  • $ git checkout -- hello.txt $ cat hello.txt 1 2 3

새 버전에 맞게 git checkout 대신 switch / restore 사용하기

checkout switch branches or restore working tree files
switch switch branches
restore restore working tree files

git switch

  • checkout에서 브랜치를 변경하는 부분만 담당
  • git checkout <BRANCH_NAME>: 브랜치 전환
  • $ git swtich develop 'develop' 브랜치로 전환합니다 브랜치가 'upstream/develop'에 맞게 업데이트된 상태입니다
  • git checkout -b <BRANCH_NAME>: 내가 많이 사용하는 브랜치를 새로 만들면서 브랜치 변경
      $ git switch -c new-branch
      새로 만든 'new-branch' 브랜치로 전환합니다
  • -c 옵션으로 똑같이 사용 가능
  • 브랜치를 어디서 만들지는 지정하지 않았으므로 HEAD가 사용되었는데, 특정 브랜치나 커밋에서 새로운 브랜치를 만들고 싶으면 브랜치 이름 뒤에 커밋 지정
  • $ git switch -c new-branch2 515c633a 새로 만든 'new-branch2' 브랜치로 전환합니다

git restore

  • 작업 트리의 파일 복원
  • 파일의 수정 내용을 복원하려면 git checkout — README.md처럼 사용했는데 이제 다음과 같이 사용
  • $ git restore README.md
  • git add를 통해서 수정 내용을 stage에 이미 넣었을 때 이를 다시 빼려면 git reset HEAD README.md를 사용했는데 이 부분도 restore로 들어옴
  • 수정 사항을 빼고 조작할 때 모두 restore로 통일
  • $ git restore --staged README.md

5-2. 스테이징 되돌리기 — git reset HEAD 파일 이름 (git restore)

  • 수정된 파일을 스테이징했을 때, 스테이징을 취소
  • 파일 수정 & 스테이지에 올린 후 깃의 상태 (a ⇒ A B C D)
    • 스테이지에서 내리려면(to unstage) reset HEAD 명령을 사용하라고 함 (restore)
  • $ git add hello2.txt $ git status 현재 브랜치 master 커밋할 변경 사항: (use "git restore --staged <file>..." to unstage) 수정함: hello2.txt
  • git reset (git restore) 명령을 사용해 스테이지에서 hello2.txt를 내리기
    • HEAD 다음에 파일 이름을 지정하지 않으면 스테이지에 있는 모든 파일을 되돌림
    • $ git reset HEAD hello2.txt 리셋 뒤에 스테이징하지 않은 변경 사항: M hello2.txt
    • 수정된 hello2.txt가 스테이지에서 내려졌다는(unstage) 메시지가 나타남
  • reset 이후 깃의 상태
    • 파일이 아직 스테이지에 올라가기 전(not staged)로 돌아옴
    • 파일의 수정사항은 아직 반영되어있음, 수정사항도 되돌리려면 restore 해야함
  • $ git status 현재 브랜치 master 커밋하도록 정하지 않은 변경 사항: (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오) (use "git restore <file>..." to discard changes in working directory) 수정함: hello2.txt 커밋할 변경 사항을 추가하지 않았습니다 ("git add" 및/또는 "git commit -a"를 사용하십시오)

5-3. 최신 커밋 되돌리기 — git reset HEAD^

  • 수정된 파일을 스테이징하고 커밋까지 했을 때, 가장 마지막에 한 커밋을 취소
  • 파일 수정 후 git commit 명령을 사용해 스테이징과 커밋 함께 실행 (a ⇒ A B C D E, ‘message4’)
  • git log 명령을 사용하면 커밋 메시지가 ‘message4’인 커밋을 확인할 수 있음
  • $ git log commit 37b48e561c8c0c2d0095e16fce5155296322c1b1 (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:15:10 2022 +0900 message4 commit 0825db65a6f5a47c816583acb70495a95ad35057 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 18:33:15 2022 +0900 delete b, c, d - modify commit message commit e5cd7374d72ef6149be95b24984fced78018d034 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 15:44:55 2022 +0900 message3 commit cde1f9dbab22f52b7ceac6030b78b3a6d5b96b76 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:43:14 2022 +0900 message2 commit 5fe650ebd2300f8a842cb07b051d5900bef9662a Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:34:42 2022 +0900 message1
  • 최신 커밋을 되돌리려면 git reset HEAD^
    • HEAD^: 현재 HEAD가 가리키는 브랜치의 최신 커밋
    • git log를 실행하면 가장 최신 커밋에 HEAD -> master 표시가 있는데, 이를 되돌리면 커밋도 취소되고 스테이지에서도 내려지고, 작업 트리에만 남게 됨
    • $ git reset HEAD^ 리셋 뒤에 스테이징하지 않은 변경 사항: M hello2.txt
  • 깃 상태 확인
    • 메시지가 ‘message4’인 커밋이 사라짐
    • 이 방법으로 커밋을 취소하면 이 커밋 전에 했던 스테이징도 함께 취소됨
  • $ git log commit 0825db65a6f5a47c816583acb70495a95ad35057 (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 18:33:15 2022 +0900 delete b, c, d - modify commit message commit e5cd7374d72ef6149be95b24984fced78018d034 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 15:44:55 2022 +0900 message3 commit cde1f9dbab22f52b7ceac6030b78b3a6d5b96b76 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:43:14 2022 +0900 message2 commit 5fe650ebd2300f8a842cb07b051d5900bef9662a Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 14:34:42 2022 +0900 message1

git reset 명령의 옵션

reset 명령은 사용하는 옵션에 따라 되돌릴 수 있는 단계가 다름

--soft HEAD^ 최근 커밋을 하기 전 상태로 작업 트리를 되돌림
--mixed HEAD^ 최근 커밋과 스테이징을 하기 전 상태로 작업 트리를 되돌림 (default)
--hard HEAD^ 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌림
이 옵션으로 되돌린 내용은 복구할 수 없음  

5-4. 특정 커밋으로 되돌리기 — git reset 커밋 해시

  • git reset HEAD^는 최신 커밋으로 되돌리지만, 특정 버전으로 되돌린 다음 그 이후 버전을 삭제할 수도 있음
  • git reset 커밋 해시
  • VIM을 사용해 rev.txt를 만들고, a(’R1’) b(’R2’) c(’R3’) d(’R4’)를 추가하고 커밋하는 과정을 반복하여 파일 수정과 커밋을 반복
  • $ git log commit 2b4b6946f402827189ed845943bd18948b000245 (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:37:36 2022 +0900 R4 commit 7e85c2d86602a6e93b1e219df5fb2a8d5cc095cd Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:37:12 2022 +0900 R3 commit 5e818638e70de7e27576d9cae3528720ea2e13b5 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:34 2022 +0900 R2 commit 9817b9f52300633933dab0b1065aa59b0e12d362 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:10 2022 +0900 R1
  • R4 메시지가 있는 커밋을 R4 커밋으로, R3 메시지가 있는 커밋을 R3으로 부름
  • 4개의 커밋 중 R2라는 메시지가 붙은 커밋으로 되돌리기 (R2 메시지가 있는 커밋을 최신 커밋으로)
    • git log 명령의 결과 화면에서 R2 커밋의 커밋 해시를 복사
    • $ git reset —-hard 5e818638e70de7e27576d9cae3528720ea2e13b5 HEAD의 현재 위치는 5e81863입니다 R2
    • 복사해서 붙인 커밋이 가장 최신 커밋이 됨
  • 깃 상태 확인
    • R4와 R3의 메시지가 있던 커밋은 삭제되고 R2가 최신 커밋이 됨
  • $ git log commit 5e818638e70de7e27576d9cae3528720ea2e13b5 (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:34 2022 +0900 R2 commit 9817b9f52300633933dab0b1065aa59b0e12d362 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:10 2022 +0900 R1
  • rev.txt 내용 확인
  • $ cat rev.txt a b
  • reset에서 커밋 해시를 사용해 되돌릴 때 주의점
    • reset A를 입력한다면 이 명령은 A 커밋을 리셋하는 것이 아니라 최근 커밋을 A로 리셋함
    • == A 커밋을 삭제하는 것이 아니라 A 커밋 이후에 만들었던 커밋을 삭제하고, A 커밋으로 이동

5-5. 커밋 삭제하지 않고 되돌리기 — git revert

  • 커밋으로 되돌릴 때 수정했던 것을 삭제해도 된다면 git reset 명령을 사용하면 되지만, 나중에 사용할 것을 대비해서 커밋을 되돌리더라도 취소한 커밋을 남겨두어야 함
  • git reset 대신 git revert
  • 파일 수정 및 커밋 후 깃 상태 확인 (a b ⇒ a b e (’R5’))
  • $ git log commit b904b138fdecc45f63d0c77a38c9abb0ccfbccfa (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:51:21 2022 +0900 R5 commit 5e818638e70de7e27576d9cae3528720ea2e13b5 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:34 2022 +0900 R2 commit 9817b9f52300633933dab0b1065aa59b0e12d362 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:10 2022 +0900 R1
  • 가장 최근에 커밋한 R5 버전을 취소하고, R5 직전 커밋 R2로 돌아가기
    • revert의 경우 revert 명령 뒤에 취소하려고 하는 버전의 커밋 해시 지정
    • git revert 취소할 커밋 해시
      Revert "R5"
      
      This reverts commit b904b138fdecc45f63d0c77a38c9abb0ccfbccfa.
      
      # 변경 사항에 대한 커밋 메시지를 입력하십시오. '#' 문자로 시작하는
      # 줄은 무시되고, 메시지를 입력하지 않으면 커밋이 중지됩니다.
      #
      # 현재 브랜치 master
      # 커밋할 변경 사항:
      #       수정함:        rev.txt
    • $ git revert b904b138fdecc45f63d0c77a38c9abb0ccfbccfa
    • 깃을 설치할 때 지정했던 기본 편집기가 자동으로 나타나며 커밋 메시지 입력 가능
    • 커밋 메시지 맨 위에는 어떤 버전을 revert 했는지 나타나있음
    • 문서 맨 위에 revert하며 추가로 남겨둘 내용이 있다면 입력하고 저장
    • [master 917f21e] Revert "R5" 1 file changed, 1 deletion(-)
  • 깃 상태 확인
  • $ git log commit bcc9af193b87030172be19771aef889ca1d756bb (HEAD -> master) Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 22:01:31 2022 +0900 Revert "R5" 일시적으로 커밋 보류함. This reverts commit ce478d60ec7d80a4cec32e0e3f9eb9eb97be1025. commit b904b138fdecc45f63d0c77a38c9abb0ccfbccfa Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:51:21 2022 +0900 R5 commit 5e818638e70de7e27576d9cae3528720ea2e13b5 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:34 2022 +0900 R2 commit 9817b9f52300633933dab0b1065aa59b0e12d362 Author: Jieun-Enna <fornanaa@gmail.com> Date: Fri Sep 30 21:36:10 2022 +0900 R1
  • rev.txt 확인
    • 앞에서 추가했던 ‘e’가 없어짐
    • 이렇게 revert 명령을 사용하면 버전에 있던 이력을 취소할 수 있음
  • $ cat rev.txt a b

 

 

출처

- Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문

'Development > Git & Github' 카테고리의 다른 글

01. 깃(Git) 시작하기  (0) 2023.02.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함