
개발자들이 많이 사용하는 Git Github 이러한 용어들이 익숙하지 않기 때문에 Git 과 Github를 코딩애플 강의로 공부하며 글을 작성하였습니다.
버전관리 프로그램인 Git
git으로 버전관리하는 방법
github는 어떤곳인가?
Git은 원래 Linux 운영 체제 커널을 만든 사람으로 유명한 Linus Torvalds가 2005년에 개발한 오픈 소스 프로젝트입니다.
Git은 다양한 운영 체제와 IDE(통합 개발 환경)에서 잘 작동하여 많은 개발자들에게 채택되어 사용되는 버전관리 프로그램입니다.
버전 관리는 파일 변경사항을 시간에 따라 기록하고 필요할 때마다 특정 버전을 다시 호출할 수 있는 시스템을 말합니다.
특히 소프트웨어 엔지니어링 분야에서는 일반적으로 소프트웨어의 소스코드의 변경 사항을 추적한 내용을 버전관리라고 칭합니다.
Git 은 그러한 버전관리 프로그램중 하나로 많은 프로그래머들이 사용하고 있습니다.
히스토리를 추적 및 관리할 수 있다는 말은 이전 버전을 확인할 수 있고 필요한 경우 특정 버전으로 롤백할 수 있다는 말입니다.
그렇게 함으로 새로운 기능을 추가하거나, 오류를 수정할 때 발생할 수 있는 예측 불가능한 위험을 줄일 수 있어서 대규모 개발 과정을 보다 안전하게 이끌어나갈 수 있습니다.
과거와는 다르게 하나의 프로젝트를 한 명의 개발자가 개발하기 보다는 거대한 규모의 프로젝트를 다수의 개발자가 지속적으로 개발, 배포, 운영하는 환경이 더욱 많아졌습니다.
버전관리를 통해서 다수의 개발자가 동시에 작업할 수 있는 환경을 보다 안전하고 효율적으로 만들어줄 수 있습니다.
협업을 하며 발생할 수 있는 충돌을 쉽게 해소할 수 있어 충돌을 방지할 수 있고 다른 개발자의 작업 내용을 쉽게 확인할 수 있습니다.
충돌을 원만하게 해소하지 못했거나, 프로젝트 파일이 손상되거나 유실되었을 때 등등 여러가지 오류상황으로 프로젝트 파일이 사용되지 못하는 상태가 되었을 경우 이전 버전 혹은 검증된 버전으로 롤백하여 잘못된 상태를 복구할 수 있습니다.
Git 이란 개발자의 코드를 효율적으로 관리하기 위해 개발된 분산형 버전관리 시스템입니다. 즉 파일을 관리해주는 프로그램입니다. 날짜별로 어떤 파일이 어떻게 바뀌었는지 확인하기 쉽고, commit 기능을 통해 백업용 복사본을 생성하고 이전 기록들에 대한 추적을 할 수 있습니다.
버전 만들기, 버전 분기, 돌아가기 등의 기능을 통하여서 버전관리를 하는 방법에 대해서 알아봅시다.
코드를 짜놓고 버전을 만들 때는 git add, git commit을 차례대로 입력하면 됩니다.

출처 : 코딩애플 git, github강의
Staging area는 commit하기 전에 commit할 파일들을 골라놓는 곳입니다. git add을 입력하게 되면 staging area로 파일이 들어가게 되는데 이 상태를 파일이 staging 되었다고 합니다.
파일명 하나만 staging 하고 싶은 경우
git add 파일명
여러개의 파일을 staging 하고 싶은 경우에
git add 파일명1 파일명2
작업 폴더에 있는 모든 파일을 staging 하고 싶은 경우에
git add .를 입력하면 됩니다.
staging 된 파일, 변경된 파일들을 확인하고 싶은 경우
git status명령어를 입력하면 변경된 파일, staging 된 파일들을 확인할 수 있습니다.
staging 된 파일을 제거하고 싶은 경우
git restore --staged 파일명
staging 된 파일을 모두 제거하고 싶은 경우
git restore --staged .
명령어를 입력하면 됩니다.
commit 하기 전에 현재 코드와 이전 코드가 어떤 차이가 있는지 알고 싶다면?
git diff
git diff 커밋id
git diff 커밋id1 커밋id2
명령어를 입력하면 됩니다.
특정 커밋 아이디와 현재 버전을 비교할수 있고, 서로 다른 커밋 아이디로 두 버전을 비교할 수 있습니다. Vim 에디터가 켜지기 때문에 상하 스크롤은 j, k 종료는 q를 입력하면 됩니다.
git commit -m '메시지 ex) feat : 쿠폰 기능 추가했음'
staging area에 있는 파일들을 최종적으로 repository에 올려놓는데 commit명령어를 사용하게 됩니다. repository는 commit된 파일의 버전들을 모아놓는 곳이고, repository에 올라가있는 파일을 확인하고 싶으면 작업 폴더 안에 숨겨져 있는 .git폴더를 열어보면 됩니다.
commit을 할 때 -m뒤에 메시지를 입력 가능한데 메시지에는 코드에 무슨기능 추가했다 어떤게 바뀌었다를 적어두면 됩니다.
커밋 기록을 확인하고 싶다면?
git log --all --online
git log --all --online --graph
commit 기록을 한 눈에 파악하고 싶다면 git log 명령어를 입력하면 되는데 graph 명령어를 추가하게 되면 commit기록을 그래프로 그려줍니다.
입력 후에는 Vim 에디터가 켜지기 때문에 j, k 키로 위아래 스크롤이 가능하고 q키로 종료할 수 있습니다.
커밋을 계속 하면서 코드를 짜다 보면 갑자기 새로운 기능을 추가해야하는 경우가 생기는데 원본 파일에 코드를 추가하고 커밋해도 되겠지만
혹시나 코딩을 잘못해서 지금까지 짰던 프로그램이 심각한 오류를 일으킬 가능성을 배제할 수는 없습니다.
그럴 걱정없이 안전하게 새로운 기능을 추가하고 싶으면 프로젝트의 복사본을 만들어서 버전의 분기점을 만드는것이 git에서 제공하는 branch기능입니다.
branch는 프로젝트 복사본이다 라고 생각하면 좋을 것 같습니다.
git branch 브랜치이름
명령어를 입력하면 프로젝트 복사본이 하나 생기게 됩니다.
branch는 여러개 생성할 수 있으며 기능을 개발하고 commit을 하다가 다른 branch로 이동하고 싶다면?
git switch 브랜치이름
git checkout 브랜치이름
명령어를 입력해서 다른 브랜치로 이동할 수 있습니다.
맨 처음에 생성된 branch는 설정에 따라 main master라는 이름으로 설정되어있고, main branch라고 부릅니다. 혹시, 내가 현재 어떤 branch에 있는지 까먹었다면?
git status
명령어를 입력하면 됩니다.

출처 : 코딩애플 git, github강의
main branch로 부터 파생된 어떤 branch 에서 개발했던 내용이 안정화되고 하나의 기능으로서 동작한다면 그 분기점을 main branch에 합칠 수 있습니다.
main branch로 합치기 위해서는 내가 현재 main branch에 있어야 하므로
git switch main
git merge 브랜치이름
switch 명령어를 입력하여 main branch로 이동한 이후에 merge명령어로 브랜치를 합쳐줄 수 있습니다.
brach를 여러가지 방법으로 합쳐줄 수 있는데 3가지 정도의 방법으로 합칩니다.

출처 : 코딩애플 git, github강의
위 그림과 같이 두 branch의 코드를 합쳐서 새로운 commit이 생성되는 병합방식을 3-way-merge라고 합니다.

출처 : 코딩애플 git, github강의
새로운 branch에만 commit이 있고 기준이 되는 branch에는 신규 commit이 없는 경우에 merge를 하게 되면 자동으로 위와같이 fast-forward merge가 됩니다.
자동으로 되는게 싫고 3-way merge하고 싶다면
git merge --no-ff 브랜치명
명령어를 입력하면 됩니다.

출처 : 코딩애플 git, github강의
위와같은 그림처럼 브랜치의 시작점을 다른 commit으로 옮겨줄 수 있는데 3-way가 아니라 강제로 fast-forward 하고 싶을때 이렇게 합니다.
commit 내용을 한 줄로 남기고 싶을 때 이렇게 하면 됩니다.
git switch 브랜치이름
git rebase main
git switch main
git merge 브랜치이름
위 명령어를 순차적으로 입력하면 branch가 main branch로 rebase됩니다.

출처 : 코딩애플 git, github강의
위와같은 그림처럼 merge 완료된 commit들을 보여주지 않기 위해 squash 명령어를 붙여서 사용하기도 하는데 git log를 출력할 때 쓸데 없이 많이 만들어놓은 branch들을 보기 쉽게 관리하기 위하여 사용합니다.
git switch main
git merge --squash 브랜치이름
git commit -m '메시지'
3-way, fast-forward merge를 해도 branch를 merge를 하고 나면 branch가 자동으로 삭제되지 않는데 branch를 삭제하고 싶다면?
git branch -d 브랜치이름
git branch -D 브랜치이름
병합이 완료된 branch삭제는 -d만 해도 삭제되지만 병합되지 않은 branch 삭제는 -D 를 해야 삭제됩니다.
다시 안정적인 버전으로 돌아갈 수 있는 기능 때문에 버전관리를 사용한다고 했는데 Git에서 제공하는 파일복구 방법에 대해서 알아봅시다.
git log --online
명령어를 입력해보면 커밋한 내용이 나오는데 커밋한 내용 제일 좌측에 이상한 조합으로 되어있는 문자열을 확인할 수 있습니다. 그게 commit의 아이디이고 이 아이디를 알고 있어야 그 고유아이디로 내용을 되돌려주세요 라는 명령어들이 가능합니다.
git restore 파일명
git restore --source 커밋아이디 파일명
staging 취소할 때 사용했던 restore 명령어로 가장 최근 commit된 상태로 현재 파일의 수정내역을 되돌릴 수 있습니다.
두번째 명령어는 파일을 특정 commit아이디 시점으로 복구시키는 명령어입니다.

commit한 내용을 취소하고 싶다면?
git revert 커밋아이디
명령어를 입력하면 그 commit아이디에서 실행한 내용을 취소하고 취소한 내용의 commit을 생성해줍니다.
명령어를 입력하면 Vim 에디터가 뜨는데 i를 눌러서 글자를 수정하고 esc를 눌러서 나올 수 있으며, :wq 를 누르면 커밋 메시지가 저장됩니다.
commit 내용을 revert하게 되면 commit에 기록되었던 수정사항 모두가 삭제되니 주의해서 사용해야합니다.

출처 : 코딩애플 git, github강의
특정 commit 시점으로 아얘 모든것을 되돌리고싶다면?
git reset --hard 커밋아이디
명령어를 입력하면 특정 commit아이디 이후의 모든것을 다 잃어버리게 됩니다.
정말 전부 삭제됩니다.
Git은 소스 코드를 기록하여 관리하고 추적할 수 있는 버전관리 시스템인데 협업과 백업을 하기 위해서는 원격 저장소 기능을 제공해주는 서비스가 필요합니다. 원격 저장소 기능이란 제가 만들어 둔 git repository를 온라인에 저장하는 것입니다. 이런 서비스를 hosting 해주는 사이트중의 하나가 Github입니다.
즉, Git으로 버전으로 관리하는 폴더를 Github를 통해 여러 사람들에게 공유할 수 있으며 다른 사람들이 올린 폴더에 접근할 수 있습니다.
.git 폴더도 repository이고 Github에서도 repository를 생성할 수 있는데, 그 둘을 각각 Local repository 로컬 저장소 , Remote repository 원격 저장소 라고 부릅니다.
Github 사이트에서 repository라는 책 모양 초록 버튼을 누르면 원격 저장소를 생성할 수 있습니다.
git init
명령어로 작업폴더를 로컬 저장소화 할 수 있습니다.
로컬 저장소 에서 commit한 내용을 원격 저장소에 업로드 하고 싶다면
git push -u 원격저장소주소 main
명령어로 로컬 저장소의 main 브랜치의 commit내용을 원격 저장소에 올릴 수 있습니다.
main 말고 다른 브랜치 명으로 다른 브랜치도 올릴 수 있습니다. -u 옵션은 입력한 주소를 기억하고 다음 push 명령부터 원격저장소주소를 입력하지 않아도 됩니다.
원격 저장소에 있는 내용을 그대로 내려받기 위해서는?
git clone 원격저장소주소.git
명령어를 입력하면 원격저장소에 있는 내용 그대로 다운받아서 사용할 수 있습니다.
저장소에 올리지 않을 파일들은 .gitignore 파일에 명시를 해주는데 프로젝트 생성할 때 .gitignore 생성해주는 사이트에서 gitignore에 넣을 파일 목록들을 미리 만들어주기도 합니다.
협업을 할 때 원격 저장소의 내용을 로컬 저장소로 업로드 하기위해 push 명령어를 사용하면 “로컬 저장소의 내용과 원격 저장소의 내용이 같아야 한다”라고 에러메시지가 뜹니다. 이 상태는 누군가가 원격 저장소에 내용을 변경 시킨 것이기 때문에 최신 상태를 내려받기 위해서 pull 명령을 사용하여 로컬저장소를 최신화 할 수 있습니다.
git pull 원격저장소주소
이렇게 되면 원격저장소에 있는 모든 브랜치 내용을 가져와서 로컬저장소에 합치라는 소리고 이렇게 원격저장소의 내용을 반영한 최신상태가 되면 git push가 가능해집니다.
push명령어는 fetch와 merge명령어의 축약어인데 fetch는 원격저장소에 있는 변동사항 중에 로컬저장소에 없는 변동사항들을 가져오라는 뜻이고 git merge는 그 내용을 합치라는 뜻입니다.

출처 : git과 github
원격저장소에도 branch를 만들 수 있는데
github에서 branch를 생성할 수 있고
로컬저장소에 있는 branch를 업로드해도 branch 생성이 가능합니다.
git push 원격저장소주소 로컬브랜치명
git push 원격저장소주소
위와같은 명령어를 입력하여 특정한 branch만 원격에 올릴 수 있고
로컬저장소에 있는 모든 branch를 원격에 올릴 수 있습니다.
그리고 원격저장소에서 이 branch를 합치는 것을 pull request라고 합니다.
merge 해달라는 요청을 하면 팀원끼리 코드검토가 가능합니다.
그리고 잘 된것 같아서 merge하기로 하면 3가지 옵션 중에 택1을 하면 됩니다.

로컬저장소의 3-way, fast-forward merge와 같은 기능입니다.

로컬저장소의 squash merge와 같은 기능입니다.

로컬저장소의 rebase 와 같은 기능입니다.
0. 참고자료 : 🍎 Git, Github 코딩애플 강의 바로가기 🍎
1. 참고자료 : git과 버전관리의 목적
2. 참고자료 : ATLASSIAN Document
3. 참고자료 : git과 github