ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명령어로 Git을 사용하자! Git CLI ( 버전관리 )
    Knowledge/Git 2019. 11. 27. 15:35
    반응형

    이 포스팅은 이고잉 님의 Git CLI - 버전 관리 ( https://opentutorials.org/course/3839 ) 강의를 듣고 정리한 내용입니다.

     

     

     

    - 버전 관리의 시작

     

    먼저 git을 설치해 ( https://opentutorials.org/course/3839/22590 ) git bash를 실행시키고

    버전 관리 하고 싶은 폴더로 이동한다. 

     

     

    해당 폴더는 현재 비어있는 상태다

     

    ls -al은 폴더 내 파일 리스트를 확인하는 리눅스 명령어다

     

    이 상태에서 git bash 명령창에서

     

    1
    git init

     

    을 입력하면

     

    비어 있는 Git Repository가 Initialized 되었다는 알림이 나온다. 다시 파일 목록을 보면

     

    .git이란 폴더가 생성된 걸 확인할 수 있다.

    이는 버전 정보가 저장되는 디렉토리로서

    위와 같은 방법으로 이 폴더를 생성하는 것이 버전관리의 시작이다.

     

    - 버전의 생성

     

    버전의 생성 과정을 이해하기 위해선 Working Tree, Staging Area, Repository를 이해해야 한다.

    이를 간단히 설명하자면 아래와 같다.

     

    Working Tree : 추가, 수정된 파일들이 존재하는 곳

    Staging Area : 변경된 파일 중 버전을 만들려고 하는 파일들이 존재하는 곳

    Repository : 버전이 저장되는 곳

     

    예를 들어 1이라는 내용을 적은 hello1.txt라는 파일을 git 초기화 해놓은 폴더안에 만들고

     

    1
    git status

     

    라는 명령어를 입력해보면

     

    위와 같은 내용을 확인할 수 있다.

     

    이 중 No commits yet은 아직 생성된 버전이 없다는 뜻이고

    Untracked files 목록에 나오는 hello1.txt는 말 그대로 추가, 수정되었지만 아직 추적되지 않고 있다는 뜻,

    즉 Working Tree에 존재한다는 뜻이다. 그러니 이걸 버전 관리 하려면 우선 Staging Area에 올려야 한다.

     

    Stagig Area에 파일을 올리는 명령어는 

     

    1
    git add  파일명

     

    이다. 입력후 다시 한번 git status로 내용을 확인해보면

     

     

    hello1.txt라는 파일이 Changes to be committed 목록으로 옮겨진 걸 볼 수 있다.

    버전으로 만들 준비가 되어 있다는 뜻이니 Staging Area에 올라갔음을 의미한다.

     

    이제 버전을 만들기만 하면 된다. 버전은

     

    1
    git commit -m "커밋 메모"

     

    명령어로 만들 수 있다.

    뒤에 -m "커밋 메모"는 필수는 아니지만 해당 옵션을 사용하면 에디터를 거치지 않고 커밋 메모를 남길 수 있는 이점이 있다. 아무튼 입력하고 다시 git satus로 상태를 보면

     

     

    Staging Area에 올라가 있던 hello1.txt 파일이 Message 1이란 메모와 함께 커밋이 되어서

    지금은 커밋할 게 없다. working tree가 clean하다는 내용을 확인할 수 있다. 실제로

     

    1
    git log

     

    명령어를 입력하면 

     

     

    commit된 내역, 즉 버전이 만들어진 일종의 역사를 확인할 수 있다. 

     

    자 그럼 여기서 파일을 수정해보면 어떨까? 

    hello1.txt에 2라는 내용을 추가하고 git status로 다시 한번 상태를 보면

     

     

    변경된 내역은 있지만 아직 커밋할 수 있게 Stage에 올라가 있진 않다고 나온다.

    그럼 어떻게 해야할까? 방법은 같다. git add hello1.txt -> git status 하면

     

     

    변경이 커밋될 준비가 되었다고 나오고 git commit -m "Message2" 를 입력하고 git log를 보면

     

     

    Message2라는 메모와 함께 새로운 버전이 생성된 걸 확인할 수 있다.

     

    오케이. 그럼 이제 git에서 파일 하나를 다루는 방법은 알게 되었다.

    그렇다면 파일 두개를 다뤄야하는 상황은 어떨까?

     

    예를 들어  hello1.txt에 3을 추가하고, hello2.txt 라는 파일을 생성해 1이라는 내용을 적은 후 git status를 확인하면

     

    hello1.txt는 Changes not staged for commit 목록에, hello2.txt 는 Untracked files 목록에 나오는 걸 확인할 수 있다.

    이는 hello1.txt는 버전 관리를 한 적이 있지만 hello2.txt는 한번도 버전관리 한 적이 없기 때문에 발생하는 차이다

     

    근데 뭐, 만약 둘 파일 모두 버전 관리를 하고 싶다면 둘 다 Staging Area에 올리면 되는 건 다름이 없다.

    git add hello1.txt , git add hello2.txt를 입력하면되는데 굳이 이렇게 하지 않고 

     

    1
    git add .

     

    이렇게 하면 모든 파일을 한번에 Staging area에 올릴 수도 있다. 

    응용해서 add 뒤에 특정 디렉토리 명을 적을 경우 그 특정 디렉토리 안의 파일만 모두 올릴 수도 있다.

     

    아무튼 파일을 Staging Area에 올리고 git status를 보면 

     

     

    이렇게  두가지 파일 모두 잘 올라가 있는 걸 확인할 수 있다. 커밋 후 log를 보면

     

     

    Message 3이란 메모로 버전이 잘 생성된 걸 확인할 수 있고

    좀 더 상세히, 연루되어 있는 파일들 목록까지 확인할 수 있게

     

    1
    git log --stat

     

    을 입력하면

     

     

    이렇게 좀 더 상세한 내용을 확인할 수 있다.

     

    1
    git log -p

     

    를 입력하면 

     

     

    이렇게 더욱 상세하게, commit에 포함된 파일별 변경 내역까지 볼 수 있다.

     

    - 버전간의 차이점 비교

     

    파일 내용을 변경 후 가장 최근 버전과 현재의 차이점을 볼 수도 있다.

    예를 들어 hello1.txt에서 3이란 내용을 지우고 four란 내용을 추가한 다음

     

    1
    git diff

     

    를 입력하면

     

     

    이렇게 3이 빠지고 four가 추가된 내역을 확인할 수 있다.

     

    - checkout과 시간여행

     

    Git 을 이용해서 과거 버전으로 갈 수도 있다. git log를 입력해서 목록을 보면 

     

    각 commit 마다 ID가 있는 걸 알 수 있다. 이를 이용하면 되는데 예를 들어 Message 2때로 돌아가고 싶다면

     

    1
    git checkout 돌아가려는 commit id

     

    명령어를 입력하면 

     

     

    위와 같은 메세지와 함께 

     

     

    다음과 같이 git log를 확인해도 Message 2까지만 목록에 나타나고

    ls -al을 입력해도 hello1.txt만 나타나는 걸 확인할 수 있다.

     

    그러나 이는 이전 버전이 사라진 건 아니다. master는 최신 버전을 의미하는데

     

    1
    git checkout master

     

    명령어를 입력하고 git log와 파일 목록을 확인하면 

     

     

    Message 3와 hello2.txt가 다시 보인다. 

     

    즉 git checkout 명령어는 git이 가르키는 head를 특정 시점으로 옮길 수 있는 명령어임을 알 수 있다.

     

    - 버전 삭제

     

    만약 버전을 아예 삭제하고 싶다면 

     

    1
    git reset --hard 최신 버전으로 만들고 싶은 commit id

     

    를 입력하면 된다. 예를 들어 Message 2 로 reset 하면

     

     

    위와 같이 Message 2 위 메모를 적은 commit이 master가 되어있는 걸 볼 수 있다.

     

    이 때는 지금 마스터가 된 버전 이후의 버전들 뿐만 아니라 수정하고 있던 내역도 reset되는데 

    위 명령어에서 --hard를 --soft나 --mixed로 바꾸면 버전만 reset되고 수정하던 내역은 남길 수도 있다

     

    - 버전 되돌리기

     

    버전을 삭제하지 않고 되돌리기만 할 수도 있다.

    위에서 보듯 reset을 활용했을 때는 삭제 내역을 볼 수 없게 말 그대로 삭제되어 버리지만

    버전 되돌리기, 즉 git revert를 활용하면 그 내역 역시 남길 수 있다.

     

    예를 들어 hello1.txt에 R3, R4라는 내용을 추가하고 각각 R3, R4라는 메모를 남겨 commit했다고 하자

     

    ( 깨알 같이 하나 더 추가하자면

     

    1
    git commit -am "커밋메세지" 

     

    명령어로

     

     

    위와 같이 add와 commit을 동시에 처리할 수 있다. 다시 돌아가서 )

     

    이 때 내역을 남기면서 R4에서 R3로 돌아가고 싶다면

     

    1
    git revert 이전 단계로 되돌리려는 (내역을 남기고 없애려는) 버전 commit id

     

    를 입력하면 된다. 그러니까 git revert R4 commit id를 하면

     

     

    revert 4는 그대로 있고 Revert "R4" 추가된 걸 볼 수 있다. hello1.txt의 내용과 변경 내역을 보면

     

     

    이처럼 내용이 R3와 같은 상태인 것을 알 수 있다.

     

    이 Revert를 사용할 때 유의할 점이 있는데 단계를 뛰어넘어서 사용하면 충돌이 발생한다.

    예를 들어 R4가 Master인 상태에서 한번에 git revert Message 2 commit id를 입력하면 안 된다는 것이다.

     

    이런 처리를 하고 싶다면 git revert R4 commit id -> git revert R3 commit id -> git revert Message 2 commit id처럼

    단계적으로 역순으로 되돌아가야 한다. 

    반응형

    댓글

Designed by Tistory.