ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Gitn] GIT CLI - Branch, BackUp(push, pull, clone), Conflict
    생활코딩/Gitn 2021. 1. 27. 14:03

    Branch

    # git remote add 원격저장소 주소

    같은 뿌리를 가졌지만 서로 다른 역사를 써가고 있는 가지들

    깃 공식홈페이지(git-scm.com/book/ko/v2/Git-브랜치-브랜치란-무엇인가)에는 이렇게 나와있다: 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치다.

    # git branch  // 브랜치 목록 출력
    # git branch apple  // apple 브랜치 생성
    # git checkout master  // master 브랜치로 이동
    # git log --all --graph  // --all: 모든 브랜치를 보여주는 옵션, --graph: 브랜치 시각화해주는 옵션

    Merge

    브랜치들을 병합하는 작업. 이 커밋은 merge commit이라고 부른다. 같은 파일의 부분을 수정했다면 수정한 부분들을 합쳐서 최신 버전으로 만들어준다.

    # git merge o2  // 현재 master에 있는 상황에서 o2 브랜치와 병합하고 싶은 경우
    // 머지 커밋도 커밋이기 때문에 커밋메시지를 작성해주어야 한다.

     

    Conflict

    Merge 시에 같은 파일의 같은 부분이 서로 다르게 수정되었다면 문제가 될 수 있다. 이런 경우 머지 완료 후 에러메시지가 뜨고 Modified Both로 표시되기 때문에 해당 부분을 수정하면 된다.

    git은 기본적으로 3 way merge를 쓰기 때문에, 한 브랜치에서는 base(합치려고 하는 브랜치들의 공통의 조상)의 코드를 그대로 유지하고 다른 쪽에서만 수정한 경우에 대해서는 문제가 되지 않는다. base를 기준으로 달라진 부분을 우선해서 반영하기 때문이다. 만약 같은 부분을 동시에 고쳤다면 conflict가 나기 때문에 직접 수정해주어야 한다.

     

    mergetool

    # git config --global merge.tool p4mergetool

    병합을 도와주는 도구에는 p4merge 등이 있다. 아래 명령어로 기본값으로 지정해두면 머지시에 연동되어 유용하게 사용할 수 있다.

    자세한 설정은 p4merge 홈페이지에서 확인할 수 있다.

     

     

    git-flow

    깃을 사용하는 여러 사례 중 개발자들에게 널리 채택된 방식을 사용할 수 있도록 고안된 프로그램

    git-flow 관련해서는 이쪽 강의 참조: www.youtube.com/watch?v=EzcF6RX8RrQ&feature=youtu.be

     

    [강의출처] opentutorials.org/course/3840


    backup 관련 용어 정리

    Local Repository(지역 저장소): 데이터가 작성되고 저장되고 있는 컴퓨터

    Remote Repository(원격 저장소): 지역 저장소의 데이터를 저장해주는 (멀리 있는) 백업 컴퓨터

    Push: Local Repository에서 Remote Repository로 데이터를 업로드/전송하는 일

    Pull: Remote Repository에서 Local Repository로 데이터를 다운로드/가져오는 일, 보통은 추가된 부분을 가져오는 것을 말함

    Clone: Remote Repository에 있는 데이터를 Local Repository로 복사해와서 둘의 상태가 같도록 만드는 일

    Git hosting: Remote Repository를 저장해둘 서버를 외부 서비스를 이용해서 구축하는 일. 보통 github를 사용한다.

     

    원격저장소를 추가하려면

    # git remote add origin(원격저장소 별명) https://github.com/상세주소.git
    
    <!-- 추가한 주소는 아래처럼 확인할 수 있다. -->
    # git remote -v

    push가 처음이라면 아래와 같이 기본 저장소를 설정한다. 축약형인 -u을 써도 된다.

    # git push --set-upstream origin master

     

     

    백업해둔 데이터를 가져오는 경우는 2가지가 있다.

    1. 새로운 컴퓨터에 데이터를 가져오는 경우: 완전히 복제해야 하니까 Clone을 이용한다.

    # git clone https://github.com/상세주소.git 원하는-dir-이름-생략시-저장소명

    2. 이미 가져온 적이 있는 컴퓨터에 추가 내용을 업데이트 해서 동기화 하는 경우: Pull

    # git pull 원격저장소명-생략시-upstream

     

    오픈소스 프로젝트를 가져올 때도 clone을 이용할 수 있다.

    원하는 프로젝트에 가서 git 주소를 획득한 다음(ex github.com/git/git.git) 원격저장소명에 그 주소를 입력해주면 된다.

    # git clone https://github.com/git/git.git

     

     


    Collaboration feat.Conflict 처리

    협업시에 pull 누락 or 동시작업 등으로 commit 교통사고가 발생하면 push rejected가 난다.

    ex) A가 작업완료 후 Commit을 했는데, B가 A의 Commit이 반영되지 않은 상황에서 작업하고 새로 Commit한 경우,

    ~ updates were rejected because the remote contains work that you do not have locally.

    원격저장소에 있는 작업 중 당신의 로컬에 반영되지 않은 작업이 있다 라는 에러메시지가 뜬다.

     

    이를 해결하려면 먼저 pull을 하고, 충돌을 해결한 후 다시 push를 시도하면 된다.

    만약 A가 작업한 부분과 B가 작업한 부분이 겹친다면, pull을 시도했을 때 conflict가 난다.

    해당 conflict를 해결하고, 다시 add, commit 순으로 진행하면 된다.

    충돌이 있었기 때문에 커밋메시지에 Merge branch ~ 라인이 작성되어 있다. 더 쓰고 싶은 말이 있다면 여기에 추가하면 된다.

     

    pull과 fetch의 차이점

    fetch: 원격저장소의 내용을 origin/master, origin/HEAD 브랜치로 가져온다. 현재 상태는 HEAD -> (local) master로 유지된다.

    pull: 원격저장소의 내용을 가져오고 현재 상태(HEAD-> (local) master)와 병합해서 최신 상태로 만들어준다.

    pull: fetch + merge FETCH_HEAD

     

    *원격저장소에서 가져온 제일 최근의 패치내용은 .git/FETCH_HEAD에 저장되어 있으므로,

    merge 브랜치명 대신에 merge FETCH_HEAD를 쓰면 제일 최근 fetch와 merge할 수 있다.

     

    댓글

Designed by Tistory.