
본격적으로 git을 이용하여 협업을 할 수 있습니다.
remote 저장소는 네트워크 어디인가 있는 저장소를 의미합니다. 아래의 코드들은 한 repository를 각자 한명씩 fork한 상황을 가정합니다.
$git remote add upstream <Repo URL>
git remote -v
nr@nrcom:~/testNB$ git remote -v
upstream https://github.com/gg/testNB.git (fetch)
upstream https://github.com/gg/testNB.git (push)
origin https://github.com/gyu716625/testNB.git (fetch)
origin https://github.com/gyu716625/testNB.git (push)
git clone 명령으로 origin리모트 저장소는 자동적으로 추가되고 remote add 명령으로 원하는 git의 repository의 HTTPS를 가져와 원하는 이름으로(위에서는 upstream을 사용) 리모트 저장소를 추가할 수 있습니다!
이때, 저장소를 연결한다고 하는 것보단 로컬에서 두 저장소를 바라보고 있다라고 이해하는 게 더 편했습니다.
A 로컬에서 clone한 파일을 수정하고 add, commit하고
$git push origin master 명령을 사용하면 fork된 repository가 수정됩니다.
그 때, B 로컬에서 $git pull upstream master명령을 사용하면 사용자 A의 수정된 repository와 사용자 B의 파일이 동기화 되고 commit 기록 또한 가져옵니다.
반대의 경우 역시 마찬가지 입니다.
만약 B가 일정 라인이 update되어있는 상태에서 A가 그 라인을 수정하고 저장한 뒤 pull 명령을 사용하지 않고 바로 push를 하게 되면 어떻게 될까요?
reject됩니다!
lnr@nrcom:~/testNB$ git push upstream master
Username for 'https://github.com': gyu716625
Password for 'https://gyu716625@github.com':
To https://github.com/gg/testNB.git
! [rejected] master -> master (fetch first)
error: 레퍼런스를 'https://github.com/gg/testNB.git'에 푸시하는데 실패했습니다
힌트: 리모트에 로컬에 없는 사항이 들어 있으므로 업데이트가
힌트: 거부되었습니다. 이 상황은 보통 또 다른 저장소에서 같은
힌트: 저장소로 푸시할 때 발생합니다. 푸시하기 전에
힌트: ('git pull ...' 등 명령으로) 리모트 변경 사항을 먼저
힌트: 포함해야 합니다.
힌트: 자세한 정보는 'git push --help'의 "Note about fast-forwards' 부분을
힌트: 참고하십시오.
그럼 pull을 이용해 변경사항을 적용 해봅니다.
충돌이 일어납니다!
lnr@nrcom:~/testNB$ git pull upstream master
Username for 'https://github.com': gyu716625
Password for 'https://gyu716625@github.com':
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 2 (delta 0), pack-reused 0
오브젝트 묶음 푸는 중: 100% (3/3), 완료.
https://github.com/gg/testNB URL에서
* branch master -> FETCH_HEAD
d45bcce..4272452 master -> pair/master
자동 병합: test3.js
충돌! (내용): test3.js에 병합 충돌
자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.
자동 병합이 실패했다고 설명합니다.
이는 B가 $git push origin master로 변경을 하였는데 A에 이미 저장해놓은 파일이 있는데 같은라인이 다르게 수정이 되어있기 때문에 git에서 병합을 어떤 코드로 할 지 자동적으로 선택을 못해줬기 때문입니다.
실제로 VScode를 통해서 보게 되면,
<<<<<<< HEAD
function print(x){
return x;
}
=======
function add(x){
return x + x;
}
>>>>>>> eea65d80aaf237a7c0cce28e00ea4607c8a7aac9
이런식으로 코드가 변해있는 것을 확인할 수 있습니다.
======= 의 위쪽 부분이 로컬저장소를 즉 A를 의미하고, 아래쪽이 remote의 변경내용을 즉 B를 의미하는데, 이때 충돌을 바로 잡으려면 둘중 어떤 변경사항을 적용할 지 선택하거나 둘 다 모두 추가하는 방법 또한 사용할 수 있습니다. 이에 맞춰서 수정을 해주고 add, commit, push 과정을 거치면 됩니다.