( 출처 : https://wikidocs.net/book/7060 )
4. github로 협업하기
상황 가정 :
4-1. clone
github에 저장되어 있는 파일/기록들을 복사하여, 새로운 local repository를 구성
-
이때, github 상의 repository를 복제하기 위해
git clone
사용(
git clone [원격 저장소 주소]
) -
당연히
.git
폴더도 함께 복사됨( 이력 및 tag 정보 또한 함께 있음 )
( User2가, user1이 생성한 원격 저장소를 clone하는 상황 가정 )
- 원격 저장소의 주소 : `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
현 상황 :
User2의 작업
-
특정한 작업/수정을 진행한 뒤, commit & push하면, 에러 뜰것!
-
이유? NOT UP-TO-DATE!
( 우선, pull로 가장 최신상태를 가져와야! )
$ git pull
현 상황 :
$ git commit -am "Modify OnBnClickedResetBtn to print # of removed contents"
$ git push
현 상황 :
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
)
- 충돌 발생! ( in
$ 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
- ex)
[ 요약 ]
git blame [파일경로]
: 파일의 작성자 정보 확인git blame [commit hash] [파일경로]
: 해당 commit의 파일 작성자 정보 확인git blame -L [시작 line], [종료 line] [파일경로]
: 특정 구간의 작성자 정보만 출력git blame -e [파일경로]
: 작성자 이름 대신 이메일 정보 표시git blame -s [파일경로]
: 이름, 날짜 정보를 생략하교 hash만 표시