[엘리스sw] 1주차 5일 - Git
1. Git이란?
Git을 사용하는 이유
· 파일의 버전이 달라지는 경우
· 한 파일에 동시에 접근하여 수정하는 경우
→ Git을 활용하여 각 파일의 스냅샷 형태로 저장하여 원하는 버전으로 이동 가능함
Git의 특징
가지치기와 병합 | main코드에서 독립성 유지하면서 개발 진행 가능함. |
가볍고 빠르다 | · SVN (subversion) : 중앙시스템에 여러 개발자들이 접속하여 항상 네트워크가 필요함. · git : 대부분 서버와의 통신 없이 로컬에서 진행됨. 다른 사람과 코드를 공유할 때만 중앙 서비스에 접속함. |
분산 작업 | 복사된 프로젝트에서 동시에 작업 진행 가능함. |
데이터 보장 | CommitID가 같음 = 파일 구성이 완벽히 같음. 누가 어느 파일을 작업했는지 기록이 남음. |
준비 영역 (Staging area) |
working directory [작업 영역] → git add → staging area [준비 영역] → git commit → repository [저장소] |
오픈 소스 | 소스코드를 공개한 상태에서 누구나 프로젝트의 발전에 기여할 수 있음. |
Git 호스팅 서비스 | GitHub, Bitbucket, GitLab |
Git 설치와 초기 설정
설치된 상태
Git 초기 설정
git --version | Git 설치 확인 |
git config --global user.name "elice" git config --global user.email gitaccount@elice.com |
사용자 정보 설정 |
git config user.name "elice" git config user.email gitaccount@elice.com |
사용자 정보 설정 (프로젝트마다 다른 사용자 정보) |
git config --list | 설정 정보 확인 |
Git 저장소 생성
• cd (디렉토리) : 프로젝트 경로로 감
• git init : 기존의 디렉토리를 git repository로 설정 → git 저장소를 초기화
• ls -al : 파일 목록 출력 → 프로젝트 디렉토리에 .git 디렉토리가 생성됨.
$ git init
Initialized empty Git repository in /path/to/your/project/.git/
$ ls -al
total 12
drwxrwxr-x 3 user user 4096 Dec 29 10:00 .
drwxrwxr-x 7 user user 4096 Dec 29 09:55 ..
drwxrwxr-x 7 user user 4096 Dec 29 10:00 .git
2. Git 시작하기
Git 파일 생성
파일 영역의 라이프 사이클
파일의 상태 라이프 사이클
저장소 생성 완료 후, 새로운 comment.js 파일 작업을 완료한 상태. 이 파일을 저장소에 반영하는 단계는? |
1) comment.js 파일을 준비영역(staging area)으로 보냄.
- git add comment.js
- git add . : 현재 폴더의 모든 파일
- git add README.txt main.py : 여러 개의 파일은 공백으로 구분
2) staging 상태 확인
- git status
Git 저장소 반영
comment.js 파일 작업을 staging 하였으므로 이제 무엇을 수정하고 추가했는지 메시지를 남겨 저장소에 저장하는 작업 진행 |
참고
• git add : working directory → staging area
• git commit : staging area → repository
저장소 반영
· 준비영역에 있는 파일들을 저장소에 반영
· 메시지는 생략 가능하지만 넣는게 좋음.
- git commit : .git 저장소 내에 staging 파일 저장
- git commit -m "Initial commit"
저장소 반영 내용 변경
· 앞에서 적은 메시지에 오타가 있거나 누락된 파일이 있을 경우
· 텍스트 편집기가 실행되어서 수정하고 싶은 부분을 수정하면 그대로 반영됨.
- git commit --amend
저장소 반영 내역 확인
· 모든 commit을 확인할 수 있음
- git log
나노 에디터
- 새로운 파일 만들기 : nano (파일명)
- 커멧 메시지 작성 후 저장 : ctrl X + Y + enter
Git 관리 상태 확인
- git status : Staging file들의 상태 확인
- git log : .git respository에 존재하는 history 확인
대표적인 log 옵션들
git log -p -2
- -p, --patch : 각 commit의 수정 결과를 보여주는 diff와 같은 역할을 수행함.
- -n : 상위 n개의 commit만 보여줌.
- git log --stat : 어떤 파일이 commit에서 수정되고 변경되었는지, 파일 내 라인이 추가되거나 삭제되었는지 확인
- git log --pretty=oneline : 각 commit을 한 줄로 출력
- git log --graph : commit간의 연결된 관계를 아스키 그래프로 출력
- git log -S (function name) : 코드에서 추가되거나 제거된 내용 중 특정 텍스트(ex. function name)가 포함되어 있는지 검사
- Changes to be committed : 준비영역(staging-area)에 있음. → 여기서 없애려면 'git reset 파일명' 입력
- Changes not staged for commit : 수정되었지만 준비영역에는 없음.
- Untracked files : 준비영역에 없음.
3. Git 가지치기
Git Branch
독립적으로 어떤 작업을 진행하기 위한 개념
각각의 Branch는 다른 Branch의 영향을 받지 않음
메인 Branch : 배포할 수 있는 수준의 안정적인 Branch
토픽 Branch : 기능 추가나 버그 수정과 같은 단위 작업을 위한 Branch
- git branch like_feature(브랜치명) : 해당 브랜치 생성
- git branch : 현재 브랜치 확인
- git checkout like_feature(브랜치명) : (브랜치명)으로 브랜치 전환
- git checkout <snapshot hash(16진수)> : head가 해당 브랜치로 이동함
git checkout d97d38
git log --pretty=online
fast forward
like_feature Branch의 working directory에서 새로운 정보를 넣어 commit하려고 함. |
1) like_feature로 위치를 이동시킴.
- git checkout like_feature
2) like_feature branch에서의 작업을 끝마치고, master Branch로 통합함.
- git checkout master
- git merge like_feature
like_feature branch의 내용이 master branch에서 업데이트 된 내용이기 때문에 곧바로 merge가 됨.
이렇게 merge가 이루어지는 것이 fast-forward임.
갈라지는 branch
commit graph 확인 가능 |
- git log --graph -all
git checkout master을 이용하여 master로 checkout한 후 git merge like_feature로 merge함. |
- git checkout master
- git merge like_feature
Git Branch 삭제
· 사용을 마친 branch는 -d 옵션으로 삭제
- git branch --merged : 병합된 브랜치 확인
- git branch -d like_feature(브랜치명) : like_feature라는 브랜치 삭제됨.
Git Merge
merge conflict
· merge한 두 branch에서 같은 파일을 변경했을 때 충돌이 발생함.
· 같은 파일인데 수정한 내용이 다를 때를 말함.
- git merge like_features(브랜치명) : 브랜치 합치기
Auto-merging conmment.js
CONFLICT (content): Merge conflict in comment.js
Automatic merge failed; fix conflicts and then commit the result.
- git status : 어느 파일에서 충돌이 발생했는지 확인
both modified : comment.js
· 충돌이 일어난 comment.js 파일을 열어보기
· 어느 것을 선택해서 쓸 것인지 선택해서 수정
· <<<<<<<, =====, >>>>>가 포함된 행을 삭제해주기
Git merge 충돌 해결
· 수정 완료 후 git add, git commit 과정을 거쳐 다시 Merge 해줌.
- git merge like_feature(브랜치명)
Git merge 충돌 방지
· master branch의 변화를 지속적으로 가져와서 충돌이 발생하는 부분을 제거
· master는 배포 가능한 안정적인 버전만 가지고 있어야 함.
4. Git 원격저장소
원격 저장소
· 인터넷이나 네트워크 어딘가에 있는 저장소
· ex) github, gitlab
git 원격 저장소 받아오기
- git clone : 기존의 git repository를 복사 (원격, 로컬에 모두 해당)
현재 디렉토리에 직접 저장소를 생성
git clone https://github.com/example/repo.git .
현재 디렉토리 안에 새로운 폴더를 만들어서 저장소를 생성
git clone https://github.com/example/repo.git
원격 저장소 url로 받아오기
·gitlab 또는 github에서 원하는 프로젝트에서 clone 버튼을 누른다.
·2개의 옵션 중 clone with HTTPS 옵션으로 클론을 하게 됨.
- git clone https://gitlab.com/dooly/living_with_gildong.git (주소) : URL의 Git 저장소를 복제하여 로컬 머신에 저장소 생성
- git remote add origin https://gitlab.com/group/project (주소) : 로컬 저장소를 원격 저장소와 연결
저장소 주소
https://gitlab.com/group/project
- gitlab.com : 웹 호스트 서비스
- group : 그룹 명
- project : 프로젝트 명
연결된 원격 저장소 확인
- git remote
origin
원격 저장소 살펴보기
- git remote show origin : 현재 설정된 Git 원격 저장소인 origin에 대한 정보를 보여줌
· 원격 저장소의 URL · 원격 저장소의 HEAD 브랜치 · 로컬 저장소와 원격 저장소 간의 브랜치 관계 · 원격 저장소의 태그 정보 · 원격 저장소의 최신 변경 사항에 대한 정보 |
원격 저장소 이름 변경
- git remote rename origin(변경 전 이름) git_test(변경 후 이름) : 원격 저장소 단축 이름을 origin에서 git_test으로 변경
원격 저장소 삭제
· 주소가 변경되었거나 필요 없어진 저장소 삭제
- git remote rm git_test(원격 저장소 이름) : 로컬 저장소에서 원격 저장소인 git_test를 제거
복사 후 붙여넣기
- Shift + Ctrl + V
feature/time-check라는 브랜치에서 작업한 내용을 master 브랜치에 합친 뒤 브랜치를 삭제하려고 함.
1. feature/time-check 브랜치로 이동
git checkout feature/time-check
2. master 브랜치에 있는 작업 내용 병합
git merge master
3. master 브랜치로 이동
git checkout master
4. master 브랜치에서 feature/time-check 브랜치를 병합함.
git merge feature/time-check
5. merge conflict 해결
6. 충돌 해결이 완료되면 병합된 내용을 커밋함.
git add .
git commit -m "Merge feature/time-check into master"
7. feature/time-check 브랜치를 삭제함
git branch -d feature/time-check
8. 다시 master 브랜치로 이동
git checkout master
커밋 해시나 브랜치 이름에 따옴표를 쓰지 않는 것이 일반적임.
하지만 공백이나 특수문자가 있다면 묶어주는 것이 좋음.
git reset --hard 9d46f1514b36dad6947508ffeb5754330ffb2c2b
git reset --hard '9d46f1514b36dad6947508ffeb5754330ffb2c2b'