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)의 발생임
운이 좋다면 자동 머지가 될 수도 있지만, 두 커밋이 충돌을 일으킬 수도 있음. 이때는 수동으로 처리해줘야함
충돌이 발생하면 에디터와 소스트리에서 확인할 수 있음
HEAD (현재 변경 사항) 으로 표시되는 부분이 원래의 내용
version2 (수신 변경 사항) 으로 표시되는 부분이 병합하면서 추가되는 내용임
이를 해결하기 위해 추가된 <<<< 와 같은 기호 등 불필요한 내용은 모두 지우고,
직접 필요없는 코드는 삭제, 필요한 내용은 살린 후 저장함,
소스트리에 가서 스테이지에 올리면 넣은 내용, 뺀 내용이 보여짐, 이를 커밋, 푸쉬하면 반영됨
더이상 필요없어진 version2는 삭제해도 됨
*** 병합해서 충돌이 안 나려면?
보통, 다른 파일에서 작업을 하면 충돌이 나지 않음
예를 들어 version3 - 메인파일에 내용을 추가, version4 - 새 텍스트파일을 추가한다고 할때,
main을 version3와 병합 후 version4와 병합하는 경우는 Fast forward 상황은 아니지만,
변경이 생긴 파일들이 겹치지 않으므로 충돌이 일어나지 않고 자동으로 병합됨
'git' 카테고리의 다른 글
[Git과 GitHub 입문] 12~16 stash, rebase (0) | 2023.10.10 |
---|---|
[Git과 GitHub 입문] 7~11 Pull, 충돌해결, 커밋 되돌리기 (0) | 2023.10.08 |
[Git과 GitHub 입문] 1~3 깃헙 회원가입하기~소스트리 사용 (0) | 2023.10.05 |
깃허브 프로젝트 올리기 (0) | 2023.07.25 |