본문 바로가기
기타

빠르게 'Git' 사용하기

by 유세지 2019. 8. 24.

 국방부 오픈소스 아카데미 (osam.kr) 에 올려져있는 송태웅님git/github 입문과 구글링을 통해 얻은 지식들을 내용 정리겸 나중에 잘 생각나지 않았을때를 대비해 적는 글입니다.

 

 

 아마 git이 생소하게 느껴지는 참가자들이 꽤 있었을 것으로 생각되었습니다. 저도 git을 이용해 본 경험이 있고, private한 저장소도 몇 번 만져볼 기회가 생겨 다른 참가자 분들과 비교했을때 상대적으로 빈번하게 접했다고 할 수 있었겠지만 그때그때 필요에 의한 기능만 구글링을 통해 찾아보고, 그나마도 많이 잊어버린 상태였기에 체계적으로 공부할 수 있는 기회가 생긴 것에 매우 감사하게 생각하고 있습니다. 방금 서술했듯, 나중에 찾아보기 위해 작성하는 것이 가장 큰 이유이므로 바로 시작하겠습니다.

 

 

Git 이란?

 - 개발과정, 소스파일을 관리하는 도구

 - History 관리가 되어 개발 되어온 과정과 역사를 볼수있고 특정 시점으로 복구 가능

 

 

 흔히들 버젼관리 프로그램이라고 부르는 Git은 개발자들에게 굉장히 편리한 기능을 제공합니다. 기본적으로 어떠한 프로그램이 개발되는 전반적인 과정을 쉽게 파악할 수 있도록 GUI를 제공하기도 하고, 필요에 따라선 특정 시점으로 되돌릴 수 있는 기능 또한 갖추고 있습니다. 그 중에서도 Git의 가장 큰 장점을 뽑아보자면 바로 '협업을 위한 도구'라는 점입니다. 여러 명의 개발자들이 매번 만나서 작업을 할 수 있다면 좋겠지만, 그렇지 못하는 상황에서도 커밋 메시지와 이슈 트래킹 등 꼭 필요한 내용을 소통할 수 있도록 도와주기에 협업에서 Git을 빼면 쉬운 작업도 몇 배로 어려워질 정도니까요. 개인적인 생각이지만 개발자들의 의사소통에 한해선 직접 만나서 이야기 하는것보다도 커밋 메시지가 더 나은 것 같기도 합니다.

 

 

 그럼 본격적으로 Git을 시작해봅시다.

 

 Git은 여러가지 프로그램을 통해 사용할 수 있습니다. 깔끔하고 뛰어난 GUI를 가진 Sourcetree 와 같은 프로그램을 사용할 수도 있겠지만 이 글에서는 CLI (Command Line Interface) 를 사용하여 git을 사용해보겠습니다.

 

 

 1) Google에 검색하여 Git bash를 다운받습니다. (https://gitforwindows.org/)

 

 2) Git bash를 실행하고 나의 Github 계정과 이름을 등록합니다.

#git config --global user.email "Github계정"
#git config --global user.name "이름"

 

 

3) 작업할 디렉토리로 이동하여 git repository를 생성합니다.

디렉토리 생성 명령어: mkdir "디렉토리 이름"   ::: 사용예시) #mkdir newrepository
디렉토리 이동 명령어: cd "이동할 경로"  ::: 사용예시) #cd newrepository

#git init

 

 

 이때 내가 새로운 프로젝트를 시작하려고 한다면 아무 문제가 없지만, 이미 있는 프로젝트를 받아와서 작업하려고 한다면 로컬 저장소를 원격 저장소와 동기화 시켜주는 작업이 필요합니다.

 

 

4-1) 기존에 존재하던 원격 저장소와 로컬 저장소를 동기화 하기

#git pull "주소"

 

4-2) 새로운 원격 저장소에 현재 로컬 저장소를 remote 하기

#git remote add origin "주소"

 

 

 url주소 등의 복잡하고 긴 문장을 일일히 타이핑 하기가 너무도 귀찮아서 Ctrl+C / Ctrl+V 를 이용해 복사 붙여넣기를 시도하신 분도 계실텐데, ^C 같은 문자만 뜨면서 붙여넣기에 실패하진 않으셨나요? 터미널 창이나 git bash에선 Shift+Insert가 붙여넣기를 대신합니다.

Ctrl+Insert ::: 복사
Shift+Insert ::: 붙여넣기

 

 

 이것으로 git을 사용하기 위한 기본적인 셋팅은 끝입니다. 다음은 주요 기능들을 사용해보겠습니다.

 

 

 git은 add -> commit -> push 의 순서를 거쳐 원격 저장소에 소스코드를 저장합니다. 

 

 1. add는 commit할 목록을 추가하는 것이고,

 2. commit은 commit을 만드는 것이며,

 3. push는 현재까지의 commit을 Github에 밀어넣는 명령어입니다.

 

 여기서 commit이란 History의 한 단위를 나타낸다고 생각하시면 됩니다. 어떤 기능의 추가, 수정, 삭제 등의 개발 역사를 구성하는 한 개의 블럭이라고 할까요. 예를 들어 홈페이지의 로그인 기능을 구현하는 Login이라는 함수를 작성했다고 하면 '[UPDATE] function Login added' 와 같은 커밋 메시지와 함께 큰 역사(프로그램 개발)에 포함된 작은 역사(로그인 기능 개발)로 기록되는 겁니다. 이해가 잘 안된다면 일단 직접 한 번 해봅시다.

 

 

1. add 하기

#git add "파일이름"

 

2. add 한 것 취소하기

#git reset

 

3. commit 하기

#git commit -sm "커밋메시지. 이 부분엔 커밋에 대한 내용을 간단명료하게 설명해주면됩니다."

 

4. commit 취소하기

#git reset HEAD~1

 

5. push 하기

#git push origin master

 

6. push 한 것 없애기 (취소와는 다릅니다.)

#git reset HEAD~1    // 최근 commit을 지우고
#git push origin master --force    // 바뀐 내용을 강제로 push 해줍니다.

 

 한 번 github 원격 저장소에 push된 커밋은 취소할 수 없기 때문에, 최근 커밋된 내용을 지운 History를 강제로 push 해줘서 commit을 지우는 것과 같은 효과를 내도록 해야합니다. 위와 같은 방법으로 push 한 것을 없애는 것과 같은 효과를 낼 수는 있지만, 완전히 없었던 일로 하는 것과는 다른 문제이기에 (기본적으로 github은 public 저장소이기에 코드가 수집될 수 있습니다.) 골치 아픈 상황이 발생할 수 있습니다. 때문에 push를 하기 전엔 항상 신중하게 하도록 합시다.

 

 

7. pull-request 하기

 

 pull-request는 다른 프로젝트에 내가 만든 커밋을 제출한다는 의미입니다. 

 

  1) 상대방의 프로젝트를 fork 해서

  2) 내 계정에서 관리되는 프로젝트로 새롭게 만들고

  3) fork한 github 프로젝트를 토대로 새로운 커밋 내용들을 pull-request 제출 할 수 있습니다.

 

 

 7-1) clone으로 fork한 repository 받아오기

#git clone "주소"

 

 7-2) clone한 프로젝트 폴더로 이동하기

#cd "프로젝트 이름"

 

 7-3) pull-request 작업할 브랜치(develop) 따로 만들기

#git checkout -b develop

 

 7-4) 필요한 작업을 마친 후 commit 한 뒤 push하기

#git commit -sm "commit msg"; git push origin develop

* 세미콜론(;)을 이용하면 한 줄로 여러 명령을 실행할 수 있습니다.

 

 7-5) folk한 내 repository에서 Branch 탭을 클릭 후 New pull-request 버튼을 클릭

 

 여기까지 완료하면 원본 프로젝트를 보유한 사람에게 pull-request 알림이 갑니다. 해당 보유자가 검토 후 승인하게되면 원본 프로젝트에도 내가 작업한 내용이 반영됩니다.

 

 

 

8. merge 하기

 

 git에는 효율적인 작업을 위해 브랜치(branch) 라는 개념이 있습니다. 원본 (보통 master 브랜치)을 수정하기보단, 개발(develop) 브랜치나 테스트(test) 브랜치 등을 이용해 수정한 내용이 별 문제없이 정상적으로 실행 되는지 확인한 다음 원본에 반영하는 식입니다.

 

8-1) 현재 브랜치가 develop인지 확인 (merge시 항상 현재 브랜치가 기준이 됩니다.)

#git branch

 

8-2) 추가 브랜치(test)를 만들고

#git checkout -b test

 

8-3) touch로 빈 파일 하나를 만들어서 commit

#git touch test; git add test; git commit -sm "test"

 

8-4) develop 브랜치로 돌아와서 추가 브랜치를 merge

#git checkout develop; git status; git merge test

 

 

 

9. Rebase 하기

 

 Commit을 역사의 한 단위인 '블럭'이라고 하고 이 블럭들의 모임을 'tree'라고 할때

내가 쌓은 블럭을 잠시 빼고, 기준이 되는 tree를 최신으로 업데이트 한 후에 그 위에 내 블럭을 쌓아 올릴때 쓸 수 있는것이 이 Rebase 입니다.

 오픈소스 프로젝트를 pull을 통해 가져와서 기능을 추가하고 수정하던 중, master 브랜치에 새로운 버젼이 업데이트 된 경우에 바로 이 Rebase를 통해 작업하던 프로젝트를 최신 버전으로 업데이트 시킬 수 있습니다.

 

9-1) folk 후 clone 했던 프로젝트 경로로 이동하여 upstream을 추가

#git remote add upstream "주소"

 

9-2) upstream의 dev 브랜치를 가져와서

#git fetch upstream dev

 

9-3) 현재 내 브랜치가 develop인지 확인한 후

#git status

 

9-4) Rebase 해줍니다.

#git rebase upstream/dev

 

 

++ rebase를 이용해 중간에 낀 커밋을 수정해보겠습니다. 가장 최근 커밋이 아닌 최초기록부터 2번째에 기록된 커밋을 수정한다고 하면,

 

9-5) rebase -i --root 를 사용합니다.

#git rebase -i --root

 

9-6) vi 에디터에서 수정하려는 commit(이 예제에선 2번째)에 pick을 지우고 edit을 적고 저장하고 에디터를 종료합니다.

:wq // esc를 누르고 :wq 를 입력한 후 엔터를 누르면 지금까지의 내용을 저장하고 vi 에디터에서 빠져나오게 됩니다.

 

9-7) 상태를 확인해서 정상적으로 rebase가 진행되었는지 확인해줍니다.

#git status

 

 

10. Blame 하기

 Blame을 사용하면 프로젝트의 로그와 변경 내용을 추적할 수 있습니다. 찾아서 Blame 합시다.

 

1) blame을 사용해 누가 어느 라인을 수정했는지 확인해봅니다.

#git blame "파일이름"

 

2) 해당 commit ID를 이용하여 그 당시 commit 정보를 확인할 수 있습니다.

#git show "commit ID"

 

 

11. 데이터 지우기

 여러명이 사용하는 환경에서는 내 로그인 정보가 악용될 수도 있으니 깨끗이 지워주는 것이 좋습니다.

 

#git config --global --unset-all user.name
#git config --global --unset-all user.email

 

 

 여기까지의 내용을 숙지하셨다면 git을 사용할 준비가 끝나셨습니다. 이제 git을 이용해서 멋진 결과물을 만들어 낼 차례입니다. 이 부분은 여러분의 역할로 남겨두겠습니다. 읽어주셔서 감사합니다.

 

 

강좌 참고 : 송태웅님 - Git/Github 입문 (http://osam.kr/lecture/14689/필수과정-git-github-입문)

반응형

댓글