이전 글 되풀이 요약을 하자면 git으로 다른 개발자와 협업을 하는 상황에서
git push를 하기 전에 git pull을 해야할 떄가 많다고 했었다.
그리고 git pull은 리모트 레포지토리에 있는 branch를 가져와서
현재 brancgh에 자동으로 merge하는 커맨드라고 했었다.
(이때 branch를 가져온 다는 것은 그 branch가 가리키고 있는 커밋 이전에 이루어진 모든 커밋을 가져온다는 뜻)
그런데 merge는 하지 않고 딱 가져오는 단계까지만 해주는 커맨드도 있다.
Git fetch
fetch는 우리말로 가져오다 라는 뜻을 가지고있으며
여기서 fetch를 실행하면 가져오기만하고 자동으로 merge는 되지 않는다.
git pull읋 하면 자동으로 merge 까지 해주니까 편할 것 같은데 왜 굳이 fetch 커맨드를 써야할까?
git fetch는 리모트 레포지토리에 있는 브랜치의 내용을 일단 가져와서 살펴본 후에 merge 하고 싶을때 사용한다.
이렇게 해야하는 경우는 여러가지 있을 수 있는데 일단 한번 실행해보자
예를 들어 어느 한 개발자가 README 파일을 바꿨다고 가정해보자
근데 코드내용이 잘못된 방향으로 건드려 문제가 생겼다고 해보자
다른 개발자의 실수를 가정하기위해 premium 브랜치의 README에 들어가서 아무거나 적어주고 커밋해주자
커밋 해주고 터미널로 돌아가서 git pull 해주면
다른 개발자가 코드를 어떻게 추가했는지 모른채 내 프로그램에 자동으로 저 문구가 merge 돼버린다.
물론 git pull 하고나서 혹시나 이상한 코드가 merge 된건 아닌지 직접 확인 해줄 수 있지만 귀찮아진다.
이런 식으로 git pull 하기 의심 스러울때 사용 해주는 커맨드가 바로 git fetch이다.
git fetch로 리모트 레포지토리의 branch 내용을 가져오기만 하는게 좋다.
실행 해보면 오리진에 있던 premium brancgh의 커밋이 로컬 레포지토리로 들어오게된다.
저 레드박스 표시는 지금 리모트 레포지토리에 있는 branch의 내용이 로컬 레포지토리로 들어왔다는 뜻이다.
리모트 레포지토리의 입장에서는 그냥 premium 브랜치 이지만
로컬 레포지토리에서 리모트에있는 premium 브랜치는 origin/premium 으로 나타낸다.
이제 로컬 레포지토리에 있던 premium 브랜치와 리모트 레포지토리의 premium 브랜치 간에
어떤 차이가 있는지 비교해보자 (=git diff)
git diff는 커밋 간의 차이 뿐만아니라 branch 간의 차이를 볼 때도 쓸 수있다.
로컬 레포지토리는 그냥 diff 뒤에 premium 써주면 되고
한칸 띄워서 리모트 레포지토리의 premium 브랜치는 origin/premium 써주면 된다.
git diff premium origin/premium
지금 리모트 레포지토리의 premium 브랜치 에서는
README 파일의 '###나는바보다' 문구가 추가 되어있는 것을 볼 수있다.
자 그러면 리모트 레포지토리의 premium branch에 문제가 생긴걸 봤는데
여기서 해결방법이 두가지있다.
1. 잘못된 코드를 추가한 개발자를 찾아가서 코드를 지우고 다시 리모트 레포지토리에 올려달라고 하기
2. 그냥 본인이 잘못된 부분 해결하고 다시 git push 하기
필자는 후자로 정하였고 이 상태에서 리모트 레포지토리의 premium 브랜치를 merge 해보자
git merge origin/premium
실행 하고 한번 해당 파일을 보면 잘못된 코드가 보인다.
제거해주고 저장한다음 다시 커밋을 해주자
git add README.md
git commit -m "나는 바보다 삭제"
git push
정상적으로 지워진것을 확인했다.
정리
git fetch는 리모트 레포지토리에서 가져온 브랜치의 내용을
merge하기 전에 확인해봐야 할 필요가 있을 때 사용한다.
아니면 리모트 레포지토리에 있는 branch 내용과 내 코드를 비교해서
혹시 본인이 작성한 코드에 잘못된 부분이 없는지 검토해야할 때에도 사용한다.
다른 개발자 뿐만 아니라 자기가 잘못된 코드를 쓰게 될 수도 있기 때문이다.
어떤 경우든 fetch로 가져와서 diff로 서로 비교하면서 확인하면 된다.
중요한건 git pull은 결국 git fatch를 하고 자동으로 merge까지 해주는 커맨드라는 사실이다.
그렇다면 git pull과 fetch중에 무엇을 써야할까?
상황마다 다르지만
굳이 리모트 레포지토리의 브랜치를 검토할 필요없이 바로 합치고 싶을땐 pull
한번 더 검토할 필요가 있다면 fetch 쓰면 된다.
'Git' 카테고리의 다른 글
(실무_4) Git Part2 - git revert / 리모트 레포지토리에 올라간 커밋 취소하기 (0) | 2024.09.11 |
---|---|
(실무_3) Git Part2 - git blame / 코드 작성자 찾기 (0) | 2024.09.10 |
(실무_1) Git Part2 - git push 전 git pull 하기 (0) | 2024.09.10 |
Git (17)~(22) 커맨드 정리 (0) | 2024.09.10 |
(22) Git -merge [심화] (0) | 2024.09.10 |