문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판 | |||
| git:git_use_1 [2023/11/07 14:47] – [Git 사용전략 - 1] taekgu | git:git_use_1 [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| + | ====== Git 사용전략 1부 ====== | ||
| + | https:// | ||
| + | 세상이 복잡해짐에 따라 필요로 하는 시스템도 점점 복잡해졌다. 시스템이 복잡해질수록, | ||
| + | |||
| + | 하지만 아직도 git의 진입장벽을 쉽게 넘지 못하여 git을 유용한 도구가 아닌 장애물로 여기는 사람들이 적지 않다. 이 글에서는 git을 사용해보려 했지만 그 장벽에 부딪혀 포기해버린 사람들을 위해, git이 어렵게 느껴지도록 하는 문제들을 하나하나 해결해 보고, git을 가장 쉽게 사용할 수 있는 방법이 무엇인지 살펴보도록 하겠다. | ||
| + | ===== git basic ===== | ||
| + | |||
| + | | ||
| + | ==== Remote repository & Local repository ==== | ||
| + | |||
| + | 많은 사람들이 꼽는 git의 특징은 remote repository와 local repository가 각각 존재한다는 것이다. | ||
| + | 대부분 서버에 저장소(remote repository)가 있고 팀 구성원들이 그 서버에 각각 작업한 내용들을 반영했다면, | ||
| + | |||
| + | ==== 세가지 상태 - modified/ | ||
| + | |||
| + | 두 번째로 알아야 할 개념은, modified, staged, committed 이다. 이 세가지 개념은 변경점들이 어떠한 상태에 있는가에 대한 개념이라고 생각하면 된다. | ||
| + | |||
| + | === ★ committed === | ||
| + | |||
| + | git에서는 변경점의 집합(실제로는 snapshot형태)을 database에 저장하는 행위를 commit이라 한다. committed는, | ||
| + | |||
| + | === ★ modified === | ||
| + | |||
| + | 말 그대로 변경된 상태이다. git이 기억하고 있던 상태에서 무언가 변경이 일어난 파일은 modified 상태가 된다. 파일의 추가나 삭제도 기존 상태에서 변경이 일어난 것이므로 modified 상태에 포함된다. | ||
| + | |||
| + | === ★ staged === | ||
| + | |||
| + | modified 상태의 내용들 중에 실제 commit의 대상이 될 수 있도록 선택된 상태이다. Tool에 따라서는 파일단위가 아닌 line단위로도 staged상태로 보낼 수 있다. 아무리 사용자가 소스를 수정했어도 staged 상태로 변경되지 않은 내용들은 git에 commit되지 않는다. 대부분의 경우에 번거로운 중간과정이 될 수 있어, staged를 생략하고 modified에서 바로 commit 할 수 있는 옵션도 제공된다. | ||
| + | |||
| + | ===== Branch ===== | ||
| + | ' | ||
| + | |||
| + | Branch라는 단어의 뜻은 ' | ||
| + | |||
| + | 출처: Git Beginner' | ||
| + | 이러한 흐름을 잘 control하면 개발이 정말 편해질 수 있다. 그것이 브랜치 전략이고, | ||
| + | |||
| + | ==== 여섯가지 명령어 (Process) ==== | ||
| + | |||
| + | 최소한의 개념들을 알아보았으니, | ||
| + | |||
| + | ==== ★ git clone ==== | ||
| + | |||
| + | remote repository를 복제하여 local repository를 생성한다. 서버에 저장되어 있는 git으로 관리되는 소스와 개발이력을 전부 가져와 local에서 작업을 시작할 준비를 하는 단계이다. | ||
| + | |||
| + | ==== ★ git checkout ==== | ||
| + | |||
| + | 브랜치를 전환한다. 브랜치를 전환하면 소스도 해당 브랜치의 것으로 전환된다. 실제적으로 작업을 시작할 수 있는 상태를 만들어 준다. | ||
| + | |||
| + | ==== ★ git pull ==== | ||
| + | |||
| + | 현재 브랜치의 최신 상태를 remote repository로부터 가져온다. 즉, local repository내의 현재 checkout된 브랜치 소스를 최신상태로 만들어 준다. | ||
| + | |||
| + | ==== ★ git add ==== | ||
| + | |||
| + | modified 상태에 있는 변경 내용들을 staged 상태로 만들어 준다. | ||
| + | |||
| + | ==== ★ git commit ==== | ||
| + | |||
| + | staged 상태에 있는 변경 내용들을 repository에 저장한다. 이 때 commit message를 통해 이 변경내용에 대한 description을 기입할 수 있다. | ||
| + | |||
| + | ==== ★ git push ==== | ||
| + | |||
| + | local repository에 commit된 내용들을 remote repository에 보낸다. 즉, 나의 작업내용을 팀원들 전체가 바라보는 서버에 반영(공개)한다. | ||
| + | |||
| + | ===== git 사용을 어렵게 하는 진입장벽 ===== | ||
| + | |||
| + | 이제 git을 사용할 수 있을 정도의 최소한의 설명은 다 했다. 하지만 이 것만 가지고 git을 사용할 수 있는 사람은 아마 없을 것이다. 나의 경험과 주변의 git을 어려워하는 사람들의 이야기 속에서 git의 진입장벽을 몇 가지 발견할 수 있었다. | ||
| + | |||
| + | ==== 비가시성 ==== | ||
| + | |||
| + | git을 처음 사용할 때 ‘멘붕’에 빠지는 이유는 수많은 command들이 무엇을 하는지, 소스들이 지금 어떻게 관리가 되고 있는 건지 감이 오지 않기 때문이다. 인터넷 검색을 통해 git을 시작해보지만, | ||
| + | |||
| + | 너무나 직관적이어서 딱! 보기만 해도 바로 시스템을 이용할 수 있으면 정말 좋겠지만, | ||
| + | |||
| + | 형상 관리를 위한 도구라는 측면에서 보면 git은 복잡하고 내용이 방대할지도 모른다. 하지만 사실 몇 가지 개념만 이해하면 의외로 simple한 것이 git이다. 그 개념을 이해하는데 GUI tool들이 많은 도움을 준다. 특히 모든 commit을 graph로 표시해 주기 때문에 branch 개념을 이해하는데 유용하다. 그리고 모든 GUI tool이 그러하듯 각 command의 자세한 사용법을 몰라도 직관적으로 command의 사용법을 이해할 수 있게 해준다. | ||
| + | |||
| + | git을 지원하는 GUI tool이 많이 있지만, 무료로 제공되는 것들 중에서는 Atlassian에서 만든 SourceTree 와 tortoiseSVN으로 익숙한 tortoiseGit을 추천한다. | ||
| + | |||
| + | === tortoiseGit === | ||
| + | |||
| + | tortoiseGit은 윈도우 탐색기에서 마우스 우클릭을 하면 나타나는 context menu 기반으로 되어있다. 각 메뉴를 클릭하면 해당 기능을 제공하는데 필요한 창이 뜨기 때문에 불필요한 graphic이 없어 가볍고 빠르다. 특히 강력한 점은, 특정 폴더/ | ||
| + | |||
| + | === SourceTree === | ||
| + | |||
| + | SourceTree는 git을 이해하는데 필요한 기본적인 개념들을 한 화면에 잘 표현해 놓았다. 좌측에 branch 구조가 표현되어 있고 main frame에 git graph와 commit 내용들이 표시되어 있으며, 그 아래에 변경사항들을 바로 볼 수 있도록 해놓았다. 기본적으로 화면에 표시된 내용이 알차기 때문에 상단 메뉴바도 비교적 simple하다. 그리고 무엇보다, | ||
| + | |||
| + | 이 글의 목적에 맞게, 일단은 다소 무겁더라도 조금 더 직관적인 SourceTree를 추천한다. git을 처음 시작하거나, | ||
| + | |||
| + | ==== 관성 ==== | ||
| + | |||
| + | 사람들에게 가장 편리한 도구는 무엇일까? | ||
| + | |||
| + | 내가 이전 회사에 있을 때의 일이다. 전사적으로 git이 도입되기 이전, 우리 팀에서는 정말 원시적으로 윈도우의 파일시스템을 이용해서 형상관리를 했다. 공용 서버에 ‘프로젝트명_버전명_날짜’ 형태로 폴더를 나누고, excel 파일로 변경 이력을 관리하고, | ||
| + | |||
| + | 파일 시스템을 이용한 형상관리 | ||
| + | |||
| + | beyond compare 를 이용한 merge 작업 | ||
| + | 지금 생각하면 정말 어처구니 없는 일이지만, | ||
| + | |||
| + | 사람들은 평소에 불편하다고 느꼈던, 혹은 어렵다고 느꼈던 일을 어떠한 도구를 통해 쉽게 해결했을 경우 그 도구를 편리하다고 평가한다. 사용하기 어려운 도구는 좀처럼 편리하다고 평가되지 않는다. git은 초반 개념잡기가 쉽지않고, | ||
| + | |||
| + | ==== 복잡성 ==== | ||
| + | |||
| + | 초반에 설명했지만, | ||
| + | |||
| + | 정말 복잡하다. 좋게 이야기 하자면 이런 복잡한 형태의 형상관리까지 해 낼 수 있다고 할 수도 있겠다. 하지만, 이렇게 되면 히스토리 파악이나 형상관리가 매우 힘들어진다. 위와 같은 일이 발생하지 않게 하기 위해서는 | ||
| + | |||
| + | - **브랜치를 깔끔하게 유지**해야 하고, | ||
| + | - **합리적인 브랜치 전략을 세워야 한다.** | ||
| + | |||
| + | 브랜치 전략은 다음 글에서 git-flow를 통해 알아볼 것이고, 브랜치를 깔끔하게 유지하는 방법을 지금부터 살펴보기로 하자. | ||
| + | ===== 복잡한 git, 이 7단계만 기억하자 ===== | ||
| + | |||
| + | git graph에는 크게 두가지 요소가 존재한다. 바로 ' | ||
| + | |||
| + | |||
| + | 좌측과 유사한 형태의 그래프를 자주 접했을 것이다. 이것이 바로 의도하지 않았는데 흐름이 갈라지는 경우인데, | ||
| + | |||
| + | ==== 1. patch생성 ==== | ||
| + | |||
| + | 패치는 작업내용을 다른곳(다른 branch, 혹은 다른 repository)에 반영할 수 있는 형태로 만들어 주는 것이다. 충돌과 같은 문제가 발생하지 않는 이상 어디에든 반영이 가능하다. 지금은 작업 중이던 내용을 임시적으로 저장해 놓는 용도로 사용하기 때문에 일종의 backup이라고 생각해도 좋다. | ||
| + | |||
| + | Source Tree에서는 다음과 같이 | ||
| + | |||
| + | |||
| + | |||
| + | 맨 위의 탭을 통해 아직 commit하지 않은 내용을 패치로 만들 수도, 이미 commit한 내용을 피치로 만들 수도 있다. 위에서 보다시피 여러개의 commit을 하나의 패치로 만들 수도 있는데, " | ||
| + | |||
| + | ==== 2. reset ==== | ||
| + | |||
| + | git의 현재 상태를 특정 시점으로 되돌리는 기능이다. 되돌아가고 싶은 커밋을 선택하여 우클릭하면 리셋 메뉴가 나온다. | ||
| + | |||
| + | |||
| + | |||
| + | Local에서 아무런 commit도 하기전의 상태를 선택해서 돌아가면 된다. 리셋에는 soft / mixed / hard 세 종류가 있지만, 이미 패치를 만들었기 때문에 모든 변경사항을 깔끔하게 되돌려주는 hard reset만 사용하기로 한다. | ||
| + | |||
| + | ==== 3. pull ==== | ||
| + | |||
| + | 내가 작업하기 이전 상태로 돌려놨으니, | ||
| + | ==== 4. patch적용 ==== | ||
| + | |||
| + | 1단계에서 생성한 패치를 반영하는 단계이다. 일종의 restore 라고 생각하면 된다. "Apply Patch..." | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== 5. conflict 처리 ==== | ||
| + | |||
| + | A라는 commit에서 나는 B라는 commit을, 다른 사람은 C라는 commit을 만들었는데 이 두 commit이 같은 파일의 독립적이지 않은 부분을 서로 다르게 수정했다면 git은 이것을 어떻게 처리해야 할지 알 수 없게 된다. 이것이 바로 conflict(충돌)다. 충돌이 발생하면 git에서 자동으로 다음의 표준 형식으로 충돌이 발생한 부분을 표시해 주며, 이를 에디터나 각종 merge tool(3way-merge 가 지원되는 tool이면 좋다)을 이용하여 적절하게 수정해 주어야 한다. | ||
| + | git 의 충돌표현 표준형식 | ||
| + | <<<<<<< | ||
| + | C commit에 의해 변경된 내용입니다. | ||
| + | ======= | ||
| + | B commit에 의해 변경된 내용입니다. | ||
| + | >>>>>>> | ||
| + | 충돌 해결에 관한 자세한 내용은 이 글의 주제에서 벗어나므로, | ||
| + | |||
| + | ==== 6. commit ==== | ||
| + | |||
| + | ==== 7. push ==== | ||
| + | |||
| + | 위에서 본 7단계의 일련의 작업은 매우 유용하다. 여기서는 브랜치를 깔끔하게 유지하기 위한 방법으로서 살펴봤지만, | ||
| + | |||
| + | 위 작업을 요약하면 **변경점 백업** - **문제없는 버전으로 리셋** - **최신버전으로 업데이트** - **변경점 복원** 이다. | ||
| + | |||
| + | Local repository에서 생긴 모든 문제는 당연히 이 것으로 해결이 가능하고, | ||
| + | |||
| + | [출처] Git, 가장 쉽게 사용하기 - (1) 심플함이 답이다|작성자 개발몬스터 | ||