git - 3

2021. 8. 8. 13:26

3장

1)
브랜치(branch): 모든 버전관리 시스템에서 사용하는 개념, 나무가지처럼 여러갈래로 나뉘는 데이터 흐름을 가리키는 말
                자료중복을 제거하고 이전 수정사항을 남기고 병합하기 위해 사용

 - 깃으로 버전관리 시작시 기본적으로 master라는 브랜치가 생성된다.
 - 이 상황에서 사용자가 커밋시 master 브랜치는 가장 최신 커밋을 가리킨다. 즉, 브랜치는 일종의 포인터로 생각할 수 있다
 - master브랜치에서 분기(branch)할 시(새 브랜치를 생성할 시), 기존의 master 브랜치는 유지하면서 새로운 브랜치로 기존 파일의 내용을 수정할 수 있다.
 - 분기 이후, 각 브랜치를 합치는 것을 병합(merge)이라고 한다
 - HEAD가 가리키는 브랜치가 현재의 브랜치이다

2)
브랜치 생성
 - master 브랜치는 git 생성+첫커밋시 자동 생성된다
 - git branch : 현재 존재하는 브랜치목록 출력
 - git branch 브랜치명 : 브랜치 생성

3)
브랜치 이동
git checkout 브랜치명 : 현재 브랜치에서 브랜치명의 브랜치로 이동

** git add * == git add .
 - git log --online : 로그를 1줄씩만 확인가능
 - git log --online --branches : 모든 브랜치의 커밋 확인 가능
 - git log --online --branches --graph : 모든 브랜치의 커밋 확인 가능 + 커밋관계를 그래프형태로 출력
 - git log 브랜치명1..브랜치명2 : 브랜치명1을 기준으로 브랜치명2의 차이점을 비교한다.(즉 브랜치명2의 다른 커밋의 log를 출력한다)

4)
브랜치 병합
 - git check 브랜치명 : 브랜치명의 브랜치를 가지고와 현재 브랜치에 병합한다

** 빨리감기 병합(fast-forward merge)
master 브랜치에서 새 브랜치로 분기하고 해당 브랜치에서 커밋작업 후, (master 브랜치에서는 내용변화 없었다 가정) master 브랜치로 체크아웃
이후, master 브랜치에 분기한 브랜치를 병합할 경우 커밋 메세지창이 열리지 않으며, 이를 빨기감기 병합이라고 한다(실제 출력메세지에 Fast-forward라고 출력된다)

** 브랜치 병합시 편집기 창 없이 기본 메세지로 적용하기
 --no-edit 옵션
  ex) git merge 브랜치명 --no-edit

5)
같은 문서를 2개의 브랜치에서 수정 후 병합하기
 - 같은 문서를 수정했지만 상호간 수정한 내용이 다른 위치일 때(서로 중복되지 않을 때)
    : merge시 "Auto-merging 파일명" 메세지가 출력된다
 - 같은 문서를 수정 시 수정한 내용이 같은 위치일 때(서로 중복되었을 때)
    : merge시 "Auto-merging 파일명" 메세지가 출력됨과 동시에 CONFILCT 메세지가 출력된다
      해당 파일을 열어보면 현재 브랜치와 병합대상 브랜치의 충돌부분이 아래와 같이 표현된다
        <<<<<<< 현재브랜치명
        현재 브랜치 내용
        =======
        병합대상 브랜치 내용
        >>>>>>> 병합대상 브랜치명
      위의 내용을 수정(<<< 브랜치명, >>> 브랜치명, ===는 삭제해야된다) 및 저장 후 편집기 종료
      이후 merge가 아닌 "git add, commit"으로 저장소에 반영(커밋) 시 병합이 완료된다

** 병합에 따른 충돌 해결 프로그램
 - 병합 알고리즘에는 2 way merge와 3 way merge가 있다. 이 중 3 way merge가 훨씬 효율적이라고 함
 - git에서 충돌이 발생시 이를 자동으로 해결해주는 병합 자동화 프로그램
    P4Merge : 무료, 직관적, 뛰어난 병합기능, 단축키 미지원
    Meld : 무료, 오픈소스, 비교 및 편집가능
    Kdiff3 : 무료, 병합기능이 뛰어나지만 한글 호환성이 낮다
    Araxis Merge : 유료, 대용량 파일처리 시에도 잘 동작

6)
병합 이후 미사용할 브랜치 삭제하기
 - 여러개의 브랜치를 사용하다가 병합되어 1개의 브랜치를 제외한 기존에 사용중인 브랜치들을 삭제할 수 있다
 - git brach -d 삭제할브랜치명

 ** 단, 삭제보다는 숨기는 것이 좀 더 옳다고 할 수 있다.(고 설명한다)
    브랜치 삭제 후 삭제한 브랜치명으로 다시 생성시 예정에 작업했던 내용이 그대로 나타난다고 한다

7)
브랜치 관리하기
git branch의 HEAD : 현재 작업트리(워킹 디렉터리)가 어떤 버전을 기반으로 작업 중 인지를 가리키는 포인터
                    (기본적으로 HEAD는 master브랜치를 가리킨다)
branch : 브랜치는 기본적으로 브랜치가 가지고 있는 커밋에서(브랜치가 지나가는 경로에서) 가장 최근의 커밋을 가리킨다

즉, 기본적으로  HEAD는 master 브랜치를 가리키고 master 브랜치는 가장 최근의 커밋(버전)을 가리킨다

git checkout 브랜치명 : HEAD를 해당 브랜치명을 가리키게 설정한다

git reset 해시값 : 2장 필기 내용 처럼 "현재 HEAD가 가리키는 브랜치"가 가리키는 커밋을 해시값으로 변경한다.
                   기존의 커밋 내용은 연결이 끊기게 되며, 삭제된다


git stash : 파일 수정 도중 다른 파일을 커밋해야할 경우, 커밋 대상이 아닌 파일들을 제외하는 명령어
 - git stash 를 하면 수정 중인 전체 파일을 제외(숨김)한다. git stash save 명령어와 같은 동작을 수행한다
 - git stash list : 감춘 파일들은 리스트에 저장되며, 리스트는 스택과 같이 동작하기 때문에 stash 스택이라고도 한다
                    예를 들어 가장 먼저 제외한 파일은 stach@{0}에 저장되며, 
                    추가적으로 파일을 제외하면 기존 리스트는 stash@{0}에서 stash@{1}으로, 새로 추가하는 파일은 stash@{0}에 저장된다
 - git stash show : 현재 stash list의 stach@{0} 에 저장된 파일목록을 출력
 - git stash pop : stash@{0}에 저장된 파일을 현재 워킹디렉터리에 반영하고 stash@{0}을 삭제하며, 남아있는 stash list들은 (스택처럼) 한개씩 당겨진다
 - git stash apply : stash@{0}에 저장된 파일을 현재 워킹디렉터리에 반영하고 stash@{0}의 내용을 삭제하지 않고 stash list에 남겨둔다
 - git stash drop : stash list에 stash@{0}의 내용을 삭제한다

'Study > git' 카테고리의 다른 글

git- 5  (0) 2021.08.08
git - 4  (0) 2021.08.08
git - 2  (0) 2021.08.07
git - 1  (0) 2021.08.07
시작  (0) 2021.08.06

+ Recent posts