• GIT

[GIT] git 기본사용 reset / revert / merge / rebase

man_on 2022. 5. 15. 03:00
반응형

 

 

 

     


     

    Git

     

     

    The world's most popular version control system. (VCS)

    - Version control 버전관리는 파일의 변화를 시간에 따라 추적하고 관리하는 것을 도와주는 소프트웨어이다.

    - 이전버전의 파일을 다시 볼 수 있게 해주고 버전들간의 혹은 파일들간의 변화를 비교하거나

       변화를 되돌리고, 다른 작업자들과 그 변화를 공유할 수 있도록 해주는 등의 다양한 역할을 한다.

     

     

     


     

     

    - git 최초설정 (name과 email을 빼고 입력하면 설정된 상태 확인가능)

    git config -global user.name "name"
    git config -global user.email "email"

     

     

    - 기본브랜치명

       (기본 브랜치명이 master로 설정되어있어서 main으로 변경)

    git config --global init.defaultBranch main

     

     

     

    - 새로운 파일 생성 후 vscode에서 열고 git으로 관리를 시작

    git init

        명령어 입력 후 폴더에서 숨김파일 보기(command + shift + .)를 하면 git 폴더가 생성된 것을 볼 수 있다.

        이 폴더안에 git이 관리하는 코드가 저장된다. (만약 이 폴더를 지우게 된다면 저장된 코드가 날아가는것!)

     

     

     

     

     

     

     

     

     

    프로젝트 관리시작

     

     

     

    🔻 git status

       : 현재 폴더의 상황을 git의 관점으로 나타내준다.

    git status

    파일 2개를 만들었고 git에 아직 추가되지않음을 나타내줌

     

     

     

     

    🔻 .gitignore

         : git에 저장하지 않을 것들 ( 굳이 저장할 필요가없거나, 민감한 정보의 것들은 gitignore파일을 만들어서 넣어준다.)

         

    untracked files : git 관리에 들어가지 않은 파일

     

     

     

    [ .gitignore 형식 ]

    // 모든 file.html
    file.html
    
    //최상위 폴더의 file.html
    /file.html
    
    //모든 .html 확장자 파일
    *.html
    
    // .html확장자지만 무시하지 않을 파일
    !not_ignore_this.html
    
    //logs란 이름의 파일 또는 폴더와 그 내용들
    logs
    
    //logs란 이름의 폴더와 그 내용들
    logs/
    
    //log 폴더 바로안의 debus.log와 .c 파일들
    logs/debug.log
    logs/*.c
    
    //logs 폴더 바로 안, 또는 그 안의 다른 폴더(들) 안의 debug.log
    logs/**/debug.log

     

     

     

     

     

     

     


     

     

     

     

     

    기본 git 사용

     

     

     

     

    commit을 시간순으로 묻힌 한 버전들이라고 생각한다.  (타임캡슐)

    add로 타임캡슐에 담을 파일들을 추가하여서 타임캡슐(commit)들을 만들어서 코드들을 저장한다.

     

     

     

    🔻 Add

        : ommit에 담을 파일들을 추가

    //파일 하나 담기
    git add 파일이름
    
    //모든 파일 담기
    git add .

     

    [참고] Vi 모드

    더보기
    git commit

     

    • Vi 입력모드로 진입
    • 입력 시작 - i
    • 입력 종료 - ESC
    • 저장없이 종료 - :q
    • 저장없이 강제 종료 - :q!
    • 저장하고 종료 - :wq
    FIST COMMIT

     

    입력한 뒤 종료

     

     

    🔻commit

    git commit -m "메세지"

     

    🔻 log

        : 만들어진 commit들을 확인

    git log

    (J로 내릴수있음) :q 로 빠져나온다

     

    sourcetree에서도 확인가능

     

     

     

     

     

     

    📌 add와 commit 한꺼번에 ( 새로 추가된 untracked 파일이 없을 때 한정 )

    git commit -am "메세지"

     

     

     

     

     


     

     

     

     

     

    Reset / Revert

     

     

     

    ✔️ commit으로 묻어두었던 타임캡슐들을 파내어서 과거시점으로 돌아가는 방법에는 2가지가 있다.

     

     

     

    🔻 Reset

       : 원하는 지점의 commit으로 이동한다. ( 돌아간 commit과 현재의 commit사이는 사라진다.)

    C1으로 이동하여서 C2는 사라짐

     

        여러 사람들과 협력 시 한번 공유공간에 올라간 내역을 reset으로 되돌려버리면, 

        다른사람들과 충돌이 발생할 수 있으므로 한번 공유한 commit은 revert를 사용하여 되돌리는 것이 좋다.

     

     

    git reset --hard 되돌릿커밋hash

    commit 뒤에 있는 값중 일부발췌하여서 해시값으로 사용

     

     

     

    [ Sourcetree에서 reset 사용시 > 해당 커밋으로 초기화 ]

     

     


     

     

    🔻 Revert

       : 원하는 지점의 commit의 반대로 수행하는 commit을 새로 추가한다.

         추가한 것이 있으면 삭제, 변경한 것이 있으면 원래대로 돌려서 결론적으로 해당 commit을 하기전으로 돌아간다.

         reset은 이후 시점들을 모두 지워버리므로, 변경분을 되돌리고 되돌린 내용을 기록하려면 revert를 사용한다.

     

     

     

    중간의 commit은 그대로 유지하면서, 과거의 어느 한 지점만 취소하고 싶을 때 revert로 쉽게 돌릴 수 있다.

     

     

    git revert 되돌릴커밋hash

    되돌리고 싶은 commit이 맞다면 wq로 저장하고 실행
    second commit이 revert됨

     

     

    충돌 발생시 충돌해결 후

    git revert --continue

     

     

     

     

    🌟 commit을 남기지않고 revert (원하는 다른작업을 추가한 다음 함께 커밋)

    git revert --no-commit 커밋의HASH

    취소하려면

    git reset --hard

     

     

     

     

     

    [ Sourcetree에서 revert 사용시 > 커밋 되돌리기 ]

     

     

     

     

     

     


     

     

     

     

     

     

    Branch

     

     

     

    Branch : 분기된 가지

    • 프로젝트를 하나 이상의 모습으로 관리 할 때 ( 실배포용, 테스트서버용 등 )
    • 여러 작업들이 각각 독립되어 진행될 때 ( 기능1, 기능2, 코드개선, 긴급수정 등 )
    • 이 모든 것들을 하나의 프로젝트 폴더에서 진행할 수 있도록 브랜치를 이용한다.

     

     

     

    - 브랜치 생성

    git branch 브랜치이름

     

     

    - 브랜치 목록 확인

    git branch

    :q 로 빠져나온다.
    아직 싹만틔운상태!
    commit을 하면 가지가 생긴다.

     

     

    - 브랜치 이동

       : 기존에 checkout 명령어가 Git 2.23 버전부터 switch, restore로 분리되었다.

    git switch 브랜치이름

     

    - 브랜치 생성과 동시에 이동

       : 기존의 git checkout -b

    git switch -c 브랜치이름

     

     

     

     

    - 브랜치 삭제

    git branch -d 브랜치이름

     

     

     

    - 브랜치 이름 바꾸기

    git branch -m 기존브랜치명 새브랜치명

     

     

     

     

     

     

     


     

     

     

     

     

     

    Merge / Rebase

     

     

     

    branch를 병합하는 방법에는 merge, rebase 두가지 방법이 있다.

     

     

     

    🔻 Merge

       : 두개의 가지를 하나로 병합하는 새로운 commit이 생성된다.

         메인 브랜치에 병합하려는 branch의 변화들을 한꺼번에 적용하게된다.

    초록branch를 파란main에 merge하는 노란 commit 생성

     

     

     

     

    [ merge 사용 ]

     

    ✔️ main브랜치로 이용해서 병합할 브랜치를 merge 한다. ( :wq로 자동입력된 커밋 메세지 저장하여 마무리 )

    git merge 병합할브랜치이름

     

    four 브랜치가 main으로 merge

     

     

     

    ✔️ merge후 병합된 branch는 삭제해준다.

    git branch -d 병합된branch

     

     

     

    ✔️  merge도 하나의 commit이기때문에 reset으로 되돌리기 가능하다. (merge하기 전 해당 브랜치의 마지막 시점으로)

          병합된 commit생성 이전의 a commit으로 reset

    git reset --hard a-hash값

     

     

     

     

    [ Sourcetree에서 merge]

    main에 위치하고 병합할 브랜치를 우클릭하여 'Merge 브랜치명 into main'을 클릭한다. (병합)

     

     

     

     

     


     

     

     

     

     

    🔻 Rebase

       : 원하는 branch의 commit들을 지정 branch에 옮겨다 붙인다.

     

     

        

     

     

    rebase를 하면 하나의 branch로 병합되어서 히스토리가 없게 깔끔한 한줄이 되고,

    merge는 히스토리, 내역의 흔적이 그대로 남아있다는 차이점이 있다.

    ( rebase는 잔 가지들을 다 잘라서 몸통줄기에 하나로 이어붙이는 것! )

     

    따라서 브랜치의 사용 내역들을 남겨둘 필요가 있다면 merge, 히스토리를 깔끔하게 만드는게 중요하다면 rebase를 사용한다.

     

     

     

     

    [ Rebase 사용 ]

     

    ✔️merge와 반대로 병합할 브랜치로 이동해서 rebase를 한다.

    git rebase main

    기존
    two브랜치를 main으로 rebase

     

      여기서 끝난것이 아니라!

      현재 two브랜치는 main에 합쳐졌지만, main 브랜치는 two의 뒤에 뒤쳐져 있는 상황!

      따라서, main브랜치로 이동 후 two브랜치의 시점으로 merge시켜줘야 한다. (fast-forward)

    git merge rebase한브랜치명

    main과 two 브랜치가 같은선상에 위치되었다.

     

    two브랜치가 최종적으로 main에 합쳐졌으므로 two 브랜치는 삭제해준다.

    git branch -d 병합된브랜치명

    rebase 최종

     

     

     

    [정리] rebase할 브랜치로 이동 후 rebase 한 뒤 main으로 이동하여 merge하고 병합된 브랜치를 삭제해준다.

     

     

     

     

     

     

    [Sourcetree에서 rebase]

     : 병합할 branch에 위치하고 main브랜치를 우클릭하여 'main으로 현재 바뀐 내용 재배치' 클릭

     

      rebase후 main이 뒤쳐져 있을 시 main으로 이동하여서 병합한 branch를 merge시켜주고 완료.

     

     

     

     

     

     


     

     

     

     

     

     

    Conflicts 해결

     

     

    🔻 merge 충돌 해결하기

        main branch 에서 merge시 conflict 발생

       4가지 option중에서 선택하거나 다른수정사항으로 수정 뒤 저장하고 add-commit으로 병합완료

     

     

      ✔️ 당장 충돌 해결이 어려울 경우 merge 중단

    git merge --abort

     

     

     

     

     

    🔻 rebase 충돌 해결하기

       : merge는 하나의 commit으로 병합하는 것이라 한번 conflict를 해결하면 되지만,

       rebase는 합치고싶은 branch의 commit들이 main으로 붙는것이라 commit의 개수만큼 차례로 conflict를 해결해야한다.

     

     

     

     

    rebase 실행 후 conflict가 일어나면 해결한 뒤 add로 추가해준 뒤

    git add .

     

     

    ✔️ rebase를 계속 진행해준다.

    git rebase --continue

     

      ✔️ 당장 충돌 해결이 어려울 경우에는 rebase 중단

    gito rebase --abort

     

     

    → commit을 하라는 안내가 뜨면 :wq로 저장하고 다음으로 넘어간다.

    → 또 conflict가 발생하면 반복

    → 완료되면 main으로 이동해서 merge 시켜준다.

    → 병합된 branch는 삭제시켜준다.

     

     

     

     

    [Sourcetree에서 conflict 해결]

     

    merge시 충돌발생 > 안내창 확인 > Uncommitted changes 상태 > 충돌해결 > commit

     

     

     

     

     

     

     


     

     

     

     

     

     

    반응형