TIL 2021.02.15

kyukim·2021년 2월 14일
0

TIL

목록 보기
36/163

🧐 TIL (Today I Learned)

1. 깃 PR 충돌

원인

step2가 충돌이 일어났다. 뭐가 원인인지 전혀 알 수가 없다. PawnTest에서 충돌이 난다고해서 충돌이 난 이유를 생각해봤다. 충돌난 이유는 step1이 merged 되고 upstream/kyu-kim-kr 가 업데이트 되었는데 로컬에는 upstream의 변경사항이 적용되지 않아서이라고 생각했다.

제 계정의 리모트 저장소는 생략하고 그림 그리면서 생각해봤습니다.

충돌 발생 그림으로 이해하기

그림1

  1. local에서 step1은 C3지점에서 PR을 날렸다.
  2. PR을 날리고 step2를 추가해서 다른 기능을 C6까지 구현했다.
  3. 그런데 PR을 날린 step1에서 리뷰어가 기능을 수정/추가를 요구했다.
  4. C7, C8 기능을 수정/추가 했다.
  5. 리뷰어가 approved 해서 최종적으로 step1이 upstream으로 merged 되었다.
  6. 이 시점 혹은 그 이전에 step2 또한 PR을 날렸었는데 conflict 발생한다.

추측

추측하기전에 local의 step1은 더 이상 필요없으므로 삭제한다.

  1. merged 되었을 때 upstream의 main 브랜치는 C8을 가리키고 있을 것 같다. 따라서, o/main도 C8을 가리키고 있다.
  2. local의 main을 upstream과 동기화하기 위해서 git pull 명령어로 변경사항을 가져온다.
  3. 그러므로, local의 main 또한 C8을 가리키게 된다. 그림으로 나타내면 아래 그림 2와 같을 것이라고 예상한다.

그림 2

문제 해결하기

그림 3

기본적으로 Pull Request는 내가 작업한 하나의 브랜치를 베이스 저장소의 하나의 브랜치로 pull (fetch & merge) 하는 것이다. 따라서, upstream의 줄기는 여러 갈래로 나뉘어지는게 아니 한줄기가 되어야 할 것이다. 그림들에서 그냥 upstream이라고 했지만 upstream/kyu-kim-kr 부분을 생략했던 것이다.

그래서 위에있는 그림 2에서 push하면 하나의 줄기가 아니라 C3부터 갈라져 나오는 여러 갈래의 줄기가 될것이다. 그래서 conflict 나는 것이다.

이 문제를 해결하려면 rebase를 통해 local의 커밋을 아래 그림 4와 같이 정리하고 push하면 문제가 해결될 것이라고 본다.

그림 4

2. PR 충돌의 진짜 원인

상황

  1. step1을 pr 보내고 step2를 pr 보낸다.
  2. step1은 리뷰어가 기능 수정/추가 요청해서 새로운 커밋들이 생긴다.
  3. step1은 merge되고 step2는 충돌이 생긴다.

오해

step2가 충돌이 생기는 이유는 step1에 새로운 커밋들이 생겨서 그런 게 아니다. step1이 merge 되면서 merge 커밋이 새롭게 생겼는데 step2 브랜치에는 merge 커밋이 적용되지 않았기 때문이다.

해결

이 문제를 해결하기 위해서는

  • rebase 하면서 충돌을 일으켜서 해결하거나
  • merge 커밋을 merge해서 충돌을 일으켜서 해결하거나
  • GitHub에서 충돌을 해결할 수 있다.

그림 1

그림1 은 충돌이 일어났을 때 해결하기위한 그림이다. step2가 충돌이 일어났다. upstream/kyu와 step2가 동기화가 안되서이다.

  1. 동기화하기 위해 먼저 kyu로 fetch 한다.
  2. step2 브랜치에서 kyu 브랜치로 merge나 rebase를 한다. 왜냐면 step2가 kyu를 가리켜야 upstream/kyu 와 동기화가 된다. (그림 2 참고)
  3. 동기화된 step2를 origin으로 push하면 충돌이 사라진다.왜냐면 이제는 step2랑 upstream/kyu 랑 같은 커밋을 공유하고 있기 때문이다. 같은 커밋이라 함은 step1이 merge 되면서 생긴 merge 커밋 같은 것 말이다.

그림 2

3. static {} 이 뭔가?

This is a static initialization block. Think of it like a static version of the constructor. Constructors are run when the class is instantiated; static initialization blocks get run when the class gets loaded.

What does Static {} mean in the Java Syntax?


✅To-do

  1. 체스만들기. 미션3

  2. 루카스에 있는 자바 공부할 거리 공부하기

  3. 생활코딩 객체지향 파트 (~~클래스 패스~~, ~~패키지~~, API, ~~abstarct~~, ~~final~~, ~~인터페이스~~, ~~다형성~~, ~~예외1 문법~~, ~~예외2 예외던지기~~, ~~예외3 만들기~~, ~~Object 클래스~~, ~~상수와 enum~~, 참조, ~~제네릭~~) 링크

  4. 인프런 김영한님 스프링 입문 강의 (14강/28강 (50.00%) | 시간 : 140분/321분) 링크

나중에 해야 할 To-do 링크


그 외

깃은 정말 어렵다. 계속 붙잡고 이해하려고 노력해야 이해할 수 있는 그런 거 같다. 팀원들과의 많은 대화가 가장 도움이 되었다. 디온이 답변해준 것도 정말 도움이 되었다

profile
제 생각이 담긴 블로그입니다

관심 있을 만한 포스트

2개의 댓글

comment-user-thumbnail
2021년 2월 15일

크 kyu 점점 잘해져가고 있으시네요.
다음에 kyu 만날때는 이것저것 많이 물어봐야겠어요 :)

1개의 답글