만약 레포트를 수정하다가 망해서 스트레스로 탈모가 생긴다면? ㄹㅇ 미침. 한 번 경험해보면 파일을 편집하기 전에 미리 복사를 해서 작업하게 된다. 근데 매번 작업할 때마다 복사를 반복하게되면
20230806Git레포트.text
20230806Git레포트수정본.text
20230806_Git레포트수정본2.text
20230807_Git레포트최종본.text
20230807_Git레포트최종본2.text
20230807_Git레포트찐막.text
20230807_Git레포트찐찐막때려죽여도_찐막.text
저장해야 할 파일이 많아지고 지저분해진다. 그리고 저장을 거듭하면서 각 파일의 어느 부분을 수정했는지 확인하기도 번거롭고 명확하게 확인이 잘 안된다.
코드에서도 분명 그런 점에 빡이 쳐서 한 구세주께서 코드를 잘 관리할 수 있는 프로그램을 만들었는데, 그것이 Git이다.
Git은 소스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'이다. 말 그대로 소스코드를 변경했다면 변경 전 시점인 버전과 변경 후 버전이 모두 기록되서 도중에 망하더라도 원하는 시점의 버전으로 되돌아갈 수 있다.
기능을 개발하면서 코드 변경점을 “기록”할 수 있다.
문제가 생겼을 때 특정 지점으로 되돌아 가는 것이 쉽다.
→ 로그아웃 기능에 문제가 생기면 다시 돌아가서 로그아웃 기능 개발 시작부터 다시 진행이 가능하다.
(물론 정말 어쩔 수 없는 상황이 아니라면 협업할 때 문제가 생길 수 있기 때문에 과거로 돌아가진 않는다.)
이러한 특징 때문에 git을 버전 관리 도구라고 한다.
기본적으로 명령어들은 리눅스 기반으로 만들어지기 때문에 리눅스 명령어도 알아야한다.
바탕화면에서 오른쪽 클릭을 후 Git bash를 열어서 실습해보자. 터미널에서 모든 작업을 한다고 생각하고 실습해보자.
1) pwd
2) ls
3) ls -a
--
는 앞의 명령어(ex. ls
)의 추가 기능을 사용하고 싶을 때 붙인다.
-a
는 all의 약자이다.
-숨겨진 폴더도 보여준다.
4) mkdir 폴더명
-make directory의 약자이다.
-현재 경로에서 폴더를 생성하는 명령어이다.
5) touch 파일명
-현재 경로에서 파일을 생성하는 명령어이다.
(원래는 파일의 생성과 파일의 날짜, 시간을 변경하는 명령어라고 한다.)
6) cd 경로
-change directory의 약자이다.
-터미널에서 폴더 위치를 이동하기 위해 사용한다.
-ls
명령어 입력 후 현재 내가 어떤 폴더로 이동할 수 있는지 확인 먼저 해야한다.
-/
(슬래쉬)는 '~안에서'라고 생각하면 된다.
.
(점 한 개)는 현재 위치이다...
(점 두 개)는 상위 폴더(디렉토리)이다.→ cd 실습
→ 바탕화면에서 git bash를 켜서 Git 폴더 안에 'hello.html'파일을 만들어보자.
바탕화면에 새 폴더(Git-test)를 VS Code에서 열고 파일(index.html)을 하나 만들어 내용을 써놓고 터미널에서 코드를 실습해보자.
git init
→ 터미널을 실행시켜보면 현재 내 폴더 위치(~/Desktop/Git-test)가 표시된다.
→ git init
명령어를 입력 후 엔터를 누른다.
→ ls -al
명령어를 입력 후 확인해보면 .git이라는 폴더가 하나 생긴 것을 확인할 수 있다.
.git 이라는 곳에서 코드 변경을 계속 추적할 것이다. .git 이라는 폴더가 있으면 해당 프로젝트에서 더이상 git init
명령어를 입력할 필요가 없다.
git init
명령어는 개발 프로젝트 시작 시 딱 한 번만 입력하면 된다? 정답: Yesgit init
을 하면 현재 프로젝트에 어떤 변화가 일어나나요?git add 파일명
& git commit -m "메시지"
→ index.html 코드 추가 후 터미널에 git add 파일명
과 git commit -m "메시지"
를 입력
git add
는 변경 내용이 있는 파일들 중 저장하고 싶은 파일을 지정하는 명령어이고, git commit
은 실제로 변경점을 메시지로 북마크를 지정해서 변경 내용을 저장하는 명령어이다. → 그럼 hello.html 파일을 하나 더 만들고 원하는 파일만 변경 내용을 저장해보자.
→ 이제 index.html과 hello.html의 코드를 수정해보자.
→ 이 둘 중에서 hello.html 파일만 저장해보자.
→ 실제로 index.html 파일이 저장되지 않았다는 것을 확인하기 위해 git status
라는 명령어를 입력해보자. 코드의 변경은 있지만 저장을 하지 않은 파일은 'modified: index.html' 라고 표시된다.
→ 만약 변경한 파일이 아주 많고 모든 파일을 저장하고 싶다면 git add .
('.'(점)은 현재 폴더(디렉토리)에 있는 모든 파일들을 의미한다. 그럼 hello.html과 index.html의 코드를 변경한 후 모두 저장시켜보자.
→ 이제 git status
명령어를 입력하면 'bash: get: command not found(commit 할 파일이 없다)'라고 나온다. 즉, 모든 파일의 변경 사항을 저장했다는 뜻이다.
git log
git log
명령어를 통해 보이는 커밋 메시지로 어느 시점에 어떤 변경점이 있었는지 추측이 가능하다.git branch 브랜치명
& git switch 내가 작성한 브랜치명 혹은 git checkout
내가 작성한 브랜치명git branch 브랜치명
명령어를 입력하면 브랜치(복사본)이 생성된다. 생성된다고 해서 해당 브랜치로 이동한 것은 아니다.git switch 내가 작성한 브랜치명
혹은 git checkout 내가 작성한 브랜치명
명령어를 쓴다.git branch -d 브랜치명
으로 브랜치를 삭제할 수 있다. git branch
로 브랜치 리스트를 확인하고 삭제하면 된다.→ 브랜치를 생성해보고 git branch
로 내가 만든 branch 리스트를 확인해보자.
→ 이제 해당 브랜치로 이동한다.
→ 현재 위치가 profile 브랜치로 변경되었다. 이것은 기존의 master 브랜치에 있던 코드를 그대로 복사해서 새로운 곳에서 코드를 짤 수 있다는 뜻이다. 그럼 profile 브랜치에서 코드를 변경하고 git add & git commit 명령어도 입력해보자.
→ profile 브랜치에서 코드를 변경 및 저장했다. 그럼 기존의 master 브랜치로 이동(git checkout master
)해보자.
→ master 브랜치를 보면, index.html과 hello.html에서 분명 코드를 고쳤는데 변경되기 전의 코드이다. 즉, 원본은 변경하지 않고 profile 브랜치에서만 코드를 변경한 것이다.
// -c 는 create의 약자
git switch -c feature/login
// -b는 branch의 약자
git checkout -b feature/login
git merge
→ 원본 브랜치(master)로 이동해서
`git switch master`
→ git merge 새롭게 기능을 개발한 브랜치명 명령어
를 입력하면 원본 브랜치로 코드가 합쳐진다.
→ 우리는 github에서만 합칠 예정이라 쓸 일은 없을 것 같다.
git stash -u -m "메시지"
git add
및 git commit
로 저장하지 않으면, git switch 혹은 git checkout
명령어가 작동하지 않을 때가 있다.((정확히는 항상 그런 것은 아니고, 이동하는 브랜치의 코드와 내가 변경한 코드에서 겹치는 부분이 있을 때 이동이 안되는 것이다.) 만약 급하게 브랜치 이동을 해야하는데 아직 코드 개발을 다 하지 못한 경우 git stash
명령어를 쓴다.-u
는 untracked 파일들의 변경사항도 모두 저장하겠다는 뜻-m
은 커밋 메세지처럼 어떤 기능을 개발하는 중이었는지 간단하게 메세지를 작성할 수 있게 하는 옵션→ profile 브랜치로 이동해서 코드를 변경해보자.
→ 그리고 git stash -u -m "메시지"
명령어를 입력해보자.
→ 코드에서 변경했던 부분들이 사라진다. git stash list
명령어를 치면 임시 저장한 부분을 확인할 수 있고, q
를 눌러 빠져나올 수 있다.
→ 임시 저장했던 부분을 다시 불러오려면 git stash apply stash@{숫자}
를 입력하면 된다. 숫자
는 git stash list
명령어 입력 후 확인할 수 있다.
git reset
& git revert
git reset
: 과거 커밋으로 완전히 되돌아가는 명령어git revert
: 과거 커밋을 다음 커밋으로 만들어 되돌아가는 명령어Git은 '로컬 저장소'라는 이름으로 전체 데이터를 작업 폴더에 넣어 관리한다. 이는 전체 기록과 각각의 기록을 추적할 수 있는 정보를 포함하고 있는 저장소이다. 즉, 자기 컴퓨터에 모든 파일을 다 받아서 하는 셈이다. 이 '로컬 저장소' 는 해당 작업자의 작업을 버전별로 저장하고 관리하는 중간 관리 역할도 하면서, 동시에 해당 작업자와 다른 작업자의 작업을 '각기 다른 사람의 로컬 저장소'로 다원화 하는 역할도 가지고 있다. 즉, 여러 기여자가 메인 서버의 편집 버전 숫자 증가를 공유하는 것이 아니라, 각 유저별로 나름 자기 버전의 편집버전을 올려가다가, 필요해지면 서버와 각 유저가 작업을 마친 원하는 버전을 통합시켜 서버 단위의 편집버전을 +1 올리는 것이다.
작업이 끝나면 Git 원격 저장소로 다시 발행하는데, 여기에서도 메인 저장소와 합치기 전 메인 저장소와 격리시키고 따로 개발 할 수 있는 가지라는걸 만들어 가지의 개발이 완료될 시 메인 저장소와 합치고 가지는 삭제시키는 가지치기를 할 수 있으며, 또한 개발 중간중간 꼬리표를 매겨 개발을 더 수월하게 할 수 있다.
드라이브를 사용하기 이전에는 레포트가 날아갈 경우를 생각해서 usb에 담아다니고는 했다. 하지만 이 조차도 usb를 잃어버리면 인생 망한 기분이다. 이런 상황을 방지하기 위해 우리는 드라이브, 클라우드 등에 백업을 해놓다. 이런 공유 저장소에 파일을 저장하면 다른 사람들과도 쉽게 공유가 가능하다. Github은 대표적인 무료 Git 저장소 / 온라인 코드 저장소이다.
내 코드를 온라인 저장소에 백업을 할 수 있다.
팀원들과 협업할 때 내 코드를 공유할 수 있다.
함께 작업이 가능하다.
git add & git commit
명령어를 입력해서 변경사항 저장해준 후 로컬에서 main으로 업로드를 하기 위해 git push origin main
명령어 입력.팀장의 온라인 저장소(github)의 레포리지(저장소)에서 코드를 처음 받아올 때는 git origin 대표자의 github 주소 .(띄우고 점 = 파일만 가져옴)
명령어로 내 로컬 저장소로 가져온다.
[대표자의 github 주소]
[터미널 / git bash]
자기가 담당한 기능별로 브랜치 만들기 - 'git branch 브랜치명'으로 브랜치를 만들고 git switch/checkout 내가 지정한 브랜치명
으로 브랜치로 이동한다.
git add .
& git commit -m "메시지"
로 저장해준다.git push origin 브랜치명
명령어로 github에 코드를 내 브랜치 이름으로 업로드한다.→ git push
를 하면 github에 'Compare & pull request'가 자동으로 생성된다.
'Compare & pull request'를 누르면 메인 브랜치에 내 브랜치를 가져와 병합시키는 식이 있는데 'Able to merge(병합 가능)'이라고 쓰여져 있다. 내가 작성한 커밋도 확인이 가능하다. 다 확인이 되었으면 'Create pull request'를 누른다.
이어지는 페이지에 보면 코드를 합칠 수 있는 상태라고 뜨고 'Merge pull request' 버튼을 누른 후 'Confirm Merge'라고 한 번 더 누르면 최종적으로 코드가 합쳐진다. 또 내가 작성한 커밋 내용과 파일의 변경 사항들을 볼 수 있다.
get clone 주소
명령어가 아니라 터미널에서 'git switch/checkout main' 명령어로 로컬에서 main 브랜치로 이동한다. 이때 아래에 'Your branch is up to date with 'origin/main'.'라고 쓰여있는데 이 말은 현재 내 컴퓨터(로컬)의 main 브랜치 코드가 github의 main 브랜치보다 과거의 코드라고 이야기하는 것이다.
→ 'git pull origin main'으로 내 컴퓨터도 github 코드를 가져와서 최신화한 뒤 위 과정을 반복하면 된다.
git pull origin main
명령어로 내 브랜치에 받아와서 코드가 잘 실행되는지 확인한다.