git을 사용하다 보니 처음에 GUI로 적응이 되었던 사람으로써.. 가끔 어떤 원리로 git 명령어를 쓰는지 이해하지 못하고 썼을 때가 많았다. 역시 공식 문서나 해당하는 기능을 완전히 숙지하고 GUI를 사용해야겠다 라고 생각이 들어서 이 기회를 잡아 Terminal git 명령어를 정리하고 가려한다.
일단 중요 개념으로는 git 만 사용하는 것은 어떠한 원격 저장소에는 영향을 미치지 않는다.
(github 같은 저장소로 pull, push 작업을 하지 않는다면 말이다.)
크게 로컬 전용 git 명령어와 원격 장소에 올리고 다운받는 git 명령어로 나누고자 한다.
(+ https://learngitbranching.js.org/?locale=ko ) 해당 페이지를 참고하면서 학습하시면 좋습니다!
- Working Directory : 현재 작업 중인 디렉토리
- Staging Area : git이라는 버전 히스토리에 저장될 준비가 된 파일들을 옮기는 공간 (ex. 이번 버전에는 A,B파일만 올라갈꺼야.)
- local git repository : 버전의 히스토리를 가지고 있는 공간 + 각 버전은 고유한 Hash 코드 값을 가짐 (이해하기 쉽게는 해당 버전의 스냅샷을 찍어서 보관한다고 이해하면 쉬움)
1. git init
:올리고 싶은 소스코드가 있는 디렉토리(폴더)로 이동하여 해당 폴더에 .git (.이 붙으면 숨김파일이라는 뜻) 파일을 생성하여 git으로 버전 관리를 하겠다라는 명령어 입니다.
위의 경우에는 아무 일도 일어나지 않는 폴더인데
git init을 사용하니 git에 사용하고 있는 마크와 더불어 .git 파일이 생성된 것을 확인 할 수 있다.
이로써 해당 디렉토리를 로컬 git저장소라고 알려주는 명령어입니다.
2. git add .
git은 Working Directory의 변경 사항이 있는 파일들을 Staging Area로 옮기는 역할을 하는 명령어
즉, 변경 사항이 있는 파일들의 버전 관리를 위해 스냅샷을 찍기전에 Staging Area에 있는 파일들만 스냅샷을 찍기 위한 중간 단계라고 생각하면 쉽다.
여기서 add .
는 변경파일 전부를 넣겠다는 .
이기 때문에 만약 한 파일 씩 옮기고 싶다면 add {filename}
(중괄호를 제거하고) 파일명을 입력해주면 한 파일씩도 Staging Area로 올릴 수 있다.
git restore --staged {파일명}
명령어를 통해서 내릴 수 있다.
3. git commit
Staging Area에 있는 파일들의 변경 히스토리를 local .git repository로 옮기는 명령어
Staging에 올라간 변경 사항들이 하나의 버전으로 스냅샷 찍히는 과정이라고 이해하면 되겠다. 변경 히스토리를 하나의 버전으로 생성 되는 명령어다.
git commit --amend
명령어를 통해서 커밋 수정이 가능하다.
(다만 원격 서버에 push 한 경우에는 수정이 어렵다.
할 경우에는 git push -f 통해 원격 서버에 강제 통합을 시켜줘야함.)
4. git status
현재 내 git의 현황 및 상태를 보여 줄 수 있는 명령어
(변경 사항이 있는 파일 / Staging Area 올라간 파일 ...등 정보 보여주는 명령어 )
이 명령어를 통해 현재 어떤 파일이 Staging Area에 있는지 이번 Commit에서 어떠한 파일들이 버전 히스토리로 남게 되는지를 확인 할 수 있는 명령어다.
5. git log
현재 내가 사용하고 있는 git (현재 branch)에 대한 Head 위치와 히스토리를 보여준다.
이 로그를 통해 지금까지 local git Repositroy의 이력 조회와 어떠한 버전 관리가 되었는지, 추가로 해당 버전의 Hash 값 까지 알 수 있기 때문에 추후에 사용 될 git 명령어에서 찾아 보게 될 명령어다.
6. git reset
아예 이전 커밋으로 되돌리고 올렸던 커밋을 삭제 하는 형태로 돌아간다.
여기선 이전 커밋으로 돌아갔다 라는 기록 조차 남지 않고 삭제된다.
git reset 에는 옵션이 3가지가 있는데
-> git reflog
명령어를 쓰면 지금까지 사용한 git 명령어의 히스토리를 볼 수 있다.
따라서 작성된 해시 값을 활용하여 git reset --hard {해시값}
을 사용하면 reset 하기 전으로 돌아 갈수 있다.
7. git revert
기록은 남긴 채로 이전에 작성된 커밋으로 돌아갈 경우에는 해당 명령어를 사용하면 된다.
revert의 기능은 이전의 커밋으로 돌아가는 사항을 내 다음 커밋에 추가하여 처리하는 명령어다.
reset은 삭제하거나 커밋없이 현재 변경사항이 있지만 해당 커밋 위치로 이동하지만,
revert는 이전 특정 커밋으로 돌아갔다는 커밋이 찍힌채로 돌아가게 된다.
8. git branch or git switch -c
git의 주요 기능중 하나인 브랜치를 생성하는 명령어이다. 현재 Head 위치에 branch라는 새로운 흐름의 저장소를 만든다.
branch에 대한 이해는 "가지"라는 뜻으로 한 나무나 물길에서 뻗어져 나와서 작업이후에 다시 큰 물길로 합류한다고 생각하면 좋다. 따라서 특정 기능, 버전 관리 등의 목적으로 사용한다. 추가적으로 git 작업을 많은 사람이 하면 할 수록 하나의 main branch에서 작업 할 경우 수정 시마다 많은 일을 처리 해야 하기 때문에 이를 복사한 별개의 흐름로 관리하고 추후에 합치기 위함.
참고) git 업데이트로 git switch -c (create)
로 브랜치를 생성하고 체크아웃도 가능하게 되었다.
9. git merge
브랜치를 병합 하는 명령어다. 하나의 브랜치가 지점을 선택한 commit 위치로 합치는 작업을 수행한다.
브랜치 작업 이후 합쳐야 하는 경우 사용하는 명령어다. 주로 commit 하고, push하는 기능 시에 자동 병합 되는 경우도 종종 있다.
10. git rebase
협업 시에 가장 많이 / 중요하게 사용하는 명령어로 주요 기능 A,B,C를 일렬로 히스토리를 이어 합쳐주는 명령어
위의 merge 명령어와 다른 사항은 각 브랜치의 끝 지점 기준으로 합쳐서 하나의 결과물을 만드는 merge와는 다르게 순서, 순차적으로 히스토리까지 합쳐서 해당 브랜치로 합치게 만들어 주는 명령어다.
같이 2번째 흰색 커밋부터 시작했지만 feature라는 브랜치에서 main을 rebase 하면 위의 그림처럼 메인을 브랜지 이전에 이어 붙여서 하나의 feature 브랜치처럼 만들 수 있는 명령어다.
이미 올라간 커밋 푸쉬의 해시값이 변경 되어야 하기 때문에.
git push -f
(force) 명령를 통해 강제로 푸쉬 해주어야 정상적으로 반영된다.
11. git stash
커밋을 하지 않고 현재의 변경 사항을 저장하고 싶을 때 임시 저장하는 명령어다.
열심히 작업 중에 다른 브랜치로 이동하는 경우가 종종 생긴다.
그러면 이와 비슷한 문구가 생긴다.
문구와 같이 브랜치 변경 전 "변경 사항을 commit하거나, Stash 해주세요" 하고 진행 되지 않은 모습이다.
따라서 이를 해결 하기 위해서 stash의 임시 저장 공간에 저장 한 후에 git switch 작업을 해주어야 한다.
이밖에도 더 활용할수 있는 명령어나 옵션은 많지만 주로 사용하는 로컬 git 명령어에 대해서 정리 해보았다.
이렇게 생성하고 관리한 로컬 git repository를 밖에서 사용하려면 gitHub 과 같이 원격에서 관리해주는 원격 저장소에 올려야만 컴퓨터나 다른 디바이스에서도 git을 받아서 코드를 수정 할 수 있다.
1. git fetch
로컬에 서버(원격 저장소)에 있는 버전 히스토리를 가져온다. 다만, 로컬에 있는 HEAD는 그대로 두고, 서버에 있는 히스토리를 가져오기만 한다.
따라서 로컬에는 어떠한 영향도 미치지 않는다.
+) 어떤 게임이 패치 되었다~ 라고 하면 아~ 업데이트가 어떻게 되겠구나 내역을 읽는 것으로 끝난다고 생각하면 된다.
2. git pull
로컬에 서버(원격 저장소)에 있는 버전 히스토리를 가져오는것은
fetch
와 동일하다.
다만, 로컬 브랜치도 이에 맞게 업데이트하는 작업을 수행함 (git fetch + git merge)와 비슷하다.
+) 실제로 게임 패치 한다고 알려주고, 업데이트 버튼을 눌러서 시간이 오래걸리지만 그 파일을 다운로드받고, 업데이트 시켜서 버전을 변경 시키는 행위를 pull
이라고 이해하면 편하다.
3. git push
로컬의 git Repository를 서버(원격 저장소)에 올리는 작업 명령어다.
따라서 로컬의 서버의 브랜치 명이 헷갈리는 경우에는 origin/
이 붙은 브랜치는 원격 브랜치 라는 사항을 인지해야한다.
(4). pull Request
github에 있는 경우인데 권한 설정에 따라서 직접 main 이나 주요 브랜치에 합치지 못하는 경우가 있다. 그런 경우 권한이 있는 사용자에게 merge, rebase를 요청 할 수 있다.
사용 방법으로는 pull request에 어떠한 branch에서 합칠 branch를 설정 한 다음 변경 사항 기재와 함께 요청을 넣어 두면 권한 사용자가 검토하여 합치는 작업을 진행하여 원격지에 병합한다.
이상으로 터미널 / 로컬, 원격 별 git 명령어를 정리 해보았다..
그럼에도 부족한 사항이 많은 듯 싶다 ㅠㅠ
이밖에도 git을 쓰면서 오류와 마주쳤는데 일단 해결 하느라 까먹은 사항들이 많아서 아쉬웠다..
다음편에는 https / ssh 설정 하는 방법에 대해서 제대로 알고 정리 해야겠다..