본문 바로가기

Project Management/Git & Github

[Chapter 2] Sourcetree 처음 사용해보기 - repository 생성, origin과 master

 

 

 

지금부터는, 앞서 만들었던 로컬 저장소와 github에 생성해 연결한 repository를 CLI가 아닌 소스트리를 통해서 실행해 보도록 하겠습니다. 일단, 기본적으로 소스트리 다운로드 및 설치와 Atlassian 계정 생성 등의 작업은 진행한 것으로 가정하겠습니다. 혼선을 방지하기 위해서, Atlassian 계정과 유저 명은 github와 동일하게 설정하였습니다. 

 

또한, 설치 과정에서 git을 연결할 때 사용할 계정을 묻는 스텝이 나오면 우리가 앞서서 git과 연결했던 github 계정과 Username 정보를 입력해 줍니다. 소스트리에서는 이제 해당 github 계정에 있는 repository 리스트를 자동으로 불러오게 되거든요.

 

 

Sourcetree | Free Git GUI for Mac and Windows

A Git GUI that offers a visual representation of your repositories. Sourcetree is a free Git client for Windows and Mac.

www.sourcetreeapp.com

 

 


 

 

우선 소스트리 실행 후, 호스팅 계정과 관련한 설정을 다음과 같이 진행합니다. 우리는 github를 사용하니, 호스팅 서비스에서 github를 선택하고 아래 스크린숏처럼 설정을 진행한 다음 OAuth 토큰 새로고침까지 진행한 다음 [확인]을 클릭합니다.

 

호스팅 계정 설정 화면

 

 

이제 설정을 완료한 다음, Remote 탭에서 계정 연동이 완료되면('새로고침' 클릭) 다음과 같이 본인의 github 계정에 생성되어 있는 repository가 출력됩니다. 

 

 

우리가 앞서 CLI로 작업한 gitstudy 원격 저장소가 보입니다

 

 

 

 


 

 

우리가 만일 이미 진행되고 있는 프로젝트에 새로 참여하게 되어서 아무것도 없는 상태에서 해당 repository에 접근하는 경우라면 이를 Clone으로 내려받아 참여하면 됩니다. 단, 현재 우리는 우리의 [로컬 저장소]가 이미 PC에 있는 상태이기 때문에 우리의 로컬 저장소를 소스트리에 등록해 관리를 시작하면 됩니다. 

 

우선 상기 메뉴에 [Add]를 선택하여, 우리가 PC에서 진행한 git 폴더를 선택하여 등록하겠습니다(만일 우리가 새로 합류하는 사람이라면, 이 절차는 Clone으로 대체됩니다) 등록이 완료되면 다음과 같은 새로운 관리 탭이 생성됩니다. 

 

우리의 repository 관리 화면이 출력되었습니다

 

 

 

참고로 우리는 한 사람이 두 개의 폴더에서 관리하고 있기 때문에, [작성자] 칼럼에는 우리의 계정 1개만 출력되고 있습니다. 이 부분은 주의해 주세요. 실제로 협업을 진행하게 되면, 각자의 github 계정이 출력됩니다. 

 

위의 내용을 보시면 우리가 git CLI로 작업한 히스토리가 그대로 출력되고 있습니다. commit -m 을 통해 입력한 내용과 파일이 어떻게 바뀌었는지 구체적으로 확인되는데, 이것은 우리가 로컬 저장소에서 확인했던 [.git] 폴더가 있기에 가능한 것입니다. 

 

[.git] 폴더는
- $git init이라는 명령어를 실행했을 때 또는
- 소스트리에서는 [Create] 메뉴를 통해 기존 폴더를 로컬 저장소로 만들 때 
생성됩니다.

[.git] 폴더 안에는 우리가 연결한 repository 주소와 커밋 정보 등이 담겨있어서, 해당 정보를 기반으로 github repository와 연동하여 작업을 할 수 있게 만들어줍니다.

 

 


 

 

이제, 우리가 CLI에서 $git 명령어를 통해 실습했던 파일 내용 변경 커밋을 소스트리에서 실행해 보도록 하겠습니다. 일단, (John이 아닌) 본인이 파일의 내용을 변경했다고 가정해 보겠습니다. [study_git] 폴더에서 readme.txt 파일에 다음과 같이 내용을 추가하였습니다. 

 

하단에 텍스트를 추가하였습니다

 

 

파일이 저장되었다면, 별다른 동작 없이 소스트리로 돌아와 보겠습니다. 아래의 그림과 같이 [커밋하지 않은 변경사항]이 출력되고, 하단에는 [스테이지에 올라가지 않은 파일]에 readme.txt가 추가되었습니다. 우측에는 readme.txt의 변경 사항이 나타나고 있습니다. 신기하죠? (이것은 위에서 말했듯, [.git]으로 관리되어 repository가 연결되어 있기에 가능한 일입니다)

 

커밋하지 않은 변경사항이 출력되었습니다

 

 

이제, CLI에서 했던 다음 명령어를 소스트리에서 실행해 보겠습니다. 

 

$git add readme.txt

 

변동이 생겨서 커밋을 만들 파일을 add 명령어로 지정하였습니다. 이 과정을 소스트리에서는 [스테이지에 파일을 올리는] 작업으로 처리하게 됩니다. 로컬 저장소에 변경이 생긴 파일들을 자동으로 감지해 보여주고, 이 중 커밋을 원하는 파일을 선택해 [스테이지]에 올리게 되는 것이죠. 하단의 '스테이지에 올라가지 않은 파일' 영역에서 [+] 버튼을 통해 readme.txt 파일을 올렸습니다. 

 

파일을 스테이지에 올립니다

 

 

 

이제 다음 명령어를 수행해야겠죠? 

 

$git commit -m "[ME]피처 리스트 추가"

 

참고로 [ME]라는 텍스트는 [John]과 구분하기 위한 것으로 큰 의미는 없습니다. 이제 소스트리에서도 변경이 생긴 파일에 대해서, 변경 내역을 텍스트로 작성해 커밋하는 과정이 필요합니다. 

 

커밋 내용을 작성합니다

 

 

위와 같이 History 탭에서 변경사항을 텍스트로 작성해 줍니다. 그리고 [커밋] 버튼을 클릭합시다. 

 

 


 

commit을 진행한 상태. 이제 Push가 남았습니다

 

 


 

 

이 상태에서 하나 짚고 넘어갈 부분이 있습니다. 바로 History 탭의 커밋 별로 붙어있는 태그의 의미입니다. 이 중 [master] , [origin/master] 부분을 살펴보겠습니다. 

 

우선 로컬 저장소와 repository(원격 저장소)의 내용에 차이가 없는 시점에는, "John 내용 추가" 커밋 라인에 [master]와 [origin/master] 태그가 함께 위치했습니다. 하지만 'ME'가 내용을 수정하고 커밋을 진행한 다음에는, 커밋된 영역으로 [master] 태그가 옮겨졌고 그 직전 커밋에 [origin/master] 태그가 그대로 남아있는 상태입니다. 

 

일단 'origin'이 무엇인지 간단히 설명해 보겠습니다. 극단적으로 요약하자면, origin은 곧 (원격 저장소)repository를 의미한다고 생각하면 됩니다. 우리가 처음 git CLI 실습을 진행할 때, git 명령어로 로컬 저장소의 폴더와 github의 repository를 연결하는 작업을 진행했었습니다. 

 

$git remote add origin https://github.com/_______/_____.git

 

여기서 사용된 'origin'이란 단어가 바로 해당 주소 repository의 닉네임 태그와 같은 역할을 하는 것입니다. 만약, 이 명령어에서 origin이란 단어 대신 newOrigin이란 형태로 기입하게 되면, origin은 newOrigin으로 표시될 것입니다. 

 

master는 git에서 사용하는 branch(브랜치) 명칭입니다. 단어 그대로 하나의 줄기를 의미하게 되며, 브랜치는 여러 사람이 협업할 때 각자의 작업을 위해 사용하는 개념입니다. 이 브랜치는 꽤 중요하고 복잡한 내용이므로 추후 따로 심도 있게 살펴볼 예정입니다. 현재의 관점에서는, [master] 태그가 붙은 위치는 현재 사용자 자신의 로컬 저장소의 상태라고 이해하시면 됩니다. [origin/master]라는 태그가 붙어있는 커밋의 위치는, 로컬이 아닌 (원격 저장수)repository의 현자 상태를 나타냅니다.

 

그럼 위의 이미지를 볼까요? [origin/master] 태그는 "John 내용 추가"에 위치하고 있고, [master] 태그는 "[ME]피처 리스트 추가" 영역에 있습니다. 우리가 로컬 저장소(PC)에서 작업해 커밋을 만들었지만 아직 github 원격 저장소 repository에는 등록하지 않은 상태입니다. 우리는 곧 push 명령을 통해, github repository에도 이 내용을 반영할 예정입니다. 

 

즉, 현재 단계에서는 ME가 작업을 했지만 다른 사람들이 그 내용을 업데이트할 수 있는 상황이 아닌 것이죠. 이를 통해 repository의 상황을 유추할 수 있습니다. 이제 그럼, John이 해당 커밋을 업데이트(Pull)할 수 있도록 우리도 Push를 해보겠습니다. 

 

 

Push를 진행합니다

 

상단 탭의 Push에 [1]이란 숫자가 있습니다. 이는, 로컬 저장소에서는 커밋이 생성되었지만 아직 repository에 반영되지 않은 커밋이 1개가 존재한다는 뜻입니다. 이제 [Push] 버튼을 누르면 완료됩니다. 이 과정은 CLI에서 다음 명령어와 같은 동작을 의미하게 됩니다. 

 

$git push origin master

 

 

이 작업이 완료되고 소스트리 상태를 다시 보겠습니다. 가장 최신의 "[ME] 피처리스트 추가 진행" 커밋에 [master]와 [origin/master] 태그가 모두 붙어있습니다. 로컬 저장소의 커밋이 repository에도 정상적으로 반영되었다는 의미가 됩니다.

 

로컬 저장소의 모든 커밋이 repository에 반영된 상태

 

 

자, 그럼 이제 이 상태에서 John의 입장이 되어보겠습니다. John의 로컬 저장소(PC)에서는 지금 소스트리에서 어떤 화면 상태로 보이게 될까요? John의 로컬 저장소에 있는 readme.txt는 별다른 작업이 없었다면, "John 내용 추가" 커밋 상태를 유지하고 있습니다.

 

이 상태에서 소스트리를 들어가 보면, 새로운 커밋이 올라와 있게 됩니다. "[ME] 피처리스트 추가 진행"이란 커밋이 나타났습니다. 그럼 John의 입장에서는, 현재 [master] 태그는 어디에 위치할까요? "John 내용 추가"에 위치합니다. 그리고 "[ME] 피처리스트 추가 진행" 커밋이 한 줄 새롭게 등장했고, [origin/master] 태그가 붙어있게 됩니다. 

 

아까 ME의 상태와는 정반대입니다. repository에는 새로운 커밋이 업데이트되었는데, John의 로컬 저장소에는 이 내용이 업데이트가 되지 않았습니다. 이 상태에서 John은 Pull을 진행해 자신의 로컬 저장소의 파일 상태를 업데이트하게 됩니다. 

 

 


 

여기까지 간단하게 소스트리를 통한 repository와 로컬 저장소의 상태 변화를 실습해 보았습니다. 디테일한 브랜치의 개념과 협업 방식은 좀 더 깊이 있게 살펴볼 예정이니, 일단은 오늘 위의 origin과 master의 개념을 이해하는데 집중하시기 바랍니다.