git

[Git과 GitHub 입문] 4~6 변경사항 취소, 브랜치, 병합

EunaSon 2023. 10. 7. 18:22

4. 변경사항 취소하기

- 지난 강의 요약

* clone : 원격 저장소 (github) 의 내용을 내 컴퓨터에 복사해오는 것

* add : 내 컴퓨터에서 작업한 파일들을 스테이지 영역에 추가하는 것 (파일을 스테이지 영역에 올려야 커밋이 가능함)

* commit : 스테이지에 올라온 파일들을 가지고 커밋을 생성(=내 컴퓨터에 저장함) (=save)

* push : 커밋들을 원격 저장소(github)에 업로드함

 

 

새로 파일을 생성하면 소스트리에서 '스테이지에 올라가지 않은 파일' 에 생성한 파일이 뜸

파일을 '스테이지에 올리기' 하여 add 할 수도 있고, '스테이지에서 내리기' 로 add를 취소할 수도 있음

파일을 스테이지에 추가 후 '커밋' 을 누르면 커밋 메시지를 입력 후 '커밋' 클릭

커밋하면 Push 할 수 있음

깃허브 계정의 저장소에 가보면 push한 파일이 업로드 된 것 확인할 수 있음

 

변경사항 취소

- checkout을 이용하면 아주 쉽게 마지막 커밋으로 되돌아갈 수 있음

- sourceTree의 '코드물치 버리기' 기능을 사용하면 마찬가지로 마지막 커밋(저장)으로 되돌아가서 변경사항을 되돌릴 수 있음

 

코드뭉치 버리기를 이용해서 저장하지 않은 변경 내용 취소하기

파일을 변경 후 저장했으나 변경한 내용이 마음에 들지 않으면

소스트리에서 master > 스테이지에 올라가지 않은 파일 - 변경한 파일 클릭 > '코드뭉치 버리기' 클릭

=> 저장 전의 상태로 되돌아갈 수 있음


5. 브랜치의 개념

- 지난 강의 요약

* clone : 원격 저장소(github) 내용을 내 컴퓨터에 가져오는 것

* add : 스테이지에 내 컴퓨터에서 작업한 파일들을 추가하는 것

* commit : =저장(save), 스테이지에 올라온 파일들을 내 컴퓨터에 저장

* push : 원격저장소에 커밋들을 업로드

* 코드뭉치 버리기 : 마지막 커밋으로 되돌아가고 싶을 때 사용

 

- 이번 강의 요약

* 브랜치(branch) : 기능 변경을 하고 싶을 때 생성 및 사용함

* 머지(merge) : 한 브랜치의 내용을 다른 브랜치에 반영

* 체크아웃(checkout) : 저장소에서 특정 커밋이나 브랜치로 돌아가고 싶을 때 사용

 

가끔 변경사항을 되돌려서 다시 수정하고 싶을 때가 있음

그러나 함부로 변경사항을 취소하기에는 망설여질 때 / 주석처리하면 코드가 지저분해질 때

브랜치를 생성하여 사용함

 

되돌아갈 커밋을 우클릭 > 브랜치 클릭 => 해당 커밋으로부터 브랜치(여기서 새 브랜치이름:version2)를 생성

master(메인 브랜치)의 내용을 내버려두고, 해당 커밋에서부터 새로 개발할 수 있음 

브랜치를 더블클릭하면 해당 브랜치의 상태가 활성화됨

만약 master에서 새로 파일을 생성후 커밋했는데, 그 파일 없이 다시 개발하고 싶을 때는

이전 커밋에 브랜치를 생성하고 활성화해보면 생성했던 파일이 없어진 것을 확인할 수 있음(이전 커밋으로 되돌아간 상태)

특정 브랜치로 돌아가는 것을 깃에서는 checkout이라 함 

 

브랜치 : 기존 내용을 유지한 채 새로운 내용을 추가하고 싶을 때 사용함

체크이웃 : 특정 브랜치(혹은 커밋)으로 돌아가고 싶을 때 사용함

소스트리의 체크아웃 : 브랜치 이름을 더블클릭하는 것만으로 체크아웃 가능 

 

브랜치는 가상의 작업공간이며, 한번에 하나의 브랜치에서만 작업할 수 있음

version2 브랜치에서 작업하게 되면, 소스트리에서 version2 앞에 동그라미가 표시되고 있음(=현재브랜치, 헤드브랜치)

version2에서 파일을 변경하게 되면, 소스트리에서는 '커밋하지 않은 변경사항' 이 표시됨,

이를 클릭 후 스테이지에 올리고, 커밋메시지를 작성하여 커밋하게되면 브랜치 그래프에서 가지(branch)가 생기게 됨 (각 가지의 끝은 master와 version2의 커밋내용을 의미함)

 

version2의 변경내용이 마음에 들지 않으면 다시 master를 더블클릭하여 돌아가면 됨

 

master 브랜치에는 '최종 버전', 마지막 최종본을 저장함

일반적으로 작업할 때는 version2와 같은 다른 브랜치에서 작업하게 됨

 

브랜치에서 작업 후에는 두 브랜치의 내용을 비교해보고 둘중의 하나/혹은 master로 병합(merge)하게 됨


 6. 병합(merge) 살펴보기

병합이란?

하나의 브랜치를 다른 브랜치와 합치는 것을 의미함

현재 브랜치(기본, 바탕이 되는 브랜치, 현재 작업중인 브랜치)=헤드 브랜치

예를 들어 헤드브랜치가 master이고, 여기서 version2 작업을 해서 병합하게 되면,

version2의 내용이 master에 반영되게 됨

이때, 발생하는 몇 가지 상황을 알아보자

 

상황1. 헤드 브랜치에 변경 사항이 없는 경우

Learn Git Branching 이라는 사이트를 이용해 쉽게 이해해보자.

* help - 연습모드에서 쓸 수 있는 git 명령어 나타남

: commit, branch, checkout, cherry-pick, reset, revert, rebase, merge

* levels - 레벨 선택 -> 공부할 수 있음 // 끄려면 esc 누르면 됨

* reset - ???

* clear - 창에 입력했던 명령어들 사라짐

 

- 현재 화면

: main(=master) 브랜치가 2번 커밋했음

 

* git commit - 커밋

* git branch version2 - version2 브랜치 생성

 +) 브랜치 이름 옆의 별표(*)는 현재 헤드브랜치(작업중인 브랜치)를 표시함

 

- 현재화면

: 커밋 후 마지막 커밋에서 브랜치 생성(version2), 헤드 브랜치는 main 브랜치임

 

* git checkout version2 - version2 브랜치로 체크아웃 (= 소스트리에서 브랜치 이름 더블클릭 한 것과 같음)

: version2 브랜치 옆에 별표 표시됨 (체크아웃)

 

체크아웃 후 다시 커밋하게 되면 main은 그대로인데 version2에 새 커밋이 생기게 됨

* git checkout master - master 브랜치로 체크아웃

* git merge version2 (소스트리 - 'version2와 병합' 클릭) - version2의 커밋 내용이 main에 반영됨

= Fast forward. 아무일도 일어나지 않음

헤드 브랜치에 변경사항이 없고, 병합 대상 브랜치가 헤드로부터 시작된 경우.

보통 혼자서 작업할 때 발생하는 상황. 가장 쉬운 상황임

 

상황2. 헤드 브랜치에 추가적인 커밋이 생기는 경우

version2, version3 등 여러 개의 브랜치를 만들어서 기능을 만듦

version2로 기능을 완성했는데 merge 하는 것을 깜빡 잊고 version3의 기능도 만듦

version3 커밋 후 main으로 checkout하여 version3와 merge한 후

빠트린 version2도 merge하게 되면 새로운 커밋을 만들어내게 됨

 

이때 문제는 충돌(conflict)의 발생임

운이 좋다면 자동 머지가 될 수도 있지만, 두 커밋이 충돌을 일으킬 수도 있음. 이때는 수동으로 처리해줘야함 

 

version2, version3 브랜치 생성
version2 - 기능 구현
version2 병합없이 version3 기능 구현
main - version3와 병합
main - version2와 병합

 

충돌이 발생하면 에디터와 소스트리에서 확인할 수 있음

HEAD (현재 변경 사항) 으로 표시되는 부분이 원래의 내용

version2 (수신 변경 사항) 으로 표시되는 부분이 병합하면서 추가되는 내용임

 

이를 해결하기 위해 추가된 <<<< 와 같은 기호 등 불필요한 내용은 모두 지우고,

직접 필요없는 코드는 삭제, 필요한 내용은 살린 후 저장함,

소스트리에 가서 스테이지에 올리면 넣은 내용, 뺀 내용이 보여짐, 이를 커밋, 푸쉬하면 반영됨

 

더이상 필요없어진 version2는 삭제해도 됨

 

*** 병합해서 충돌이 안 나려면?

보통, 다른 파일에서 작업을 하면 충돌이 나지 않음

예를 들어 version3 - 메인파일에 내용을 추가, version4 - 새 텍스트파일을 추가한다고 할때,

main을 version3와 병합 후 version4와 병합하는 경우는 Fast forward 상황은 아니지만,

변경이 생긴 파일들이 겹치지 않으므로 충돌이 일어나지 않고 자동으로 병합됨