( 출처 : https://wikidocs.net/book/7060 )

4. github로 협업하기

상황 가정 :

figure2


4-1. clone

github에 저장되어 있는 파일/기록들을 복사하여, 새로운 local repository를 구성

  • 이때, github 상의 repository를 복제하기 위해 git clone 사용

    ( git clone [원격 저장소 주소] )

  • 당연히 .git 폴더도 함께 복사됨

    ( 이력 및 tag 정보 또한 함께 있음 )


( User2가, user1이 생성한 원격 저장소를 clone하는 상황 가정 )

figure2

  • 원격 저장소의 주소 : `https://github.com/sguys99/SimpleTest.git


clone한 원격 저장소 살펴보기

  • git log --oneline
  • git remote
  • git remote show origin


user2 사용자 설정

$ git config user.name User2
$ git config user.email User2@gmail.com


4-2) push & pull

User1의 작업

  • 특정한 작업/수정을 진행한 뒤, commit & push
$ git commit -am "Modify OnBnClickedMsgBtn to print # of clicks"
$ git push


현 상황 :

figure2


User2의 작업

  • 특정한 작업/수정을 진행한 뒤, commit & push하면, 에러 뜰것!

  • 이유? NOT UP-TO-DATE!

    ( 우선, pull로 가장 최신상태를 가져와야! )

$ git pull


현 상황 :

figure2


$ git commit -am "Modify OnBnClickedResetBtn to print # of removed contents"

$ git push


현 상황 :

figure2


User1도, 이제 마찬가지로 pull해야함! (생략)


4-3) 충돌 해결

충돌 상황 가정 :

  • User2는 새로운 기능을 추가하고 commit, push를 완료

    ( User1은 이 사실을 모름 )

  • User1도 필요한 작업을 마치고 commit을 완료…하려했으나 충돌 발생


User 2의 작업

  • Step 1) 코드/파일 내용 수정
  • Step 2) commit & push


User 1의 작업

  • Step 1) 코드/파일 내용 수정

  • Step 2) commit….까지는 잘 되었으나!!!

    PUSH에서 에러 발생

$ git push
-------------------------------------------------
To https://github.com/sguys99/SimpleTest.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/sguys99/SimpleTest.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

hint: Updates were rejected because the tip of your current branch is behind ( 뒤쳐져있으므로 )


  • Step 3) pull……을 하려 했으나!!
    • 충돌 발생! ( in SimpleTestDlg.cpp )
$ git pull
-----------------------------------------
Auto-merging SimpleTest/SimpleTestDlg.cpp
CONFLICT (content): Merge conflict in SimpleTest/SimpleTestDlg.cpp
Automatic merge failed; fix conflicts and then commit the result.


  • Step 4) git diff 로 local & 원격의 차이 확인
$ git diff origin/master master
--------------------------------------------
diff --git a/SimpleTest/SimpleTestDlg.cpp b/SimpleTest/SimpleTestDlg.cpp
index 246f36e..df11a95 100644
--- a/SimpleTest/SimpleTestDlg.cpp
+++ b/SimpleTest/SimpleTestDlg.cpp
@@ -176,10 +176,14 @@ void CSimpleTestDlg::OnBnClickedResetBtn()
 {
  둘 간의 차이가 나는 내용
 }
  • 직접 소스코드를 수정해야!
    • User2 & User1의 변경분 모두 반영!
  • 그런 뒤, 해당 변경 사항을 commit해야함!


  • Step 5) git commit -am "Merge origin/master"

  • Step 6) git push


[ Tip ] 충돌 발생 시 merging을 취소하고 싶다면?

  • git merge --abort


4-4) fetch & merge

상황

  • User2은 주니어 개발자
  • 따라서, User1이 User2의 내용을 검토 후에 merge하려함


앞서 말했 듯, git pull을 하면, 아래의 2가지 process가 내부적으로 진행됨

  • 1) fetch : 원격 저장소의 정보 -> local 저장소
  • 2) merge : 변경된 정보를 local 저장소의 내용과 병합


User 2의 작업

  • Step 1) 코드/파일 수정
  • Step 2) commit & push


User 1의 작업

  • User1이 바로 pull을 진행…? NO! 아직 믿을만하지 못해…
  • 따라서, User2가 작업한 내용에 오류/개선사항 “검토 후에” 본인의 local로 merge하고픔


git fetch

  • git fetch를 수행한다.

    ( but, 로그/코드에는 변경사항 X …. 아직 merge를 안했기 때문에 )

  • git diff master origin/master 를 하면, User2의 수정사항들이 확인 가능하다.

=> 여기서, User1는 User2의 수정 사항 중, 일부를 개선시키고싶다.


2가지 방법

  • 방법 1) User2로 하여금, 고치게 하고 다시 push하게끔
  • 방법 2) 답답해서 그냥 User1이 스스로 고침 => 이 방법 선택


  • Step 1) git merge origin/master
  • Step 2) 맘에 안드는 부분 수정하기
  • Step 3) git commit -am "Modify AddNumbers function to reduce operation time"
  • Step 4) git push


[ 요약 ]

  • git fetch : 원격 저장소의 내용을 로컬 저장소로 가져오기
  • git diff origin/master master : 원격 저장소의 master와 로컬 저장소의 master 브랜치의 참조 commit의 차이 비교
  • git merge origin/master : 원격 저장소의 master 브랜치의 내용을 현재 로컬 브랜치에 병합


4-5) blame

blame = ‘탓’

  • 코드의 각 부분을 “누가 작성했는지” line 별로 확인하기

git blame [파일경로]

  • ex) git blame ./SimpleTest/SimpleTestDlg.cpp
$ git blame SimpleTest/SimpleTestDlg.cpp
----------------------------------------------------------------
^635225a (User1 2021-10-14 15:37:26 +0900   1) 
^635225a (User1 2021-10-14 15:37:26 +0900   2) // SimpleTestDlg.cpp: 구현 파일
^635225a (User1 2021-10-14 15:37:26 +0900   3) //
^635225a (User1 2021-10-14 15:37:26 +0900   4)
^635225a (User1 2021-10-14 15:37:26 +0900   5) #include "pch.h"
(생략)


특정 commit의 작성자 정보를 확인하려면..

  • git blame [commit hash] [파일경로]
    • ex) git blame 2e1f053 SimpleTestDlg.cpp


[ 요약 ]

  • git blame [파일경로] : 파일의 작성자 정보 확인
  • git blame [commit hash] [파일경로] : 해당 commit의 파일 작성자 정보 확인
  • git blame -L [시작 line], [종료 line] [파일경로] : 특정 구간의 작성자 정보만 출력
  • git blame -e [파일경로] : 작성자 이름 대신 이메일 정보 표시
  • git blame -s [파일경로] : 이름, 날짜 정보를 생략하교 hash만 표시

Categories:

Updated: