티스토리 뷰

나에게 git공부를 하게 만들었던 녀석이다.

이게 무슨 소린지 몰라서 너무 많은 분들을 오래 기다리게 했다.

이제 책 한권 봤으니 쟤를 뜯어보자.

 

1. git config pull.rebase false

일단 위 상황을 만들기 위한 세팅을 완료했다.

나의 로컬저장소는 첫 번째 커밋만 있고 원격저장소에 누군가 두 번째 커밋까지 올려놓은 상태이다.

이제 첫번째 커밋을 base로 하여 충돌이 발생하는 두 번째 커밋을 만들고 푸시를 해보자

원격에 로컬에 없는 작업이 있어서 거부되었다. 대게 같은 저장소에 다른 누군가가 푸시를 했을 때 발생한다. 꽤 친절하다.

즉 아래와 같은 상황이라서 push 할 수 없게 되었다. 그러면 먼저 Pull해서 상황을 해결해 보자

만났다.

서로 다른 브랜치가 있어서 이를 조정하는 방법을 설정해야 한다. 아래 세 가지 옵션 중 하나를 선택해서 pull 할 수 있다.

읽어보니 해당 저장소에서 Pull을 할 때 어떻게 할 건지 방법을 지정하라는 뜻이다. pull.rebase false를 선택하면

리베이스를 하지 않고 병합커밋을 하나 더 만들면서 병합이 되는 것 같다.

pull.rebase true는 pull 할 때 리베이스 시켜서 병합커밋이 따로 생기지 않고 최신 커밋 위쪽으로 가져다 붙이는 옵션이겠지

ff only는 fast-forward 상황일 때만 pull 하라는 것 같다. 하나씩 해보자

일단

git config pull.rebase false를 해보자

옵션을 지정하고 Pull을 했더니 워킹트리로 가지고 왔다. 그리고 충돌이 있음을 알려주고

fix conflicts and then commit the result라고 알려준다.

vscode로 충돌을 해결하고 status를 찍어보니 modified상태의 file1.txt를 볼 수 있다.

시키는 대로 충돌을 해결 후 스테이지에 올리고 커밋을 남긴다. 로그를 찍어보면

모든 커밋들이 잘 합쳐졌고, 충돌을 해결한 병합커밋이 생겼다. 이 병합커밋은 원격에 충돌 없이 올릴 수 있는 상태가 된다.

다음에는 똑같은 조건을 만들어 git config pull.rebase true를 해보자

 

 

2. git config pull.rebase true

git config pull.rebase true로 설정하고 Pull을 받았더니 다른 메시지가 나온다.

rebase를 할 때 나오는 메시지인데 충돌이 있는 부분을 해결하고 git rebase --continue를 실행하라는 뜻이다.

리베이스는 커밋을 하나씩 비교하면서 충돌이 있는지 확인하기 때문에 여러 번 같은 곳을 수정했다면 

git rebase --continue를 할 때마다 여러 번 충돌이 날 수 있다.

충돌을 vscode에서 해결하고 계속해보자

충돌 해결 후 git add를 해줬다. 그리고 commit을 남기고 git log를 확인해 보니

일단 두 번째 커밋 위에 가져다 붙이면서 병합커밋은 안 생긴 것 같다.. 근데 왜 HEAD만 따로 떨어져 왔을까

이것은 리베이스를 잘못 써서 그런 건데, 충돌해결 후 add를 해줬으면 continue를 해서 다른 커밋들도 검사를 계속해줘야 한다.

만약 검사를 해서 문제가 없으면 아래처럼 Successfully rebased and updated 가 나온다.

이렇게 되면 병합커밋 없이 세 번째 줄 추가 커밋이 리베이스 위쪽에 달라붙어서 커밋내역을 깔끔하게 유지할 수 있다.

 

2. git config pull.ff only

오직 fast-forward 상황일 때만 pull 하라는 뜻이다.

내가 만들어 실습한 상황은 fast-forward가 아니니까 pull을 할 수가 없다. 이런 경우에는 

fetch 해서 merge 할지 아니면 rebase를 할지 명시적으로 입력을 해줘야 한다.

그러면 위 사진처럼 병합커밋을 만들지, 커밋을 조작해서 최신커밋 위로 가져다 붙일지 선택할 수 있다.

 

git config pull.rebase false : ff상황에서는 그냥 ff, 아닐 때는 병합커밋을 만든다.

git config pull.rebase ture : ff상황에서는 그냥 ff, 아닐때는 리베이스를 시킨다.

git config pull.ff only: ff상황에서만 ff, 아닐때는 경우에 따라 개발자가 선택한다.

 

이렇게 요약할 수 있겠다. 리베이스는 커밋내역을 조작하는 기능이기도 하고 깃을 잘 이해하지 못하고 사용하면 

커밋내역이 완전히 꼬여버릴 수 있다. 게다가 나와 같이 프로젝트를 하는 개발자도 나와 비슷한 상태이므로

우리는 아직 병합커밋을 만들어서 명시적으로 언제 병합했는지 알 수 있게끔 하기로 했다. 

git 스터디를 진행한 후에 각자 브랜치에서 rebase를 연습하고 다시 협의해서 사용하기로 하자.

자유자재가 되면 ff.only도 유용하게 사용할 수 있겠다!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/04   »
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
글 보관함