github 인터페이스를 통해 직접 많은 작업을 수행할 수 있습니다. 하지만 git으로 작업할 때 github는 원격 리모트 리포지토리이고 개인 작업자는 로컬 리포지토리에서 작업을 하게 됩니다. 따라서 github와 로컬 사이에 많은 상호 작용을 수행해야 합니다. 깃의 작업 흐름을 알아보고, github의 리포지토리를 사용해서 clone을 하고 리모트에 push 하는 과정을 살펴보겠습니다.
깃 작업 흐름 이해하기
github를 사용하여 작업할 때 개발자는 일반적으로 다음 흐름으로 작업을 하게됩니다. github에 이미 존재하는 리포지토리가 있는 상태에서 작업을 한다고 가정하겠습니다.
전체 워크플로에서 깃 허브는 원격 저장소가 되고 모든 작업자가 접근할 수 있는 코드가 저장되는 중앙위치에 불과합니다.
1. git clone
가장 먼저 하는 일은 git clone입니다. git clone을 하면 원격 저장소의 로컬 복사본이 컴퓨터에 생성됩니다. clone 명령은 복제된 저장소의 모든 branch(분기, 브랜치)를 생성하고 원격의 기본 활성 브랜치로 체크아웃합니다. 이제 프로젝트의 파일을 편집하고 새 파일을 추가할 수 있습니다.
2. git add
작업 디렉토리에서 파일을 편집하거나 새 파일을 추가하면 변경사항이 발생하게 됩니다. 이제 git add 명령을 사용해서 git에게 해당 파일의 변경사항을 추적하기 위해 staging area에 추가하게 됩니다.
3. git commit
작업에 문제가 없다면 commit을 해서 변경사항을 로컬 리포지토리에 저장되도록 할 수 있습니다. 지금 까지 모든 작업은 로컬에서 이뤄지는 작업입니다. 로컬이기 때문에 commit을 한다고 해서 다른 작업자가 내가 커밋한 내용을 확인할 수는 없습니다.
4. git commit
내 수정사항을 팀원과 공유하기 위해서는 github에 코드를 반영해야 합니다. git push 명령으로 코드를 github에 올릴 수 있습니다. 물론 프로젝트에서 여러 사람과 작업할 때 내가 변경한 특정 파일을 다른 사람도 변경했을 가능성이 있습니다. 이러한 경우 push로 인해 conflict(충돌)가 발생할 수 있으며 conflict가 났다면 반드시 해결해야 합니다. 따라서 대부분의 경우 push를 하기 전에 다른 변경사항이 있는지 확인 후 push 하는 것이 안전하고 그렇게 해야 나중에 해야 할 일이 줄어듭니다.
5. git fetch, git pull
로컬 시스템으로 변경사항을 가져오는데에는 두 가지 옵션 fetch와 pull이 있습니다.
첫 번째로 git fetch입니다. git fetch는 작업 디렉터리에 github의 원격 리포지토리의 변경사항이 바로 적용되지 않습니다. git merge를 수행할 때만 변경사항이 작업 디렉터리에 병합됩니다.
두 번째로 git pull로 가져올 수 있습니다. git pull의 경우 작업 디렉토리에 변경사항이 바로 적용됩니다. pull은 fetch(가져오기)와 merge(병합)가 한 번에 수행하는 효과가 있습니다. merge까지 완료되면 다른 개발자가 로컬에서 변경한 내용을 볼 수 있게 됩니다.
깃의 작업 흐름을 알아보았으므로 실제로 작업하는 과정을 살펴보겠습니다.
github 리포지토리 로컬로 clone 하기
github에 gittutorial이라는 리포지토리가 존재하고 있습니다. 처음 해야 할 일은 github의 리포지토리로 이동해서 clone 링크를 찾는 것입니다.
지난 포스트에서 github와 로컬에 ssh를 설정하였으므로 ssh의 링크를 이용해서 진행하겠습니다.
c:/nayotuto가 리포지토리를 복사하고 작업할 디렉터리입니다. git clone 명령어와 github에서 복사한 링크를 붙여 넣고 프로젝트를 가져오겠습니다.
git clone git@github.com:nayotuto/gittutorial.git
ssh를 사용하고 있으므로 제대로 설정되었다면 id와 pw 없이 바로 github의 리포지토리를 바로 클론 해올 수 있습니다.
github에서 해당 리포지토리를 복제했기 때문에 gittutorial이라는 폴더가 생성되었습니다. cd gittutorial 명령어로 복사해온 폴더로 이동해보겠습니다.
git의 작업 디렉터리로 이동하자 gitbash도 깃 프로젝트인 것을 인식하고 main branch에 있음을 바로 알려줍니다.
다시 ls -al로 프로젝트 내용을 살펴보면 몇 개 파일과 git 데이터베이스인 .git 디렉터리가 표시됩니다. git status 명령을 내려보겠습니다.
현재 main 브랜치에 있다고 알려주고 있고 origin/main에 대해 최신 상태라고 알려주고 있습니다. origin/main 브랜치는 깃허브에 있는 리모트 브랜치이고 로컬의 main 브랜치가 이 리모트 브랜치인 origin/main을 추적하고 있습니다. 이 두 개의 브랜치가(로컬의 main과 원격의 origin/main) 서로의 복사본이 됩니다. 로컬에서 main 브랜치의 파일 내용을 변경하면 github의 main 브랜치로 다시 push 할 수 있습니다.
로컬 main 브랜치에서 파일을 수정, 브랜치 업데이트가 발생
로컬에서 파일 하나를 생성하였습니다. 이제 다시 git status를 해보면 아래와 같이 나옵니다.
git은 파일이 추가되었지만 아직 추적하고 있지 않다고 알려주고 있습니다.
git add 스테이징에 파일 추가하기
git add . 명령어로 모든 파일과 디렉터리를 git에 추적하도록 추가할 수 있습니다. 이것을 staging 영역에 추가한다고 말합니다.
git add .
다시 git status로 상태를 확인해보겠습니다.
이제 git이 새로운 파일을 추적할 수 있도록 staging영역에 파일을 추가하였습니다. 하지만 staging 영역에 추가를 할 뿐 아직 git이 추적하는 상태는 아닙니다. 이제 커밋을 생성해 보겠습니다.
git commit 커밋 생성하기
git commit을 하면서 커밋 메시지를 지정하겠습니다.
git commit -m"comment"
커밋이 완료되었습니다. github는 이 커밋에 대해 알고 있을까요? 아직 모르는 상태입니다. github의 리포지토리를 이용해서 작업하는 사람도 역시 이 커밋은 로컬 커밋이기 때문에 아직 알지 못하는 상태입니다. 다시 말해 이 시점에서 다른 사람은 아직 새로 추가한 파일을 보지 못하고 새로운 파일로 작업을 할 수 없습니다.
git status를 해보면 orign/main 보다 1개의 커밋이 앞서있다고 알려줍니다. 이 변경사항을 github에 push 해야 합니다.
git push 변경사항을 깃허브 리포지토리에 반영하기
로컬 커밋을 github에 push 하겠습니다.
git push origin main
명령을 내리면 몇 초 후에 변경사항이 커밋됩니다. 명령의 origin은 리모트의 이름이고 main이 push 할 브랜치 이름이 됩니다. 당연히 main 브랜치에 push 해야겠죠? 내 커밋이 리모트 리포지토리로 푸시되고 로컬 main이 다시 리모트의 main과 동기화됩니다.
github에서 커밋한 파일이 표시되는지 확인하겠습니다.
github의 리포지토리 페이지를 새로고침 하면 새 커밋이 추가돼있는 걸 확인할 수 있습니다. index.html이 성공적으로 추가되었습니다.
git pull, 변경사항 로컬에 적용하기
index.html에 다른 개발자가 수정을 했다고 가정해 봅시다. 여기서는 github에서 index.html 파일을 수정하는 것으로 대체하겠습니다. github에서 수정하고 싶은 파일을 클릭해서 편집을 할 수 있습니다.
index.html 파일에 h1태그를 추가하였고 커밋을 하였습니다. 여기까지 리모트 리포지토리의 main 브랜치에 커밋이 하나 더 추가되었지만 아직 로컬은 이 커밋을 알지 못하는 상태입니다. git pull을 해서 바로 로컬로 가져올 수도 있지만, 원격에 변경사항을 이 있는지 엿보고 싶다면 git fetch명령어를 사용할 수 있습니다.
git fetch
git fetch로 변경사항은 가져오지만 로컬의 git 데이터베이스에는 반영되지만, 작업 디렉터리에는 반영되지 않습니다. git status로 브랜치의 상태를 살펴보겠습니다.
로컬의 main브랜치가 1개의 커밋이 뒤쳐지고 있다고 알려줍니다. 그리고 git pull로 로컬 브랜치를 업데이트하라고 알려줍니다. git pull을 실행하겠습니다.
git pull
git pull을 실행하면 fast-forward를 수행해주고 index.html이 변경됨을 알 수 있습니다. 이것으로 작업 디렉터리도 업데이트되었습니다. vscode로 index.html을 열어보겠습니다.
커밋이 내 로컬 잘 반영된 것을 확인할 수 있었습니다.
여기까지 수고하셨습니다.
'프로그래밍 > Git' 카테고리의 다른 글
Git 브랜치 전략과 github 워크 플로 (0) | 2022.09.13 |
---|---|
git branch 이해하기 (0) | 2022.09.10 |
github 리포지토리 이해하기 (0) | 2022.09.04 |
github ssh연결 설정 (0) | 2022.09.01 |
git 설치 및 환경설정 (0) | 2022.08.30 |
댓글