[aivle school]1일차. Git으로 버전관리

서정윤·2022년 8월 29일
0

에이블스쿨

목록 보기
2/12

참고자료 http://bit.ly/git-offline

Git과 Github이 요즘 협업시 필수지만,
프로젝트할 때 마다 구글링 해서 따라하기만 하고
제대로된 원리는 모른 채 소스코드 공유만 했다.
그래서 이번 강의가 정말 재밌고 도움이 많이 됐다!
드문드문 알고있던 Git에 대해서 제대로 알게 된 1일차였다

Git이란?

소스코드를 작성하다 보면 변경사항도 많고 여러 버전을 관리하고싶어진다.
이 때 사용하는게 바로 Git
Git을 사용해서 백업/협업/디버깅 한다

Git의 장점
1. 오프라인에서 버전 만들기 가능
2. 동기화 하지 않은 버전은 자유롭게 수정 가능
3. 선택적으로 버전 만들기 가능
4. 빠르게 버전 만들기 가능

그럼 버전 관리는 왜 해야하나?
디버깅!

Git 사용해보기


현재 디렉토리를 버전관리 하라고 알려줌


ctrl+, 해서 설정 열고 exclude 목록의 .git을 삭제해서 .git 폴더를 확인


테스트용 텍스트파일을 하나 만들었다


vscode 왼쪽 source control 메뉴에 들어가면 commit 메세지를 쓸 수 있다.
commin message 를 v1으로 정하고 커밋~


하지만 깃 user 설정을 안해놨으므로 다음과 같은 에러 뜸


git config 명령어를 통해 user name 설정


user email 설정


user 정보를 설정했더니 commit이 된다!


새 버전 생성 완료


파일 내용을 수정하고 source control의 파일을 눌러봤더니 이전 버전과의 차이점이 뜬다


git status 명령어로 work1.txt가 수정되었지만 커밋되지 않았다는 상태 확인 완료


새 파일 추가하고 status 확인 했더니 work2, 3은 untracked files로 뜸.


git add 로 work1, work2를 commit 대기 상태로 올림.
얘네만 버전으로 올리겠다는 뜻이다.


git commit -m "message"
work1.txt 와 work2.txt 파일을 v2로 commit해줌


이제 work3 파일을 commit 대기 상태로 add해주고 v3로 커밋했다


git log --oneline
로그를 통해 버전을 볼 수 있다

git의 특성!! commit ID를 파일 내용을 통해 생성한다(SHA1)

master는 마지막으로 만든 버전을 가리킴 그래서 새로 만든 version의 이전 version이 무엇인지 찾아낸다

master는 last commit, HEAD는 working dir의 current commit

Checkout & reset


checkout을 통해 HEAD를 v2로 옮겨왔다

새 버전 v2를 만들고, 이전 버전 v1로 가고싶으면
git checkout "v1 commit ID" 로 v1버전으로 이동한다.
이 때 Head는 working dir의 current commit을 가리키므로 v1를 가리킨다. master는 여전히 v2를 가리키고 있다.
이처럼 HEAD가 master를 가리키지 않는 상태를 dettached master 라고 한다.(가리키고 있다면 attached)
여기서 Head를 다시 최신버전으로 이동하고싶으면
git checkout master 를 실행하여 Head가 master를 가리키도록 한다.

chectout은 HEAD를 바꾼다

reset은 master를 바꾼다

Git의 불변성

Git은 어떤 버전도 삭제하지 않는다.
checkout, reset을 사용하여 HEAD, master 중 어느 것도 이후버전을 가리키지 않는다면 삭제된 것 처럼 보이지만,
git reset 이후버전의 commit ID 하면 master가 다시 이후 버전을 가리키므로 복원 가능하다!!

그럼 log에서 사라진 commit ID는 어떻게 알지?
메모해두거나..
git reflog를 통해 내가 했던 모든 동작의 로그를 볼 수 있다.

Add 취소

git rm --chaced <file>

Commit 한번에 하기

commit 할 때 마다 git add 파일이름 을 실행하지 않고
git commit -a 명령어를 사용하면 수정사항이 있는 file을 전부 commit 해준다.

하지만, pwd를 담은 config file과 같은 정보는 절대 commit되면 안되므로 적어도 한번 명시적으로 add하여 tracked된 파일만 -a 옵션을 쓸 수 있다.

git add . 하면 현재 디렉토리와 그 아래 파일 전부 add
git add commit -a 하면 한번이라도 add된 파일이라면, 전부 commit

위 과정이 귀찮다~ 하면
.gitignore file을 만들어서 git에 올리고싶지 않은 파일 list를 작성한다.
무시할 파일에 대한 정책 파일이라고 생각하면 된다.

따라서 협업 시에 .gitignore file을 함께 commit하면 다른 사람들도 정책을 따르게 됨(이 파일도 add하고 commit해줘야한다)

실험적인 코드를 실행해보고 싶다면?

결과적으로, 내가 개발중인 환경에서 실험을 한번 해보고 실패하면 버리고싶다! 그러면 어떻게 해야할까?

먼저 Head를 master dettached 상태로 만들어준다.
git checkout <최신버전의 commit ID>

Head와 master를 분리하고 나서,
새 파일을 add->commit해주면 HEAD가 내 실험버전을 가리키고있다.
근데 실험에 실패해서 이전 버전으로 돌아가고싶다...

그러면 git checkout master로 master, 즉 master로 설정해놨던 이전버전의 commit상태를 HEAD가 가리키게 된다.

따라서 이전버전으로 돌아갈 수 있다.

Branch 만들기

HEAD를 dattached 상태로 만들어주고 브랜치를 추가했다


git branch <branch name>


짜잔 master와 같은 exp브랜치가 하나 만들어졌다


HEAD가 exp branch를 가리키도록 해줬다

다시 master로 돌아가고 싶으면 git checkout master
이제 Commit ID가 아니라 이름으로 버전을 옮길 수 있다!!


HEAD와 Master를 분리 안하고 branch를 생성하면 이렇게 된다.


Head가 새로 만든 branch를 가리키게 하기
이렇게 해야 commit시 branch에 commit된다. 안그럼 master따라간다


헐. git log에 --graph 옵션을 추가해줬더니
직관적으로 branch의 상태를 볼 수 있다. 짱신기함

Git 명령어 정의하기

로그 확인할 때 마다 긴 명령어 치는거 지쳤다..
명령어에 별명 정하고 써보자

git config --global alias.l "log --oneline --all --graph"

위와같이 정했다면

git l 하면 로그 명령어 실행해준다


아주 편리하고 좋다!!!

병합하기

master 와 exp branch를 병합하고싶다면?

git merge

병합을 취소하고싶다면

0개의 댓글