프로그래머로부터 배우는 코딩의 기술

console(협업)

콘솔에서의 협업
토픽 프로그래머로부터 배우는 코딩의 기술 > git

주요명령

리모트 저장소 복제

  • git clone (리모트 저장소 URL)

리모트 저장소의 추가

  • git add (리모트 저장소의 별명) (리모트 저장소의 URL)

리모트 저장소의 삭제

  • git remote rm (리모트 저장소의 별명)

리모트 브랜치와 동기화

  • git fetch (리모트 저장소의 별명) (리모트 브랜치)
    (리모트 저장소 별명)에 해당하는 저장소의 (리모트 브랜치)를 현재 선택된 로컬 브랜치로 가져온다.
  • git pull (리모트 저장소의 별명) (리모트 브랜치)
    git fetch명령을 실행하고 자동으로 merge(병합) 하기
  • git push (리모트 저장소의 별명) (리모트 브랜치)
    (리모트 저장소 별명)의 (리모트 브랜치)로 로컬 브랜치를 전송한다.
    이 명령을 수행하기 전에 git fetch나 git pull을 수행한다.

리모트 브랜치 생성

  1. git checkout -b (새로운 브랜치)
    (새로운 브랜치)를 로컬 브랜치로 만든다.
  2. git push (리모트 저장소) (리모트 브랜치)
    (리모트 저장소)에 (리모트 브랜치)를 생성하고 현재의 로컬 브랜치와 추적상태를 만든다.

리모트 브랜치 현황보기

  • git remote
    로컬 브랜치에 연결되어 있는 리모트 브랜치 리스트 보기
  • git remote show (리모트 브랜치)
    (리모트 브랜치)와 로컬브랜치의 관계를 상세히 보기

리모트 브랜치 삭제

  • git push (리모트 저장소의 별명) :(리모트 브랜치)
    (리모트 저장소의 별명)의 (리모트 브랜치를 삭제) ':' 앞에 뛰어쓰기해야 함

git fetch VS git pull

git fetch와 git pull 중 어떤 것이 더 나은 방법일까? 정답은 없지만 git fetch가 더 바람직하다. git fetch는 원격저장소의 내용을 모두 가져오지만 그것을 working copy에 합치지 않는다. 다시 말해서 소스가 변경되지 않는다는 것이다. 그럼 어떻게 해야 코드가 최신 상태가 될까? git merge 명령을 실행시키면 된다. 그럼 fetch를 통해서 가져온 원격 저장소의 소스와 자신이 작업하고 있었던 소스가 병합(merge) 된다. 

간단하게 pull하면 되는데 fetch를 하는 이유는 무엇일까? fetch를 하면 실제로는 working copy에 반영되지 않기 때문에 원격 저장소와 로컬 저장소 사이의 차이점을 비교 할 수 있다. 문제점이 있는지 여부를 미리 검토 할 수 있는 것이다. 필자의 경우 fetch를 이용하는 경우 아래와 같은 흐름으로 작업을 한다. 

git fetch; #원격 저장소에서 로컬 저장소로 변경점을 가져온다. 단, Working Copy에는 반영하지 않는다.
git log git log ..origin/master; #fetch를 이용해서 가져온 변경점과 Working Copy 사이의 차이점만 보여준다.
git merge; #fetch를 이용해서 가져온 내용을 Working Copy에 반영한다. 만약 fetch를 이용해서 가져온 변경 점 중에 특정 커밋 이전만 Working Copy에 반영하고 싶다면 git merge 뒤에 커밋 ID를 붙인다. 

댓글

댓글 본문
  1. windows에서 id_rsa를 생성하고 .pub의 키값을 github에 등록한 후

    git clone을 사용 시 permission 0644 문제가 나타납니다;

    이를 해결할 방법이 있는지요;
  2. 별모모
    $ git remote rm <저장소> <br />
    $ git remote add <저장소><br />
    <br />
    (Pro Git 33쪽, Scott Chacon)"리모트 저장소를 삭제해야 한다면 git remote rm 명령을 사용한다. 서버 정보가 바뀌었을 때, 더는 특별한 미러가 필요하지 않을 때, 기여자가 더는 활동하지 않고 있을 때 필요하다." ---- "remote rm" 이건 무슨 명령이죠? <br />
    <br />
    <답> 로컬저장소에서 바라보는 리모트 저장소의 URL입니다. <br />
    $ git remote -v<br />
    github git@github.com:schacon/hw.git (fetch)<br />
    github git@github.com:schacon/hw.git (push)<br />
    $ git remote add origin git://github.com/pjhyett/hw.git<br />
    $ git remote -v<br />
    github git@github.com:schacon/hw.git (fetch)<br />
    github git@github.com:schacon/hw.git (push)<br />
    origin git://github.com/pjhyett/hw.git (fetch)<br />
    origin git://github.com/pjhyett/hw.git (push)<br />
    $ git remote rm origin<br />
    $ git remote -v<br />
    github git@github.com:schacon/hw.git (fetch)<br />
    github git@github.com:schacon/hw.git (push)
  3. 별모모
    [ 브랜치 생성, pull/push, 삭제 ] 개발(협업)에 있어 github 저장소에 파일 업/다운로드는 프로그램의 시작이라 할 수 있습니다. 하나 씩 듣고 따라한 다음엔 혼자서 시나리오를 작성하여 2~3번 반복할 필요가 있습니다.

    * 로컬브랜치 삭제하기
    $ git branch -D {브랜치명}

    * 이미 있는 저장소를 Clone하기
    $ git clone git://github.com/schacon/grit.git [mygrit] " [mygrit]란 이름으로 저장소를 만들 수 있고, 생략하면 "grit"이라는 디렉토리 안에 .git디렉토리를 만든다.

    * 리모트 브랜치 삭제
    $ git push origin :serverfix " [serverfix]라는 리모트 브랜치를 삭제합니다.

    * Rebase ( 두 단계를 갖는다.)단, 공개 저장소에 Push한 커밋을 Rebase하지 마라.
    $ git checkout experiment " 남을 브랜치 이동
    $ git rebase master " 마스터를 브랜치에 함침

    * 커밋 내용 수정(3개 명령어, 커밋 하나로 기록)
    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend

    * add Undo(stage ->untracked)
    $ git reset HEAD {undofilename.ed}

    * add Redo(경고!,수정한 내용 모두 사라짐)
    $ git checkout -- {redofilename.ed}

    * 리모트 저장소 추가(이쪽, 저쪽에 저장)
    $ git remote add [단축이름] {git://github.com/paulboone/ticgit.git}

    * checkout하여 자세한 내용 확인
    * 자동완성(contrib/completion, git-completion.bash홈디렉토리카피 .bashrc에 아래추가)
    source ~/.git-completion.bash
    .(리눅스) /etc/bash_completion.d/에 추가
    .(맥)/opt/local/etc/bash_completion.d에 추가
    * Git Alias
    $ git config --global alias.{약어} {명령어}
    $ git config --global alias.unstage 'reset HEAD --'
    $ git unstage fileA === $ git reset HEAD fileA