깃과 브랜치 공부 2일차

브랜치

master브랜치에서 뻗어 나오는 새 브랜치를 만드는 것을 분기(branch)한다 라고한다. 새 브랜치에서 원하는 작업을 끝내고 분기했던 브랜치를 master 브랜치에 합치는 것을 병합(merge) 한다고 한다.

  • 만약 브랜치를 사용하지 않으면 프로젝트 각각의 디렉토리를 만들고 manual 디렉토리를 복사해서 사용해야하고 이는 곧 여러 문제를 일으킬 수 있음.

새 브랜치 만들기

$ git branch 새브랜치

  • git branch로 확인해보면 master , 새브랜치 이렇게 두 종류가 보임.
    master앞에
    는 현재 master브랜치에서 작업중이라는 의미.

  • git log로도 확인 가능. HEAD -> master,새브랜치 이렇게 나오고, 현재 master 브랜치에서 작업 중이라는 의미.

브랜치 사이 이동하기 : git checkout

$ git checkout 브랜치

  • 커밋을 마친 상태에서 브랜치하면 새로 만든 브랜치도 당연히 최신 커밋 상태를 나타낸다.

  • 새로운 내용을 커밋해보고 로그확인해보면 새로 만든 브랜치는 이전의 커밋내용 상태에서 머무르고, master 브랜치는 새로운 커밋내용 상태를 반영하고 있다.

    $git log --oneline (oneline 옵션 사용하면 커밋 간략히 확인할때 좋음)

여기서 새 브랜치로 이동해보면 master 브랜치에서 새 브랜치로 분기하기 전까지 master 브랜치에 있던 커밋들은 그대로 새 브랜치에 복사된 것을 확인할 수 있다. 또 최신 커밋 해시에서 HEAD는 새 브랜치를 가르킨다.

-> 즉, 새 브랜치가 master 브랜치에서 분기된 이후에 master 브랜치에 추가된 커밋은 새 브랜치에 영향을 미치지 않는다!

브랜치 정보 확인하기

$git add . -> 수정된 파일 전부를 스테이지에 올릴 수 있음
$git add -A 과 똑같은 건지 잘 모르겠음

$ git log --oneline --branches 옵션을 사용하면 각 브랜치의 커밋을 함께 볼 수 있다.

$ git log --oneline --branches --graph 옵션을 사용하면 수직선과 점선들로 어떤 커밋상태에서 분기되어 나왔는지 커밋의 부모를 보여준다.

브랜치 사이의 차이점 알아보기

  • 커밋이 쌓여갈수록 브랜치 사이에 어떤 차이가 있는지 확인 어려움

    $git log 브랜치1..브랜치2

-> 브랜치1을 기준으로 브랜치1에는 없고 브랜치2에 있는 것을 보여준다.

브랜치 병합하기

  • git init 뒤에 디렉토리 이름을 넣으면 새로운 디렉토리를 만들고 저장소를 초기화하는 과정을 한번에 할 수 있다.

    $git init newDirectory

  1. 홈 디렉토리에 새로운 디렉토리 만들고, 거기서 빔을 이용해 work 텍스트파일 만들고 저장

    $ cd~
    $ git init manual-2
    $ cd manual-2
    $ vim work.txt
    $ git add work.txt
    $ git commit -m 'work1'

-> HEAD가 master 브랜치를 가르키고, master가 work1 커밋을 가르킨다.

  1. o2 브랜치 만들기

    $ git branch o2

-> o2가 work1 커밋을 가르킴.

  1. master 브랜치에 master.txt파일 만들고 커밋
    (주의: git commit -am '내용' 은 untracked 상태에서는 사용못하는 듯함.)

    $ vim master.txt
    $ git add master.txt
    $ git commit -m 'master work 2'

    master가 master work 2 커밋을 가르킴.

  2. o2브랜치로 체크아웃

    $ git checkout o2

  3. o2 브랜치에서 o2.txt 파일 만들고 커밋.

    $ vim o2.txt
    $ git add o2.txt
    $ git commit -m 'o2 work 2'

    -> o2가 o2 work 2 커밋을 가르킴. HEAD가 o2 브랜치를 가르킴.

  4. o2브랜치에서 작업이 끝났으면 o2 브랜치 내용을 master브랜치로 병합하기
    a. 먼저 master 브랜치로 이동

    > $ git checkout master

    b. 병합하려는 브랜치 이름 가져옴.

    > $ git merge o2
     > $ git merge o2 --edit  (편집기 창을 꺼내고 싶으면 옵션 추가)
  5. Merge branch o2 라고 자동 커밋된다.
    -> HEAD가 master 브랜치를 가르킴. master가 Merge branch o2 커밋을 가르킴.

  6. git log --oneline --branches --graph로 머지된거 확인하기

같은 문서의 다른 위치를 수정했을 때 병합하기

  • master 브랜치와 o2 브랜치에는 똑같이 work.txt 파일이 있음. 양쪽 브랜치에서 work.txt 문서를 수정하되 서로 다른 위치를 수정한 후 브랜치를 병합해보면 어떤 결과가 나올까
  1. 홈디렉토리에서 manual-3라는 깃 저장소 만들고 디렉토리 이동하기
  2. 빔에서 work.txt 파일 만들고, 커밋메시지 work 1로 커밋.
  3. o2 브랜치 만들기 ( o2브랜치와 master브랜치에는 work 1 커밋이 존재하게 된다.)
    4.master 브랜치에서 work.txt 수정하고, 커밋메시지 master work 2로 커밋.
    '''
    #title
    content
    master content 2

    #title
    content

    _
    '''
  4. o2 브랜치로 체크아웃하고 work.txt 파일 수정하고, 커밋 메시지 o2 work 2로 커밋.
    '''
    #title
    content

    _

    #title
    content
    o2 content 2
    _
    '''
  5. o2 브랜치를 master브랜치에 합치기 위해 master 브랜치로 체크아웃.
  6. git merge 명령 이용해서 o2브랜치를 master 브랜치로 불러온다.
  7. 병합시에는 서로 위치가 달라서 conflict 문제가 발생하지 않고, 자연스럽게 Auto-merging work.txt로 시작하는 병합 완료 메시지가 출력됌. cat 명령어로 파일 확인해보자.
    '''
    #title
    content
    master content 2
    _
    #title
    content
    o2 content 2
    '''

같은 문서의 같은 위치를 수정했을 때 병합하기

  1. 홈디렉토리에서 manual-4라는 깃 저장소 만들고 디렉토리 이동하기

  2. 빔에서 work.txt 파일 만들고, 커밋메시지 work 1로 커밋.

  3. o2 브랜치 만들기 ( o2브랜치와 master브랜치에는 work 1 커밋이 존재하게 된다.)

  4. master 브랜치에서 work.txt 수정하고, 커밋메시지 master work 2로 커밋.
    '''
    #title
    content
    master content 2
    #title
    content
    _
    '''

  5. o2 브랜치로 체크아웃하고 work.txt 파일 수정하고, 커밋 메시지 o2 work 2로 커밋.
    '''
    #title
    content
    o2 content 2
    #title
    content

    '''

  6. o2 브랜치를 master브랜치에 합치기 위해 master 브랜치로 체크아웃.

  7. git merge 명령 이용해서 o2브랜치를 master 브랜치로 불러온다.

  8. 병합시에는 위치가 같아서 conflict 문제가 발생한다. 빔으로 파일을 열어서 내용을 직접 수정해줘야한다.

병합이 끝난 브랜치 삭제하기

-> 브랜치를 삭제하려면 master 브랜치에서 해야함. master 브랜치로 체크아웃하고 -d옵션 사용해서 o2브랜치 삭제한다.

$git branch -d o2
(만약 브랜치 병합을 진행하지 않은 브랜치를 삭제하려 할 경우 오류가 뜸. 이때는 -D를 사용해 강제로 삭제)

브랜치 관리하기

  1. master 브랜치에서 c1 커밋. HEAD->master, master->c1 을 가르킴.
  2. sub 브랜치를 만들면, 새로만든 브랜치 또한 c1 커밋을 가르킴.
  3. 마스터 브랜치에서 c2를 새로 커밋하면 master는 c2를 sub은 c1을 가르킴.
  4. git checkout sub 으로 sub 브랜치로 들어간다. 빔을 이용해서 s1을 커밋한다.
  5. git log --oneline --branches 명령어로 c2의 해시값을 뽑아내고, git reset 해시값을 입력하면 sub 브랜치의 최신 커밋이 master 브랜치의 최신 커밋인 c2로 바뀐다.
  6. gitlog --oneline --branches로 살펴보면 HEAD ->sub,master로 바뀌어있음을 볼 수 있다. 이렇게 git reset을 사용하면 브랜치 사이를 넘나들면서 제어할 수 있음. sub 브랜치는 이제 c2 커밋을 가르키고 있음으로 원래 가르키던 s1 커밋은 연결이 끊기면서 삭제된다.

수정 중인 파일 감추기 및 되돌리기 : git stash

  • git stash 명령을 사용하려면 파일이 tracked 상태여야함. 즉, 한번은 커밋이 된 상태여야 한다.
  • 어떤 파일을 수정하던 중 급하게 다른 파일을 커밋해야 할 경우 사용
  • git stash 명령을 입력하면 수정중이던 파일이 어떤 공간으로 들어가서 임시 저장된다.
  • git stash list 명령을 통해, 감춘 파일 목록을 확인할 수 있는데 스택으로 저장되며 stach{0}이 가장 최근파일, 새로운 파일이 들어오면 1..2..3..으로 점점 밀려나는 구조.
  • git stash pop으로 가장 최근 항목을 되돌려 올 수 있다.

좋은 웹페이지 즐겨찾기