서론
"내가 git을 잘 이용하고 있는 걸까?" 에 대해서 알아보기 위해서 간단하게 git 사용하기, 개인프로젝트에서 사용하기, 협업시 사용하기 등으로 나눠서 사용법을 실습하면서 복기해보는 시간을 가지도록 해보겠습니다.
간단한 실습 1 - 로컬에서의 init, add, commit
ex01이라는 폴더를 생성해줍니다.
이 폴더를 작업영역으로 사용해서 git에 파일을 올리거나 내리도록 사용하겠습니다.
git init
이 폴더를 git으로 작업을 하고 싶으니, 해당 폴더의 경로에서 "git init" 이라는 명령어를 작성해줍니다.
이 명령어를 작성하면 해당 폴더에 .git이라는 숨김폴더가 생성됩니다.
이후 해당 폴더에 test1.txt라는 텍스트파일을 생성해줍니다.
git status라는 명령어로 현재 관리중인 폴더의 변동사항을 추적해낼 수 있습니다.
하단에 보니 Untracked files안에 test1.txt라는 파일이 있는 것을 볼 수 있습니다.
제가 방금 test1.txt라는 파일을 관리중인 ex01폴더에 만들었고, 해당 파일은 등록이 되지않아서 추적,관리를 할 수 없다는 뜻입니다. 그러므로 "git add <file>" 명령어를 통해서 포함시켜주라고 경고를 해줍니다.
git add .
git status
git add <파일이름> 을 통해서 파일을 하나하나 추가해주어도 되지만, .(점)을 이용해서 변경된 파일을 모두 추가해주도록 합니다. 다시 "git status"로 상태를 확인해보면, 변경사항이 추가되었으며 초록색으로 글자의 색이 바뀜 것을 볼 수 있습니다.
git commit -m "메세지"
지금 상태, add를 한 상태는 "이런 변경사항이 있었다~" 라는 느낌인 것이고, 이 상태를 사진을 찍듯이 저장하고 싶으면 커밋(commit)을 해야합니다. -m 옵션과 함께 메세지의 내용을 적어서 커밋을 날려줍니다.
git config --global user.name "John Doe"
git config --global user.email "John@naver.com"
만약 커밋을 하는데 에러가 난다면, git자체를 처음 사용하는 상태여서 그럴 수 있습니다.
위처럼 현재 git을 사용하는 사람, 이메일을 위처럼 등록해줘야합니다.
git config --list
이름이 등록이 잘되었는지는 config에 list옵션을 통해서 확인할 수 있습니다.
저같은 경우에는 이전에 등록을 해놓아서, name,email이 있는 상태입니다.
이제 커밋을 날려줍니다.
이렇게 되면, 해당 변경사항이 있는 기록이 사진처럼 남게되고, 해당 기록에 대해 해시화된 번호가 남게됩니다. 이 번호는 주소라고 보면 됩니다. 커밋을 하는 순간 head라는 곳에 이 주소가 들어가게 됩니다. "HEAD"는 현재 작업 중인 브랜치의 가장 최근 커밋을 가리키는 포인터입니다.
head는 .git/refs/heads/main 에서 확인할 수 있습니다.
이 번호가 가장 최근에 일어났던 커밋의 해시번호입니다.
혹은 이렇게 git log를 통해 커밋이 일어난 로그에서 확인할 수 있습니다.
그러면 새로운 파일이 추가되면 어떻게 될까?
1. 처음에 git init으로 관리되는 ex01이라는 폴더에 test1.txt가 추가됩니다.
2. 이후 git add를 통해 해당파일이 인덱스로 가서 트리가 생성됩니다. 해당 작업의 해시값은 'd5f219..'라는 값을 가집니다.
3. git commit을 통해 head에 추가되고 master브렌치에 추가됩니다.
이번에는 test2라는 파일을 추가해봅니다.
1. ex01이라는 폴더에 test2.txt를 추가합니다.
2. git add를 통해서 인덱스로 가서 트리를 생성합니다. 이 트리는 이전에 변경된 작업인 {test1.txt을 추가하는 작업}을 해시값 'd5f219...'를 가져와서 참조합니다. 이 방법은 실제파일이 아닌 해시값으로 참조하므로 용량을 적게 차지합니다. 새로운 트리를 구성하고 'd7686...'이라는 해시값을 가지게됩니다.
3. git commit을 하면 head에는 가장 최근 커밋인 test2.txt를 추가하는 작업 'd7686..'로 교체가되고, 브렌치에 새로운 커밋이 추가됩니다.
파일이 중간에 수정되면 어떻게 될까?
그럼 이전과정과 같이 변경된 test1에 대해서 트리가 생성됩니다..
여기에 물려져 있는 트리는 test2.txt를 추가한 이전까지의 변경사항들이 담겨진 'd7686...'트리가 참조되어 있을 것입니다. 이런식으로 변경된 부분만 계속 가져가면서 관리가 됩니다. index는 전체적인 과정인 history를 들고 있습니다.
간단한 실습2 - reset 명령어
위처럼 ex03이라는 폴더에 git init을 하고, test1.txt를 더하고 커밋, 그리고 test2.txt를 더하고 커밋을 했습니다. 커밋을 하면 git log에 남는데, 만약 이 내용이 맘에 안들어서 두번째 커밋을 예를들어 "2. test2.txt 업데이트"로 변경을 하고싶을 수 있습니다. 한마디로 이전의 어느 시점으로 복구하고 싶다는 것입니다.
이럴 때 git reset 명령어를 사용할 수 있습니다.
git reset에는 hard, mixed, soft 라는 3가지 옵션이 있습니다.
hard
git reset --hard {이전 과정의 해시값}
hard 옵션은 위와같이 모든 커밋, 과정, 파일을 삭제합니다. 완전히 test1의 상태로 복구를 한다고 볼 수 있습니다.
mixed
git reset --mixed {이전 과정의 해시값}
mixed 옵션은 위와같이 모든 커밋, 과정을 삭제합니다. 파일은 존재하지만, 작업 영역에만 있는 상태, 즉 add하지 않은 상태를 말합니다.
soft
git reset --soft {이전 과정의 해시값}
soft 옵션은 위와같이 모든 커밋만을 삭제합니다. 한마디로 head가 첫번째 커밋으로 이동한다는 뜻입니다. 위에서는 test2를 추가한 "d7686.."이 head에 있어야하지만, test1.txt를 추가한 "d5f219..."로 가게됩니다. 한마디로 파일은 존재하고, add도 되어있지만 커밋만 되지않는 상태입니다.
이를 통해 옵션들의 역할을 정리해볼 수 있습니다.
- hard : 이전 상태로 복구하고 싶을 때 사용합니다.
- mixed : 작업 영역 내용의 변경이 필요할 때 사용합니다. (add전 상태로 하기위함)
- soft : 커밋의 log을 바꿀 때 사용합니다.
위와같이 이전 해시값을 가지고 reset --sorft를 사용해보았습니다. 해시값의 경우 다 치지않아도 알아서 찾아줍니다. 다시 git log를 쳐보면 위와같이 첫번째 커밋만 존재하고, 두번째 커밋은 사라져있습니다.
'협업을 위한 공부 > Git' 카테고리의 다른 글
Git - 3. 소규모 협업 프로젝트를 위한 Git 사용법 (1) | 2024.01.20 |
---|---|
Git - 2. 개인 프로젝트를 위한 Git 사용법 (0) | 2024.01.16 |