Error기록 노트/Git

[git] git clone, git pull, git fetch, git merge는 각각 언제 써야할까?

에러노트 2023. 9. 10. 02:10

안녕하세요. 에러노트입니다.

오늘은 작업 중 시원하게 제 이전 git들을 날려버리며 깨달은 것을 여러분에게 알려드리려고 합니다.🤣

여러분들은 제 글을 보시고 꼭 저같은 실수를 하지 않길 바라며 뼈 아픈 실수와 함께 사용 시 쉬운 구별법을 알려드리겠습니다.

*주의 사항 : 더보기를 참고!

더보기

각 프로젝트의 팀원, 규칙, 방식 등은 회사와 팀마다 다를 수 있기 때문에 사수나 팀의 규칙이 존재한다면 제 글보다는 우선 프로젝트 팀원들끼리 상의 하에 진행하는 것을 권합니다.

git을 사용할 때는 늘 신중의 신중을 가하시어 저와 같은 큰일이 나지 않길 바랍니다.


저의 경우 프로젝트 진행 시, 저 포함 팀원이 총 3명인 프로젝트였습니다. 인원이 적고 저희 회사는 관리를 철저하게 분리해서 하는 편이 아니었기 때문에 저희는 브랜치를 많이 나누지 않는 쪽을 선호하였습니다. 메인 브랜치와 fetch 브랜치만 가지고 가는 형식이었음을 미리 알려드리고 진행하겠습니다.

설명 드리기 전에 '이게 뭐야?' 싶은 용어 2가지를 설명드리고 가겠습니다.

- 로컬 : 내 컴퓨터와 같이 개인 컴퓨터에서 작업하는 환경.
- 리모트 : 원격 저장소. 즉, github과 같이 어떤 웹 호스팅 서비스에 git push로 상태를 업데이트하였다면 리모트가 업데이트 되었다고 말할 수 있습니다. (로컬에서 리모트로 상태 업데이트 되었으니 '상태가 업데이트 된 상태'라 할 수 있습니다.)

 

1 . git clone과 git pull  도대체 언제 쓰는게 맞아?

- git clone은 내 로컬 저장소(작업하려는 위치)에 git 레포지토리를 복사해오는 명령어입니다.

git clone을 쓰는 경우는 대표적으로 기존 프로젝트 레포지토리가 존재하고 그것을 복사해와야 하는 경우, 즉 새로 프로젝트를 시작하거나 중간에 합류하게 된 경우가 있겠죠? 그외에도 다른 환경셋팅을 위해 다른 컴퓨터에서 작업하기 위해 복사해오는 경우에도 clone을 씁니다. 또한, 프로젝트의 버전이 크게 변경점이 있을 정도라면 git clone을 통해 받아오는 것이 저의 경우에는 맞았습니다.

틀이 바뀌거나 쓰는 버전이 다른 등 병합하기 힘들정도로 너무 많이 다른 경우에는 git pull을 강제로 하면 이전 작업이 날아가버리기 때문에 git clone이 맞았다는 것을...뼈 아픈 저의 실수를 통해 알게 되었습니다. 임시 브랜치를 별도로 파두는 방법도 있는데, 저는 생각이 너무 짧아 극단적인 강제 pull을 하였지만, 여러분들은 각자 상태에 따라 잘 살펴보시길😂

- git pull은 최신 업데이트 된 레포지토리의 push 내역(변경사항)들을, 로컬 저장소(현재 작업중인 위치)에 불러와 병합(merge)하는 명령어입니다.

git pull은 대표적으로 팀원 중 git push를 한 인원이 있어서 해당 내용을 병합하여 자신도 git push를 할 일이 있을 때 git pull로 자동 병합을 쓰는 경우가 있죠. 하지만 git pull은 사용할 때 주의할 점이 많습니다.

기본적으로 자동병합이 되기 떄문에 git pull을 하다가 충돌이 나게되면, 문제가 되는 부분을 주석으로 표기하여 충돌이 난 부분을 알려줍니다. 해당 주석 부분은 일일히 수동으로 해결해야만 합니다.

버전이 달라진 정도의 프로젝트라면 git pull을 바로 받기 전에 스탑하시고 아래 내용을 참고해주세요.

그럼 어떻게 쓰냐구요?

2. git fetch와 git merge, git pull의 차이점과 쓰는 방식의 차이

- git merge는 현재 작업 중인 브랜치와 다른 브랜치(로컬이나 리모트)를 병합할 때 사용합니다.

프로젝트를 함께 하는 팀원과 merge를 통해 병합 후 git push를 진행하는 경우가 가장 대표적인 merge의 사용법이죠. 그외에 프로젝트내 버전이 업데이트 되는 경우 아예 별도의 브랜치를 생성하는 경우도 존재하기 때문에 어떤 것이 더 효율적이라고는 단정할 수 없지만, 저의 경우 이전 버전이 계속 사용되는 일이 없었기에 이전 버전을 별도로 두지 않고 정리하고, 업데이트 된 버전을 main과 merge하였습니다.

merge를 하기 전에 상대방의 상태와 현재 최신의 상태도 알아야 충돌 또는 순서가 꼬이는 문제가 없겠죠?

- git fetch는 pull와 달리 원격 저장소의 최신 상태(이력)만을 가지고 옵니다. commit이력, push 이력과 같이 팀원들이 최근에 업데이트한 사항들을 가져옵니다. 하지만 pull과 달리 병합하지는 않고, 상태만 동기화시킵니다.

git log 		 //그냥 status를 하면 로컬에서 내가 쓴 commit과 병합한 사항들의 이력만 조회가 됩니다.
git fetch origin 	 //현재 로컬 상태보다 최신의 사항들을 모두 가져옵니다.
git log 		 //다시 살펴보면 최근에 팀원이 commit 또는 push를 한 이력들이 추가로 모두 조회 됩니다.

 

기본적으로 git fetch origin을 하면 fetch라는 임시 브랜치를 자동으로 생성하며 이동합니다. 그 후 status나 log를 살펴보면 앞서 최신 상태들을 불러왔기에 현재 로컬의 위치보다 앞선 상태들이 몇개인지, 어떤 부분이 변경되었는지 알 수 있습니다.

git fetch를 진행한 뒤에는 선택할 수 있는 병합의 방법이 3가지로 나뉘면서 git 자체적으로 힌트가 제공됩니다.

git pull과의 차이점은 여기서 발생합니다.

git pull은 fetch와 자동 merge를 동시에 적용하는 명령어라면, git fetch는 어떻게 병합할 것인지를 pull과 달리 먼저 살펴본 뒤에 선택할 수 있습니다.


오늘은 이렇게 각각 언제, 어떻게 쓰이는지에 대해서 정리해보았습니다.

비슷한 듯 하지만 자세히 보면 전혀 다른 목적인 4가지 명령어에 대해 감이 좀 잡히셨길 바랍니다.

제 삽질을 여러분들의 꿀팁으로 승화해보았습니다. 저도 정리하면서 이제 명확하게 쓰임이 구분되었습니다.🥳

도움이 되셨다면 하트와 댓글 부탁드립니다 :)