Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-16 00:00
관리 메뉴

nomad-programmer

[VCS/GitHub] git fetch, git pull: 원격 저장소와 로컬 저장소의 간격 메꾸기 본문

VCS/GitHub

[VCS/GitHub] git fetch, git pull: 원격 저장소와 로컬 저장소의 간격 메꾸기

scii 2019. 11. 26. 23:01

원격 저장소를 이용하다 보면 다른 누군가가 커밋할 경우가 있다. 예를 들면, 로컬 저장소에서 작업하는 도중에 다른 협업자가 원격 저장소를 먼저 변경할 수 있는 것 등이다.

이런 경우 git은 푸시를 허용하지 않는다. 로컬 저장소의 커밋들을 원격 저장소와 맞춰야 한다. 이럴 때 하는 것이 페치(fetch) 이다.

fetch 는 원격 저장소와 커밋들을 로컬 저장소로 가져온다. 사용자는 로컬로 가져온 커밋들을 자신이 여태까지 한 로컬 저장소의 작업과 적절히 병합해서 원격 저장소에 제출해야 한다.

원격 저장소의 커밋들을 로컬 저장소로 가져와 합하는 방법은 git fetch 와 git pull 크게 두 가지가 있다.

git pull 명령은 원격 저장소의 정보를 가져오면 자동으로 로컬 브랜치에 병합까지 수행하는 것이다. 하지만 풀(pull)을 이용해서 페치와 병합을 동시에 수행하는 것은 큰 단점이 있다. 어떤 내용이 병합되면서 바뀌게 뒤었는지를 알 수 없는 것이다. 물론 병합 시 어느 파일이 몇 줄 바뀌고 어떤 충돌이 발생했는지는 표시해주긴 하지만, 프로젝트의 세세한 부분이 어떻게 바뀌었는지는 전혀 파악할 수 없게 된다. 때문에 풀을 이용한 원격 저장소의 커밋 가져오기는 추천하지 않는다.

대신 페치를 이용해서 원격 저장소의 커밋을 가져오고, 로컬 저장소에서 이를 확인한 다음 수동으로 병합하는 방법을 추천한다.

git fetch 작업 흐름

로컬 저장소 원격 저장소(github)
  github 상에서 파일 수정
로컬 저장소 내용 변경과 커밋  
푸시 시도와 실패
페치
병합
푸시 재시도
  github 상에서 확인

 

github commit changes 항목의 옵션

  • update 파일이름: '파일이름'의 수정 내역을 남길 커밋 메세지를 입력. 커맨드 라인에서 커밋 메세지를 입력할 때의 첫 번째 행에 해당.
  • add an optional extended description: 자세한 설명을 남겨야 할 경우 추가로 커밋과 관련된 설명을 입력. 커맨드 라인에서 커밋 메세지를 입력할 때의 두 번째 이후 행에 들어가는 내용.
  • commit directly to the master branch: master 브랜치에 바로 커밋할 때 선택.
  • create a new branch for this commit and start a pull request: 풀 리퀘스트를 위한 새로운 브랜치를 생성할 때 선택.

원격 저장소와 로컬 저장소의 같은 브랜치가 다른 커밋을 가지고 있으면 아래와 같은 에러가 발생한다.

! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/사용자이름/저장소이름.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

힌트에서는 git pull 명령을 사용해보라고 알려주지만 git pull 보다는 git fetch, git merge를 이용하는 것이 안전하다.

이렇게 에러가 발생한다. git fetch 명령을 실행해 원격 저장소의 커밋 정보를 로컬 저장소에 가져온다. 원격 저장소의 master 브랜치와 로컬 저장소의 master 브랜치를 병합한 후 다시 푸시해야 한다.

git branch -a	// 현재 로컬 저장소의 모든 브랜치들을 볼 수 있다. remote한 저장소의 브랜치들까지도

로컬 저장소의 master 브랜치에 원격 저장소의 origin/master 브랜치를 병합하면 된다.

git merge origin/master 	// 충돌 발생

원격 저장소와 로컬 저장소에있는 파일이 같은 부분에서 다른 수정 사항이 있으므로 서로 충돌 발생

충돌 발생하여 수정해야 한다. 이럴 때 git diff 명령을 활용하여 변경 사항을 정확히 확인할 수 있다.

git diff 명령은 로컬 저장소의 브랜치와 원격 저장소 브랜치 사이에 어떤 차이점이 있는 지 미리 알아보는 명령이다. 이를 통해서 변경 사항을 정확하게 확인한 후 병합을 실행할 수도 있다.

만약, git pull 명령을 이용했다면 페치와 병합을 자동으로 수행해버려서 어떤 변경 사항이 있는 지 알기가 매우 어려워진다.

git diff 명령으로 파일을  수정한 후, git commit -a -m "커밋 메세지" 명령을 한다. 그 후 다시 git push origin master 명령을 실행하면 푸시 명령을 완료할 수 있다.

git pull origin master 		// 추천하지 않는다.

git pull 명령을 내리면 변경 내용을 가져오고 자동으로 병합한다. 자동으로 되기때문에 확인 힘듦.

Comments