본문 바로가기
⚙️ 4. 개발도구/4-1 Git

[Git] 2장 깃으로 버전 관리하기 - 깃 저장소 및 버전 생성 / Commit 내용 확인 / 버전 단계 파일 확인

by 달님🌙 2021. 11. 8.
반응형

 

 

02-1 깃 저장소 생성

 

1. 깃 초기화하기(git init)

 

* 깃에서는 문서를 수정할 때마다 간단한 메모와 함께 수정내용을 스냅숏으로 찍어서 저장합니다. 이것을 '버전'이라고 합니다.

 

1) 깃 저장소 디렉터리 생성 또는 지정

mkdir hello-git 
cd hello-git



2. ls -la

 


3. 깃을 사용할 수 있도록 디렉터리를 초기화

 git init



4. ls -al

-  '.git'이라는 디렉터리 생성

- 깃을 사용하면서 버전이 저장될 '저장소(repository)'

 

02-2 버전 생성

 

1. 깃에서 버전이란

 

- 문서를 수정하고 저장할 때마다 생기는 것

- 파일 이름을 유지하면서 만든 시간과 수정 내용 기록

 

2. 스테이지와 커밋

 

1. 작업트리(working directory) : 예) hello-git

2. 스테이지(stage) : 버전으로 만들 파일이 대기하는 곳, 버전으로 만들 파일을 staging area에 넘겨줌

3. 저장소(repository) : 스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳
    
작업트리 --(add)--> 스테이지 ----커밋(commit)-----> 저장소 (문서수정파일)

 

3. 작업트리에서 vi 문서 편집(파일 생성 및 수정)

 

1. hell-git 디렉터리 이동 : 깃 초기화에 따라 버전관리 상태

$ git status

 

2. vi hello.txt

- '1'입력 'wq'

- cat hello.txt 확인

 

3. ls -al

 

4. git status   

- Untracked files: 아직 한번도 버전 관리하지 않은 파일

 

4. 수정한 파일을 스테이징하기(git add)

 

- 스테이지에 수정한 파일을 추가(staging)

1) git add hello.txt

2) git status

3) Untracked files: -> Changes to be committed: 로 바뀜

- 'new file:'수식어 추가 표시

- 수정한 파일 hello.txt가 스테이지에 추가

 

5. 스테이지에 올라온 파일 커밋하기(git commit)

 

- 파일이 스테이지에 있다면 이제 버전을 만들 수 있다.

- 버전을 만드는 것을 '커밋한다' 커밋 시 어떤 변경 사항이 있었는지 확인하기 위해 메시지를 함께 기록

1) 커밋하기

git commit -m "message1"

 

2) 상태보기 

 

3) 버전이 제대로 만들어졌는지 확인

 git log

 

4) 커밋 만든 사람, 시간, 메시지 정보 표시

 

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

 

- commit 명령에 -am 옵션을 사용

- 스테이지에 올리고 커밋하는 과정을 한꺼번에 처리하기

- 단, 한 번이라도 커밋한 적이 있는 파일을 재커밋할 때만 사용

 

 1) hello.txt 수정(숫자 '2' 추가)


   
2) git status

 


3) git commit -am "message2"

 

4) git log

 

다시
        

02-3 커밋 내용 확인

 

1. 커밋 기록 자세히 살펴보기(git log)

 

$ git log

    1. 커밋해시 : 커밋 식별 아이디
        commit 4388ff66667a3b9f15b53fb62b67744a1bb74b67 
    2. 최신버전 :  이 버전이 가장 최신이라는 표시   
        (HEAD -> master)
    3. 작성자 : 누가
        Author: jyk <call1212@nate.com>
    4. 버전 만든 날짜 : 언제
        Date:   Thu Nov 4 13:49:26 2021 +0900
    5. 커밋 메시지 : 작성자의 메시지 기록
        message2

 

2. 변경 사항 확인하기(git diff)

 

어디가 어떻게 수정되었는지 파악
    1. vi hello.txt 
        '2' 삭제 후 'two' 수정
    2. git status
        Changes not staged for commit:
        modified:   hello.txt
        파일이 수정되었고 아직 스테이징 상태가 아님
    3. git diff
        수정한 hello.txt 파일이 저장소에 있는 
        최신 버전의 hello.txt와 어떻게 다른지 확인
         1 
        -2      최신버전과 비교할 때 '2'가 삭제
        +two    'two'라는 내용이 추가

        이렇게 작업트리에서 수정한 파일과 최신 버전을 비교한 다음,
        수정한 내용으로 다시 버전을 만들려면 스테이징에 올린 후 커밋하고 
        수정한 내용을 버리려면 git checkout 명령을 사용해 수정 내용을 취소

    4. 실습을 위해 hello.txt 원래대로 되돌리기
        vi hello.txt
        'two' -> '2' 수정

    5. git status   
    6. git diff
     

    

 

 

02-4 버전단계의 파일상태

 

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

 



tracked 파일과 untracked 파일
    git status 명령 : 파일 상태와 관련된 메시지 표시
    작업트리 파일 : tracked 상태와 untracked 상태로 나뉨
    두 개의 상태가 무엇을 의미하는지?
    1. vi hello.txt
        '3'을 추가
    2. vi hello2.txt
        'a'
        'b'
        'c'
        'd'
        입력 후 저장
    3. git status
        변경된 파일이 아직 스테이지에 올라가지 않았다.
        Changes not staged for commit:
         modified:   hello.txt 수정됨
        이렇게 깃은 한 번이라도 커밋을 한 파일의 
        수정 여부를 계속 추적(tracked 파일)
        
        한 번도 깃에서 버전 관리를 하지 않았기 때문에
        수정 내역을 추적하지 않음(untracked 파일)
        Untracked files:
         hello2.txt

    4. git add .
        두 파일 모두 스테이지에 올림
    5. git status
         Changes to be committed:
            modified:   hello.txt
            new file:   hello2.txt
    6. git commit -m "message3"
       git log
    7. 그런데 각 커밋에 어떤 파일들이 관련된 것인지 알 수 없음
    8. git log --stat
        가장 최근의 커밋부터 순서대로 메시지와 관련 파일이 표시
        로그 메시지가 너무 많은 경우 한 화면씩 나눠 표시 Enter키를 
        누르면 다음 로그 페이지 'Q'를 누르면 로그화면을 빠져나와 
        깃 명령 모드로 입력 대기함

unmodified, modified, staged 상태
    한 번이라도 버전을 만들었던 파일은 tracked 상태
    깃의 커밋 과정 중에서 tracked 파일의 상태가 어떻게 바뀌는지 확인
    1. ls -al
    2. git status
        nothing to commit, working tree clean
        현재 작업 트리에 있는 모든 파일의 상태는 
        unmodified, 즉 수정되지 않은 상태
    3. hello2.txt 파일 수정
        'a'만 남기고 나머지 내용 삭제
    4. git status
        Changes not staged for commit:
            modified:   hello2.txt
    5. git add hell2.txt
       git status
        Changes to be committed:
            modified:   hello2.txt
    6. git commit -m "delete b, c, d"
       git status
        nothing to commit, working tree clean
        unmodified 상태로 돌아감




지금까지 깃에서 버전을 만드는 과정에서 어느 단계에 있는지에 따라
파일의 상태가 달라진다. 

[untracked]  [unmodified]  [modified]  [staged]
     : ------------------------------------>                                  
     :               ---------->             스테이징
     :                          ----------->
     :             <------------------------ 커밋


방금 커밋한 메시지 수정하기
    문서의 수정내용을 기록해둔 커밋 메시지를 즉시 수정
    가장 최근의 커밋 메시지를 수정
    $ git commit --amend
        vi편집기로 수정 및 저장
        커밋 메시지가 수정되면서 이전 커밋에 더해진다.
        

버전 관리에서 제외시키기(.gitignore)
    버전 관리 중인 디렉터리 안에 관리를 하지 않을 특정 파일 또는 디렉터리가
    있다면 .gitignore 파일을 만들어 목록을 지정할 수 있다. 
    편집기를 사용하여 .gitignore 파일을 만들어 그 안에 버전 관리하지 않을
    파일, 또는 디렉터리 이름이나 파일 확장자를 입력하면 된다.
    주로 개인적인 메모 파일이나 백업파일 등

 





    

 

 

02-5 작업 되돌리기

 

* 스테이지에 올렸던 파일을 내리거나 커밋을 취소하는 등 각 단계로 돌아가는 방법

 

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

 

파일을 수정한 뒤 소스가 정상적으로 동작하지 않는 등의
    이유로 수정한 내용을 취소하고 가장 최신 버전 상태로 되돌려야 할 경우
    1. vi hello.txt
        '3'을 'three'로 수정
    2. git status
        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)
       hello.txt가 수정되었지만 아직 스테이지에 올라가 있지 않은 상태
       작업트리의 변경사항을 취소하려면 checkout ? restore(복원)? 사용
    3. git checkout -- hello.txt
    4. cat 명령을 통해 확인
         cat hello.txt

 

 

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

 

앞에서는 파일의 수정을 취소하고 원래대로 되돌림
    이번에는 수정된 파일을 스테이징했을 때, 스테이징을 취소하는 방법
    1. vi hello2.txt
        기존내용 삭제 후 'A, B, C, D' 로 수정
    2. git add hello2.txt
       git status
    3. Changes to be committed:
        (use "git restore --staged <file>..." to unstage)
    4. git restore --staged hello2.txt
        스테이지에서 hello2.txt를 내린다.
    5. git status
        Changes not staged for commit:
        파일이 올라가기 전(not staged)으로 돌아 온 상태

 

 

3. 최신 커밋 되돌리기(git reset HEAD^)

 

    이번에는 수정된 파일을 스테이징하고 커밋까지 했을 때, 
    가장 마지막에 한 커밋을 취소하는 방법
    1. vi hello2.txt
        'E' 추가 후 저장
    2. git commit -am "message4"
        스테이징과 커밋 한 번에 실행
    3. git log
    4. git reset HEAD^
        최신 커밋을 되돌리려면 git reset 명령 다음에 HEAD^
        HEAD^는 현재 HEAD가 가리키는 브랜치의 최신 커밋을 가리킴
        이렇게 되돌리면 커밋도 취소되고 스테이지에서도 내려짐
    5. git log

    참고 | git reset 명령어 옵션
    --soft HEAD^ 최근 커밋을 하기 전 상태로 작업 트리를 되돌림
    --hard HEAD^ 최근 커밋, 스테이징, 파일 수정을 하기 전 상태로
                작업트리를 되돌림. 이 옵션으로 되돌린 내용은 복구 불능

 

(이전 로그가 나옴)

 

4. 특정 커밋으로 되돌리기(git reset 커밋해시)


    깃에는 파일을 수정하고 커밋할 때마다 저장된 버전들이 쌓여있다.
    특정 버전으로 되돌린 다음 그 이후 버전을 삭제도 가능
    특정 커밋으로 되돌릴 때는 git reset 명령 다음에 커밋해시 사용
    1. vi rev.txt
        'a' 입력 후 저장
    2. git add rev.txt
       git commit -m 'R1'
    3. vi rev.txt
        'b' 추가 후 저장
       git commit -a -m 'R2'
    4. vi rev.txt
        'c' 추가 후 저장
       git commit -am 'R3'
    5. vi rev.txt
        'd' 추가 후 저장
       git commit -am 'R4'
    6. git log
        4개의 커밋이 있고 각 커밋마다 해시가 표시
        R2라는 메시지가 있는 커밋으로 되돌리기
        즉, R2 메시지 버전의 커밋을 최신 커밋으로 만들기
    7. git reset --hard c0bff823c9645bb71e6dd442b127de640f7be13b
        HEAD is now at c0bff82 R2
    8. git log
        commit c0bff823c9645bb71e6dd442b127de640f7be13b (HEAD -> master)
        Author: jyk <call1212@nate.com>
        Date:   Thu Nov 4 17:38:13 2021 +0900

            R2

        이렇게 R4 커밋과 R3 커밋이 사라지고, R2 메시지가 있는 두 번째 
        커밋이 최신 커밋이 됨

 

- R2로 되돌리고 싶으면 R2의 해시코드를 복사해와서 입력

 

- 타이머신타고 R2 커밋한 상태로 돌아온걸 확인 (메모장에 ab만 존재)

 

 

 

- 커밋이 삭제된 채로 되돌려지는 단점이 있음

- R3과 R4에 중요 정보가 있을 수도 있으므로,,

- 다음 방법에 나옴

 

 

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

 

 커밋으로 되돌릴 때 수정했던 것을 삭제해도 된다면 git reset 명령 사용
    나중에 사용할 것을 대비 취소한 커밋을 남겨 두어야 할 때
    이 때는 git revert 명령 사용
    1. vi rev.txt
        'e' 추가 후 저장
    2. git commit -am 'R5'
    3. git log
        가장 최근에 커밋한 R5 버전을 취소하고, R5 직전 커밋 R2로 되돌리기
        : revert + '취소하려고 하는 버전, 즉 R5의 커밋 해시를 지정'

 

** reset 은 돌아갈 시점의 해시를 입력, revert는 취소하려는 버전의 커밋해시를 지정

 


    4. git revert eaad8dcd313ab66af57c1de05637fe1cd2da32f6
        revert 명령을 실행할 때는 깃을 설치할 때 지정했던 기본 편집기가 
        자동으로 실행 커밋 메시지를 입력

 


    5. git log
        commit ff93e4d7723f64629cb4a9350f03f0c8d8264676 (HEAD -> master)
        Author: jyk <call1212@nate.com>
        Date:   Thu Nov 4 17:59:24 2021 +0900

            Revert "R5"

            <EC><9D><BC><EC><8B><9C><EC><A0><81><EC><9C><BC><EB><A1><9C> <EC><BB><A4><EB><B0><8B> <EB><B3><B4><EB>
        <A5><98><ED><95><A8>.....

            This reverts commit eaad8dcd313ab66af57c1de05637fe1cd2da32f6.

        commit eaad8dcd313ab66af57c1de05637fe1cd2da32f6
        Author: jyk <call1212@nate.com>
        Date:   Thu Nov 4 17:58:05 2021 +0900

            R5
        .
        .
        .

        로그에 R5를 revert한 새로운 커밋이 생성. 그리고 기존의 R5 역시 사라지지 않음
        R5버전을 지우는 대신 R5에서 변경했던 이력을 취소한 새 커밋을 만듦
    6. cat rev.txt
        'e'추가 했던것이 사라짐
         이렇게 revert 명령을 사용하면 버전에 있던 이력을 취소     




            

 

 

 

 

 

 

 

 

 

반응형

댓글