Git - Remote, Conflict

nRecode·2020년 4월 27일
0

Git

목록 보기
2/3


본격적으로 git을 이용하여 협업을 할 수 있습니다.
remote 저장소는 네트워크 어디인가 있는 저장소를 의미합니다. 아래의 코드들은 한 repository를 각자 한명씩 fork한 상황을 가정합니다.

Remote 저장소 추가하기

$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을 사용) 리모트 저장소를 추가할 수 있습니다!

이때, 저장소를 연결한다고 하는 것보단 로컬에서 두 저장소를 바라보고 있다라고 이해하는 게 더 편했습니다.

Push, Pull

A 로컬에서 clone한 파일을 수정하고 add, commit하고
$git push origin master 명령을 사용하면 fork된 repository가 수정됩니다.

그 때, B 로컬에서 $git pull upstream master명령을 사용하면 사용자 A의 수정된 repository와 사용자 B의 파일이 동기화 되고 commit 기록 또한 가져옵니다.
반대의 경우 역시 마찬가지 입니다.

Conflict

만약 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 과정을 거치면 됩니다.

profile
안정성, 확장성 있는 서버를 구축하고 가꾸는 개발자를 목표로 공부하고 있습니다. 🤔🤔🤔🤔 부족하기에 맞지 않는 내용이 있을 수 있습니다. 가감없이 피드백 해주시면 정말 감사하겠습니다..🙏

0개의 댓글