프로젝트 관리/github

메타코딩 -무작정 깃허브 찍먹하기 -4- (Git Merge 실습 및 rebase로 로그관리)

skrr 2023. 2. 22. 01:01

우선 gitworkspace에 ex05 폴더를 생성하고 git을 생성하자.

touch라는 명령어는 파일 생성 명령어다. 반대로 삭제 명령어인 rm이 존재한다.

캡쳐와 같이 회원가입, 로그인 폴더를 생성 add, commit 해 주면 되겠다. 이제 여기서 하고싶은게.. 아이디 중복체크를 만들고 싶은데.. main branch에다가 해도 되지만 topic이라는 브랜치를 만들어서 거기다가 해주자.

처음 git branch명령어를 입력 해 보면 현재 브랜치의 목록이 나오고, git branch 브랜치명 을 입력하면 새로운 브랜치가 생성 된다. git log를 확인 해 보면 head 로그인 쪽에 master, topic 브랜치 포인터가 있는걸 확인 할 수 있다.

그러면 git checkout이라는 명령어를 사용해서 마스터브랜치에서 topic브랜치로 이동 해주자. git checkout -브랜치명

그러고 touch를 입력해서 아이디중복체크 파일을 생성 add & commit을 하게 되면... git log를 찍어보면 어떤 상태가 될까?..

로그인에 마스터 브랜치 포인터는 그대로 있고, 아이디중복체크로 토픽브랜치 포인터는 이동 하게된다. 현재 작업 영역을 확인 해 보면..

로그인, 중복체크, 회원가입이 나란히 존재하는 것을 볼 수 있다. 그렇다면 CLI에서 master 브랜치로 이동하게 되면 어떻게 될까??.. ㅇㅇ; 

아이디 중복체크의 내용이 사라진 것을 알 수 있다. checkout 해보면 실시간으로 보임.. ㅇㅇ;

지금 이 상황을 그림으로 알아 보자면..

현재 master branch로 checkout을 했기 때문에 회원가입 로그인만.. 보이게 되고, topic으로 checkout을 하면 세개 다 보이게 되는 것이다. 현재는 master branch에 HEAD가 바라보게 만들고, merge TB를 해준다. 이렇게 되면, MB포인터가 아이디 중복체크를 가르키고 HEAD도 MB포인터를 따라간다. 지금은 별 다른 개발이 없으니 TB로 merge하나, MB로 merge하나 같은 내용을 보니까..

git merge (머지 할 브랜치 명) 이렇게 입력을 해 주면.. ex05폴더에 아이디중복체크가 다시 나오는 것을 볼 수 있고, git log를 확인 해 보면 master 포인터가 헤드와 함께 아이디중복체크를 바라보는 것을 알 수 있다.

이것이 fast-forword merge이다.

 

다음으로 3-way merge를 실습 해 보자.

gitworkspace에 ex06폴더를 생성하고 git init 후 회원가입 파일과 로그인 파일을 각각 add, commit 해 준다.  git log를 찍어보면??

제대로 만들어 진 것을 볼 수 있고, 그 다음으로 토픽 브랜치를 만들어 줄것인데.. 여기서는 새로운 명령어를 사용해 보았다. $git checkout -b topic 이라고 치면 topic 브랜치를 생성하고 생성한 브랜치로 checkout하게 해 달라는 명령어 이다. 그러고 git branch를 찍어보면 두개가 만들어지고 토픽으로 checkout 된 것을 확인 가능하다.(git branch 명령어를 사용 했을때 *모양이 현재 HEAD의 위치를 말해주는 것이다.)

현재 상태를 그림으로 표현

그러면 이제 MB쪽으로 HEAD를 옮겨서 글쓰기를 만들어 보자.

HEAD로 checkout을 하고, 글쓰기 파일을 생성 후 add & commit을 해 준다. 

그러면 위의 그림과 같은 상태가 된다. 이제 이 상태에서 merge를 할 것인데.. 

아이디 중복체크와 글쓰기를 한 점으로 merge하고 싶다는 것인데. 만약 아이디 중복체크로 fast-forword merge를 하게 되면, 글쓰기 기능이 날아가버리니 안된다. 

그래서 merge 시에는 세가지가 필요한데.. 두 기능의 공통 조상인 로그인과 글쓰기 기능, 아이디 중복체크 기능이 반영이 되게 merge가 되어야 한다. 그래서 이 것을 3-way merge라고 한다. 그러면 CLI창에 git merge topic이라고 입력 하면..

이런 형태로 뜨는데.. 위에 노란글씨로 적힌 부분이 log를 어떻게 남길 것인지에 대한 것이 적혀있는 것이고.. CLI내부에서 i를 누르면 입력모드로 바뀌어서 글자를 변경 할 수 있다. 딱히 변경 할 필요없으니 여기선 사용하지 않는다.

그리고 ESC키를 누른 후 :를 입력 하면 아래쪽이 명령모드로 바뀌는 것을 볼 수 있다. wq와 q의 명령어가 있다. q는 종료하기 이고 wq는 저장 후 종료하기 이다. wq를 습관화 하는게 좋다고 한다 강의에서는..

git log를 띄워보면, 아래에서 부터 회원가입, 로그인, 아이디 중복체크.. 그 다음에 글쓰기, merge branch 'topic' 아까 i로 수정하는 merge 로그가 남는 것이다. 실제로 merge 된 것은 글쓰기 까지 ~ 이상 3-way merge였다.

 

이제 할 것은 merge 충돌에 대한 것이다. 이번에 해 볼 시나리오는..

다음 그림과 같이 회원가입, 로그인 파일을 생성 후, 로그인 파일을 공통 조상으로 branch 분기를 해 topic을 생성 후 TB와 MB의 동일한 로그인파일수정 이라는 파일을 서로 수정 할 것이다.

그렇다면 위와 같이 master는 체크박스를, topic은 라디오버튼을 수정하게 될 시에.. 깃에서는 두개다 반영을 한 에러를 띄우며, conflict라는 메세지와 함께 사용자에게 선택권을 준다. 체크박스를 쓸건지.. 라디오버튼을 쓸건지 사용자가 직접 코드를 수정해서 커밋하면 된다. 이제.. 해보자.!

gitworkspace로 가서 ex07폴더를 생성 후 git bash CLI를 실행 후.. git init, 로그인 파일 생성 스샷 내용처럼 내용 수정/저장 후 add, commit 해 준다. (저장을 안해서.. 내용없이 들어가서 commit이 첫 commit이라서 git reset을 못써서.. 걍 폴더 삭제 후 재 시도를 했다.) 

그러고는 git checkout -b 명령어로 topic 브랜치를 만든 후 이동을 한다. 이동 후에 로그인 내용을 체크박스로 수정해주고, topic브랜치에서 해당 수정된 내용을 add, commit을 해 준다. 다시 master 브랜치로 돌아 가주자.

git checkout 명령어로 마스터 브랜치로 이동 후 로그인 파일을 키면 로그인 버튼으로 되어 있을텐데.. 그 것을 로그인 라디오 버튼으로 수정/저장 후 add & commit 을 하고 merge를 하게 되면 충돌이 일어나게 된다. 한번 해보자.

merge를 해보면 conflict(충돌) 이 뜨게 된다. 내용을 보자면.. Merge 충돌이 로그인.txt에서 떳다.. 자동 머지는 실패 했으니까 충돌 수정 후 커밋을 해라.. 뭐 대충 이런뜻이다.

그러고 로그인.txt 파일을 열어보면 <<< 어쩌구저쩌구 세줄이 생긴 것을 볼 수 있다. 그니까 <<<<HEAD 기준으로 위에껄 쓸꺼냐 밑에껄 쓸꺼냐라고 물어보는 것이다. 만약에 내가 체크박스가 쓰고싶다 하면..

나머지 것을 지우고.. <<<HEAD, ====경계선 이딴것 다 지워주고 쓰고 싶은 내용들을 수정해서 commit을 해 주면 된다. 

왜 커밋을 해야하냐면 git status를 찍어보면 빨간색 줄로 변경감지가 나오기 때문에 git add 후 충돌 수정메세지로 commit을 다시 해 주면 적용이 된다. 이렇게 하는 것이 병합을 관리하는 방법이다.

웬만하면 같은 파일을 동시에 수정하는 일은 없는편이 낫다. 앵간한 회사는 각자 소스를 분산해서 나눠주기 떄문에 겹칠 일이 별로 없다. 여기까지 merge 충돌 해결

 

그러면 이제.. rebase로 로그 관리를 해보자. 시나리오를 작성 해 보자면..

commit log를 4가지 찍어준다. 환경설정 아래로 쭈루룩.. 주황색 로그가 여러개로 퍼져있는게 마음에 안드는 상황인데.. rebase해서 어떻게 바꾸고 싶냐면 오른쪽 분홍색 선처럼 바꾸고 싶은 것인데 그전에 squash라는 뜻을 알아야 하는데 위의 그림과 같은 뜻이다. 

그러면 이제 찌그러뜨릴때 어떤 점으로 찌그러뜨릴지가 중요한데..  파란점 두 점이있는데.. 어느쪽으로 찌그릴꺼냐면.. 항상 최신에서 과거로 찌그러 뜨려야한다. 만약 반대로 찌그러뜨리게 되면 어떻게 될까.. 퇴근로그 날아가고 아픔로그 날아가니까 완료 로그가 중간에 붕 뜨게된다. 그러니까 퇴근쪽으로 모든 코드를 모우게 된다.

제일 과거 로그가 pick이 되고 나머지가 squash가 된다. 두개만 하고싶을땐 pick squash를 하나씩만 해 주면 된다. 그러면 현재 HEAD가 완료쪽에 가 있게되는데... 만약 다 찌그러뜨리고 싶으면 위의 그림 명령어 처럼 사용 해 주면되고, 두개만 하고 싶으면 헤드~2로 해 주면 된다. 그러면 실습 해 보자..

ex08 폴더를 생성 후 git bash를 키고 init후 환경설정 생성 및 add, commit을 해주고 로그인 파일을 생성하던 중 회사를 퇴근 하게 되었다는 시나리오.. 뭐 그뒤로도 파일 쭉쭉 생성 및 add & commit 을 해 주고 스샷과 같은 상태를 만들어 준다.

그리고 touch 명령어 사용 시 띄워쓰기를 쓰게 되면 여러개의 파일이 만들어진다. touch 이런 명령어는 리눅스에 bash라는 쉘이 있는데.. 그 쉘 명령어이다. 나중에 배포를 배우게 된다면 개념을 잡을 수 있다고 한다. AWS, 도커 이런것들 강의에서 나올듯.. 

git rebase -i HEAD~3 이라고 명령어를 입력 하면 위의 캡쳐처럼 VI에디터가 열린다. i키를 누르면 밑에 하단의 INSERT 모드가 되는데 위로 올라가서 위의 상태를 수정 해 주면된다. 원래는 제일 상단 퇴근이 pick이고 나머지가 s여야하지만 여기 밑에 옵션 중에 drop을 먼저 써 보도록 하자. ESC버튼 누른 후 :적고 wq로 enter 키로 저장 후 종료 한다.

그러고 나온 후에 git log를 찍어보면.. 중간의 로그가 완전 사라져있는 것을 볼 수 있다. 그러면 아파서 퇴근 그 파일의 코드가 사라진 상태인데 사라지면 안되기 때문에 복구를 해야한다. git reflog를 사용해서 살려보자. 

해보면 위에 CLI창에 드래그 된 부분이. rebase라고 적혀있는데. 저 세 줄이 rebase 할때 적용이 된 것이다. 

그러면 다시 삭제 전으로 돌아가야 하니 rebase 직전 해쉬값으로 reset하면 살릴 수 있다.

git reset --hard 951f 이렇게 명령어를 입력 해 주면.. rebase 전으로 살아난다. 그러면 다시 rebase로 가보자.

명령어를 입력후 VI에디터가 열리면 흠 이번엔 새로운 커맨드를 입력 해 보자.. i키 입력 후 INSERT모드로 바꾸고 이번엔 reword, r을 써 볼 것이다. 그러면 아파서 퇴근에 r를 입력 해 주고, ESC 누른 후.. :를 입력 후 wq로 엔터치고 나오면 좀 색다른 창이 나오게 될 것이다.

수정 창이 뜨면..  INSERT모드로 다음과 같이 수정 후 마찬가지로 ESC + : wq입력하고 엔터 갈기면.. 

커밋로그가 바뀐것을 볼 수있다. 킹치만 파일명은 안바뀜.. 왜냐?.. 커밋로그만 reword 했응게.. ㅇㅇ;; 그러면 이제 진짜 하겠다고 한 찌그러뜨리기를 해 보자. 세개를 찌그러뜨리는 원리가 뭐냐면.. 커밋된 로그들만 날리는 것이다. 로그인 완료 커밋 날리고, 꾀병 날리고 파일들은 남아서 로그 하나에 묶이는 것이다. 그러면 다시 rebase를 해보자.

다시 git rebase -i HEAD~3 명령어를 입력 하고 INSERT모드 i입력 , 꾀병, 완료에 squash를 뜻하는 s입력, 퇴근에 pick입력 후 ESC + : , wq 엔터를 하면..

다시 INSERT모드 드가서.. 위에 로그인 퇴근 지우고.. 밑에 꾀병 지우고.. 로그인 완료도.. 완료를 지우고 로그인만 남겨두자 그러고 ESC + : wq 엔터를 하면..

다시 CLI창으로 나와지고 git log를 입력 해 보면, 아주 간단하게 요약이 된 것을 볼 수있다. 보면 파일은 그대로 남아있음..

이상 rebase로 로그 관리까지.. 끝!