ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명령어로 Git을 사용하자! Git CLI ( 협업 )
    Knowledge/Git 2019. 11. 28. 21:16
    반응형

     

     

     

     


     

     

     

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

     

    - 협업자 초대하기

     

     

    다른 개발자와 협업을 진행하려는 원격 저장소의 Settings를 클릭하면

     

     

    협업을 진행할 다른 Github 유저를 추가할 수 있고 admin, writer, read등의 권한을 부여할 수 있다.

    그러나 git 계정이 하나 뿐이니 실습은 그냥 clone을 활용해 진행한다.

     

    - Push & Pull

     

     

     

    a가 work.txt 파일을 위와 같이 작성 후 add -> commit -> push한 후

     

     

    b가 pull하지 않고 같은 파일을 위과 같이 작성 후 add -> commit -> push하면

     

     

    위와 같은 경고문과 함께 push가 반려된다.

     

     

    뒤늦게 pull을 하면 충돌이 발생했다는 내역이 보이고

     

     

    실제로 충돌이 발생한 걸 볼 수 있다.

    mergetool을 활용하든, 텍스트 에디터를 활용하든 수동으로 merge 한 후 commit -> 그래프 log를 보면

     

    ( 그래프 log 는 git log --all --graph --oneline 을 입력하면 볼 수있다.

     이게 길어서 입력하기 귀찮다면 alias를 활용해 줄일 수 있다

     

    git cmd 창에서 nano ~/.gitconfig 를 입력하셔서 설정 파일을 열고


    [alias]
    l = log --all --graph --oneline

     

    위와 같은 내용을 추가하면 git l 명령어만 입력해도 그래프 로그를 볼 수 있다. )

     

    위와 같이 잘 merge된 걸 볼 수 있다.

     

    물론 이렇게 해결 가능하지만 가장 좋은 건

    작업하기 전엔 pull을 먼저하고 작업 단위로 자주 push를 해서 이런 충돌이 발생하지 않도록 하는 게 가장 바람직하다

     

    git pull VS fetch 그리고 원격 브랜치

     

    위에서 배운 git pull과 같은 역할을 git fetch -> git merge FETCH_HEAD 명령어를 통해서도 수행할 수 있다.

    근데 pull을 사용하면 될 것을 왜 따로 사용하는 걸 배우는 것일까?

     

    이를 이해하기 위해선 원격 브랜치를 이해해야 한다. 아래를 보자

     

     

    위 스크린샷에서 초록색 master는 지역저장소의 master branch를 가르키고

    빨간색 origin/master는 연결된 원격 저장소 중에 origin이라는 이름의 저장소의 master branch를 가르킨다.

     

    이를 확인하기 위해 work.txt를 수정하고 work 3a라는 메모와 함께 commit한 후 로그를 보면

     

     

    지역저장소의 master branch가 orgin/master보다 한단계 앞서 있는 걸 볼 수 있고, 이는

     

     

    git status를 입력해도 안내해준다. 그러다가 push를 하고 로그를 보면

     

     

    다시 지역저장소의 master branch와 origin의 master branch가 같은 곳에 위치하게 된 걸 확인할 수 있다.

    이 상태에서 이용자를 b로 바꿔서 git fetch 명령어를 입력한 후 log를 보면

     

     

    지역 저장소의 master branch 보다 origin의 master branch가 더 앞서 있는 걸 확인할 수 있다.

    즉 git fetch는 원격 저장소의 branch를 가져오기만 하는 명령어인 것이다.

     

    그럼 이제 가져온 원격 저장소의 master branch를 지역저장소의 master branch와 병합해야 한다.

    그걸 수행하는 명령어가 바로 git merge FETCH_HEAD다.  입력하고 로그를 보면

     

     

    git pull을 했을 때 처럼 지역 저장소의 master branch와 origin의 master branch가 일치해 있는 걸 볼 수 있다.

     

    위에서 git pull = git fetch -> git merge FETCH_HEAD라고 했던 말의 의미는 이것이다. 

    git의 data를 좀 더 신중하게 가져오고 싶을 때는 git pull 대신

    pull의 기능을 fetch와 merge FETCH_HEAD로 분할해 진행하는 이 방법을 선택하면 된다.

     

    - git으로 오픈소스 참여하기

     

    push 권한이 없는 프로젝트에 참여하고 싶은 경우 작업한 내역을 프로젝트에 포함시키기 위해선 두가지 방법이 있다.

     

    1. patch ( 당장 나한테 필요한 건 아닌 것 같아 동영상으로 대체 )

     

     

    2. pull request

     

    pull request는 말 그대로 프로젝트의 메인테이너에게 pull해달라고 요청하는 것이다.

    이는 git 자체의 기능이라기보다는 github같은 git hosting 서비스들이 제공하는 기능이다.

     

    pull requeest( a. k. a. pr )를 하기 위해선 먼저 fork를 해야한다.

     

    참여하고 싶은 오픈 소스 프로젝트의 github 에 들어가면 

     

     

    표시한 fork라는 버튼이 있는데 이를 클릭하면

     

     

    포크로 무언가를 떠오는 모션의 로딩 이미지가 나오고 잠시 기다리면

     

     

    Original과 똑같은 형태의 프로젝트가 내 계정의 Repository로 똑같이 복제된 것을 볼 수 있다.

    내 계정의 Repository로 복제해 온 것이니 이를 사용하는 방법도

    내가 직접 만든 원격 저장소를 로컬 저장소로 옮겨서 쓰는 방법과 같다

     

    clone -> test.txt 파일 생성 -> add -> commit -> push의 과정을 거치면

     

     

    push 까지 잘 되는 것을 확인할 수 있고 스크린 샷 우측 상단에 표시한 compare를 클릭하면

     

     

    내가 변경한 master branch의 내역과 facebook react  master branch사이의 원본과의 차이도 볼 수 있다.

     

    여기서 표시한 create pull request 버튼을 누르면

     

     

    이렇게 코멘트를 남겨서 pull request를 보낼 수도 있다. ( 실제로 보내지는 않았습니다 )

    클릭해서 요청을 보내면 그걸 당겨줄 지 말지는 이제 메인테이너의 몫! 

     

    아무튼 pull request는 이렇게 보낼 수 있다

     

     


    추가

     

    위의 과정을 따라 진행했는데 new pull request를 눌렀을 때

     

     

    위와 같이 create pull request 버튼이 비활성화 되어 있는 경우가 있을 수 있습니다.

    이 때는 표시한 'compare across forks' 버튼을 클릭해서

     

    위와 같이 설정되어 있는 head repository 를 fork해 간 본인의 repository로 변경하면

     

    pull request를 생성할 수 있습니다.

     

    반응형

    댓글

Designed by Tistory.