Git

Git 협업 관련 지식

배씌 2024. 12. 31. 16:46

git push 전에 git pull 해야 하는 경우가 많다.

ex) premium 브랜치의 License 파일을 수정해야 함

 

- 리모트 레포지토리 > premium 브랜치 > License

# 기본 라이센스
Premium

 

- 로컬 레포지토리 > premium 브랜치 > License (수정)

# 기본 라이센스
Premium
- Enterprise use : 500$ per month

 

위와 같이 로컬 레포지토리의 License 파일을 수정했다. 그러나, 이 작업을 하고 있을 때 다른 개발자 B가 먼저 License 파일을 수정하여 git push 를 실행했다.

 

- 리모트 레포지토리 > premium 브랜치 > License (B가 수정)

# 기본 라이센스
Premium
- Educational use: 10$ per month

 

이 상황에서, 나는 리모트 레포지토리가 수정된 지 모르고, git add . 후 git push 하려 했다. 그랬더니, 아래 처럼 오류가 발생했다.

 

현재 리모트 레포지토리에 다른 내용이 있기 때문에, 내 코드를 바로 git push 할 수 없다.

-> git pull 을 먼저 한 후 내용을 추가하여 다시 git push 해야함

 

그러나, 현재 로컬 레포지토리와 리모트 레포지토리의 내용이 다르기 때문에 pull 시에도 conflict 가 발생한다. 이때, 이전에 학습한 conflict 발생 시 해결 방법 중 merge 후 코드 수정 방법을 사용하면 된다.

(왜인지, git pull 로는 바로 pull 이 안돼서, 옵션을 추가했다.)

git pull --no-rebase

 

위 커맨드를 실행시키면 이전처럼 conflict 가 발생한 채로 merge가 되는데, 이때 License 파일을 수정한 후 git add . 을 실행시키면 정상적으로 add 및 push 가 가능하다.


위 상황에서는  git pull 보다 git fetch가 적절하다.

  • git fetch : 리모트 레포지토리에 있는 브랜치 내용을 일단 가져와서 살펴본 뒤 merge 하고 싶을 때 사용

만약 리모트 레포지토리의 브랜치에 문제가 있다면, 

 

해결 방법

  1. 잘못된 코드를 추가한 개발자에게 수정하고 다시 리모트 레포지토리에 올려달라고 하기
  2. 잘못된 부분을 알아서 수정하고 다시 git push 하기

2번 방법을 위해 fetch를 사용할 수 있다.

 

위 사진과 같이 git fetch를 통해 (리모트 레포지토리 > premium 브랜치 -> 로컬 레포지토리 > premium 브랜치) 로 내용을 가져온다.

이후, git diff 커맨드 사용

git diff [현재 브랜치][비교할 브랜치]

 

내용 비교 후, 잘못된 부분을 수정하기 위해 로컬 레포지토리로 merge. 잘못된 부분 수정 후 git add . -> git push

따라서, git pull = git fetch + merge 와 같다.

이미 리모트 레포지토리에 올라간 commit 을 취소해야 할때

  • git revert [커밋 아이디] -> git push

잘못된 코드를 git add . -> git push 했을 때,

git revert 로 커밋을 되돌린 후, 다시 git push 로 리모트 레포지토리에 적용

 

여러개 commit 한번에 취소

  • git revert [커밋 아이디1]..[커밋 아이디2] : [커밋 아이디1]+1 ~ [커밋 아이디2] 까지 커밋 모두 취소 (커밋 아이디1 다음 커밋 부터 삭제됨. 시작 인덱스 포함 X)

12a4 : Create README.md

06d5 : Make README.me look nice

-> 12a4 다음 커밋인 0349 커밋 부터 06d5 커밋까지 삭제 (2개 삭제)


Git 협업 정리

  • git fetch : 로컬 레포지토리에서 현재 HEAD 가 가리키는 브랜치의 업스트림(upstream) 브랜치로부터 최신 커밋들을 가져옴
  • git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력
  • git revert : 특정 커밋에서 이루어진 작업을 취소하는 커밋 생성