작업 폴더 (Working Directory), 스테이지 (Stage, Index), 저장소 (repository)
Git 버전 생성 과정
작업 폭더 생성 -> Git 초기화 -> 문서 생성/수정 -> 스테이지 영역에 저장 -> 커밋
Commit 기록 확인 : $ git log
변경사항 확인 : $ git diff
단계별 파일 상태 확인 : tracked, untracked, unmodified, modified, staged
작업 되돌리기
작업 트리에서 수정한 파일 되돌리기 : $ git restore
스테이징 되돌리기 : $ git restore –staged
최신 커밋 되돌리기 : $ git reset HEAD^
특정 커밋으로 되돌리기 : $ git reset 해시
3. Git Branch
3.1 Branch 란?
새로운 작업을 만드는 것
큰 나무 줄기에서 작은 줄기가 뻗어 나오는 것처럼 저장 공간 하나에서 가상의 또 다른 저장 공간을 만드는 것이라고 생각하면 쉽다
브랜치는 부분 프로젝트를 독립적으로 관리하는데 사용
3.2 브랜치 기능
Git으로 버전 관리를 시작하면 기본적으로 main 브랜치가 만들어짐
사용자가 커밋할 때마다 main 브랜치는 어떤 게 최신 커밋인지 정보를 가짐 → 브랜치는 커밋을 가리키는 포인터와 비슷함
3.3 브랜치 실습
3.3.1 분기(branch)
main 브랜치에서 새 브랜치를 만드는 것
기존 파일은 main 브랜치에 그대로 유지하면서, 새 브랜치에서 기존 파일 내용을 수정하거나 새로운 기능을 추가할 수 있음.
3.3.2 병합(merge)
새 브랜치에서 원하는 작업을 다 끝냈다면 새 브랜치에 있던 파일을 원래 main 브랜치에 합치는 것 → 기본 파일은 main 브랜치에 그대로 둔 상태에서 새로운 브랜치를 분기한 후 수정이나 추가 작업을 하고 별 문제없이 완성되었다면, 새 브랜치의 내용을 main 브랜치와 병합
3.3.3 서로 다른 파일 병합
main 브랜치로 이동
“queen” 브랜치 생성 → 브랜치 변경
“queen” 브렌치에서 blog_queen.html 파일 생성 후 커밋
“queen” 브랜치 → “main” 브랜치로 변경
“queen” 브랜치에서 “queen” 브랜치 병합(merge)
commit log 확인
3.3.4 서로 다른 브랜치에서 한 문서의 다른 부분을 수정했을 때 병합하기
“main” 브랜치의 blog.html 파일과 “king” 브랜치의 blog.html 파일 비교
“king” 브랜치에서 blog.html 수정 commit
“main” 브랜치로 이동해서 “king” 브랜치 병합
main 브랜치의 수정 내용과 king 브랜치의 수정 내용이 자연스럽게 하나의 파일에 합쳐진 것을 볼 수 있음 이렇게 같은 문서로 서로 다른 위치를 수정했을 경우 자동으로 합쳐 주는 기능이 있어 Git은 더욱 강력한 도구가 됨
“main” 브랜치에서 blog.html 확인
3.3.5 서로 다른 브랜치에서 한 문서의 같은 부분을 수정했을 때 병합하기
main” 브랜치의 blog.html 의 <hearder> 태그 부분을 수정 하고 커밋
“king” 브랜치의 blog.html 의 <hearder> 태그 부분을 수정 하고 커밋
“main” 브랜치에서 “king” 브랜치 병합 → 경고 메시지가 나타남. 이 메시지는 work.txt를 자동 병합하는 동안 충돌이 발생했다는 뜻
충돌이 생긴 문서는 자동으로 병합될 수 없으므로 사용자가 충돌 부분을 직접 해결한 후 커밋해야 함
커밋 로그 확인
3.3.6 병합이 끝난 브랜치 삭제하기
새롭게 생성했던 브랜치를 삭제하려면 main 브랜치에서 삭제 진행
현재 브랜치가 main 브랜치가 아니라면 main 브랜치로 전환
브랜치를 삭제할 때는 git branch 명령에 -d 옵션을 추가한 후 그 뒤에 삭제할 브랜치 이름 형식으로 작성
“queen” 브랜치를 삭제
4. GitHub 시작하기
4.1 지역 저장소와 원격 저장소
GitHub에서 버전을 관리할 때도 저장소를 만들어 사용
지역 저장소(local repository) : 사용자 컴퓨터에 있는 저장소
원격 저장소(remote repository) : GitHub에 있는 저장소
먼저 local repository를 만들어 작업한 후 그 내용을 remote repository로 올리고 변경 사항이 생길 때마다 remote repository에 반영
→ 지역 저장소에서 원격 저장소로 커밋을 등록하는 것을 ‘푸시(push)’
지역 저장소를 거치지 않고 원격 저장소에서 커밋 생성
→ 원격 저장소의 변경 사항을 지역 저장소로 내려 받는 것을 ‘풀(pull)’
지역 저장소와 원격 저장소를 항상 같게 유지하는 것 → ‘동기화(synchronize)’
4.2 원격 저장소
Git에서는 지역 저장소와 원격 저장소를 연결해서 버전 관리하는 파일을 백업
원격 저장소는 여러 로컬 저장소와 연결되어 ‘백업’과 ‘협업’과 같은 중요한 역할을 함
4.3 Git의 개념
commit은 로컬 저장소에서 이루어 지고 Push라는 동작으로 원격 저장소에 반영됨(SVN의 차이점)
로컬 저장소에서 작업이 이루어져 매우 빠른 응답을 받을 수 있음
Pull 또는 Fetch로 서버에서 변경된 내역을 받아 올 수 있음
4.4 GitHub로 할 수 있는 일
원격 저장소에서 Git을 사용
GitHub는 깃 사용을 위한 원격 저장소를 제공하는 서비스
→ 깃을 설치하지 않고도 온라인에서 깃의 버전 관리 기능을 사용할 수 있음
지역 저장소를 만들지 않아도 GitHub에 원격 저장소를 만들어 사용 가능
지역 저장소가 있다면 원격 저장소와 연결해서 사용
→ 동기화하면 지역 저장소를 인터넷에서 백업
자신의 개발 이력을 남길 수 있음
GitHub에서 소스를 수정하고 커밋 → 사용자 초기 화면에 날짜별로 기록
Github는 개발자가 자신의 개발 이력을 관리하기 좋은 플랫폼
다른 사람의 소스를 살펴볼 수 있고, 오픈 소스에 참여할 수도 있음
4.5 설정 절차
1. 원격 저장소 생성하기
Repository name : 저장소 이름 입력
Descritption : 설명 입력(선택)
Public, Priate : 공개 또는 개인저장소 선택 → [Create repository]
Add a README file 체크
Add .gitignore 체크
2. 로컬 저장소 생성하기
디렉토리에 폴더 및 파일 생성
생성한 디렉토리 확인 - $ ls
디렉토리로 이동 - $ cd 디렉토리 명
Git 저장소 생성 - $ git init
3. 원격 저장소에 저장하기
저장소 등록 - $ git remote add origin : 복사한 원격 저장소의 주소
Push : 로컬 저장소 내용을 원격 저장소로 보내기 : $ git push -u origin main
→ 파일 목록 위에 있는 [Add file]을 클릭한 후 [Create new file]을 선택
→ [Commit new file]을 클릭
파일 가져오기
$ git pull origin main
commit hash 오른쪽을 보면 (HEAD -> main) 외에 origin/main도 있음 원격 저장소의 최신 커밋이라는 뜻
5. GitHub 협업하기
5.1 원격 저장소 복제하기
서로 다른 컴퓨터에서 원격 저장소 함께 사용
git clone
GitHub에 만든 원격 저장소를 ‘git_home’이라는 지역 저장소로 복제
터미널 창에서 홈 디렉터리로 이동
$ git clone remote repository 주소 git_home
git_home이라는 디렉터리가 없다면 자동으로 디렉터리가 만들어짐
원격 저장소의 내용을 ‘git_office’ 디렉터리에도 복제
원격 저장소를 복제하면 지역 저장소와 원격 저장소가 자동으로 연결됨 git_home 디렉터리나 git_office 디렉터리에서 git remote -v 명령을 사용하면 원격 저장소에 연결된 것을 확인할 수 있음
5.2 Home에 있는 작업 파일 올리기
git_home 디렉터리로 이동한 후 새로운 커밋을 만듦
txt 문서를 열고 간단한 내용을 추가, 스테이징, 커밋 - $ git push
커밋을 원격 저장소에 올림
5.3 Office에서 내려 받아 작업
터미널 창에서 git_office 디렉터리로 이동 - $ git pull 원격 저장소에 새로 올라온 커밋을 가져옴
이번에는 git_office 디렉터리에서 txt 파일을 수정 txt를 열면 git_home에서 수정했던 내용이 포함되어 있음 git_office 에서는 추가 수정하고 하고 저장
커밋을 만들고, remote repository로 push
5.4 원격 브랜치 정보 가져오기
git fetch
remote repository 에서 변경 이력(원격 저장소의 최신 commit 정보)만 가져옴, 원본 파일은 병합 X
fetch로 가져온 커밋 정보를 확인하려면 git diff 명령을 사용해서 현재 최신 커밋과 원격 저장소에서 가져온 커밋의 차이 확인
$ git diff HEAD origin/main
원격 저장소의 commit을 확인하고 지역 저장소에 합치겠다고 결정했다면 merge 명령을 사용해 병합
$ git merge origin/main
5.5 협업을 위한 저장소 만들기
GitHub의 공개 저장소는 주소만 알면 누구든지 접속해서 모든 소스를 살펴볼 수 있음
GitHub 회원이라면 누구나 오픈 소스 프로젝트의 소스를 내려 받을 수도 있음 하지만 누구나 저장소에 커밋을 푸시 할 수는 없음
공개 저장소든 비공개 저장소든 승인된 공동 작업자에게만 커밋을 올릴 수 있는 권한을 주어야 함 그래야 프로젝트 소스가 무분별하게 수정되는 일을 막을 수 있음
팀장과 팀원 1, 팀원 2 이렇게 세 사람이 GitHub를 통해 협업 한다고 가정
팀장이 저장소를 만든 후 팀원 1과 팀원 2를 공동 작업자로 추가
팀장이 ‘teamproject’라는 GitHub 저장소를 만들 때 ‘Add a README file’에 체크한 후 [Create repository]를 클릭하면 main 브랜치가 만들어짐
5.6 저장소에 브랜치 만들기
GitHub 저장소에서 [main]이라고 브랜치가 표시된 부분을 클릭하면 브랜치를 추가하거나 전환가능
새로 추가할 king을 입력한 후 그 아래 표시된 [Create branch king from ‘main’]을 클릭
king 브랜치가 추가되면서 king 브랜치로 전환됨
같은 방법으로 queen 브랜치도 추가할 수 있음
이제 브랜치 목록을 클릭하면 기본 main 브랜치 외에 king 브랜치와 queen 브랜치가 생겨 있고, 사용자마다 이 브랜치들로 자신의 커밋을 푸시 하는 것
5.7 공동 작업자 추가하기
저장소에서 [Settings]를 클릭
왼쪽 항목 중 [Collaborators]를 선택한 후 [Add People]을 클릭하면 공동 작업자를 추가할 수 있음
공동 작업자의 이메일 주소를 입력하다 보면 입력 창 아래에 완성된 이메일 주소가 나타남
완성된 이메일 주소를 클릭한 후 [Add 메일 주소 또는 사용자 이름 to this repository]를 클릭
같은 방법으로 필요한 공동 작업자를 계속 추가할 수 있음
저장소에 초대받은 사용자는 협업자로 초대됐다는 이메일과 GitHub 메시지를 받게 되는데, GitHub 메시지 화면에서 [Accept Invitation]을 클릭하면 초대를 수락하는 것이 됨
5.8 원격 저장소 복제하기
터미널에서 git clone 명령 뒤에 원격 저장소 주소를 붙여 넣음 그리고 뒤에 지역 저장소 디렉터리 이름까지 적으면 그 디렉터리로 저장소가 복제
원격 저장소를 복제했다면 앞으로 자신이 직접 커밋을 만들고 GitHub로 푸시할 수 있음 그런데 그 전에 커밋할 때 사용할 이름과 이메일 주소를 설정해야 함 아직 지역 저장소 디렉터리에 있지 않다면 지역 저장소 디렉터리로 이동한 후 git config 명령을 사용해 이름과 주소를 지정
5.9 원격 저장소에 커밋 푸시
공동 작업을 할 때는 내가 커밋을 올리기 전에 누군가가 원격 저장소에 커밋을 푸시 했을 수도 있으므로 항상 풀을 먼저 해야 함
변경 사항이 있다면 내려 받아서 지역 저장소에 병합해 주고, 변경 사항이 없다면 ‘Already up to date’ 라고 표시됨
king 브랜치로 전환한 후 임의의 king.txt 문서를 작성 → 문서를 스테이지에 올리고 → 커밋
git push 명령을 사용해 방금 만든 커밋을 GitHub에 올림
처음 푸시 할 때는 –u 옵션을 붙이고, GitHub의 king 브랜치로 푸시 할 것이기 때문에 ‘origin king’ 브랜치 이름을 넣어 줌
GitHub에 제대로 올라갔는지 확인하려면 저장소에서 main이라고 된 브랜치 목록을 클릭한 후 [king]을 선택해서 브랜치를 전환
방금 푸시 한 커밋이 king 브랜치에 올라온 것을 확인할 수 있음
5.10 Pull request 보내기 및 병함
king 브랜치에 푸시 했던 커밋은 main 브랜치에는 커밋이 병합되지 않은 상태
파일 목록 위에 있는 [Contribute]를 클릭한 후 [Open pull request]를 클릭
다음과 같이 ‘Pull Request’ 메시지를 작성한 후 [Create pull request]를 클릭하면 협업 중인 저장소에 풀 리퀘스트가 전송
협업 중인 원격 저장소에 등록된 풀 리퀘스트는 공동 작업자 누구나 살펴보고 병합할 수 있음 공동 작업자 가운데 누군가 ‘Pull Request’를 요청하면 저장소 파일 목록 위의 [Pull request]에 숫자가 표시됨 [Pull Request]를 클릭
공동 작업자들이 등록한 ‘Pull Request’가 목록 형태로 나타남 아직 마무리되지 않은 ‘Pull Request’는 Open 상태라고 하는데, ‘Pull Request’ 제목 앞에 가 붙은 것은 Open 상태의 ‘Pull Request’임
‘Pull Request’ 메시지를 살펴본 뒤 내용에 문제가 없으면 [Merge pull request]를 클릭해 병합 필요하다면 이 공간을 통해 ‘Pull Request’를 남긴 사람과 메시지를 주고받을 수도 있음
커밋을 브랜치로 병합하는 것도 하나의 커밋이므로, 커밋 메시지를 입력해야 함 기본 메시지를 사용하거나 원하는 내용을 입력할 수 있음. 입력한 후에는 [Confirm merge]를 클릭
‘Pull Request’가 성공적으로 병합되었다는 메시지가 나타나면 병합이 끝난 것 그리고 Open 상태였던 ‘Pull Request’가 Merged 상태로 바뀜
화면 왼쪽 위에 있는 [Code]를 클릭해서 파일 목록으로 돌아가 보면, king 브랜치로 푸시 했던 커밋이 main 브랜치로 병합된 것을 확인 할 수 있음