Git·GitHub·Gitea

Git 명령어 총 정리 (4)

무무11 2024. 12. 13. 23:05

지난 글에 이어 Git 명령어를 정리해보았다.

 

git checkout

체크아웃은 브랜치를 전환하거나 헤드(HEAD)를 이동할 때 사용하는 명령어이다. 현재 브랜치 전환 기능의 경우 git switch를 사용하는 것을 권장한다.

 

헤드(HEAD)란 브랜치의 가장 최신 커밋을 나타내는 포인터이다. 새로운 커밋이 작업 중인 브랜치에 추가되면 해당 커밋을 헤드가 가리키게 되고, 새로운 브랜치를 생성하면 헤드가 새로운 브랜치를 가리키게 된다. 또한 다른 브랜치로 이동하면 헤드가 이동한 브랜치의 최신 커밋을 가리키게 된다.

 

reset 명령어와 달리 checkout을 이용하면 작업 내역을 그대로 두고 파일의 상태만 과거 시점으로 이동할 수 있다.  HEAD 뒤에 붙이는 '^'이 개수만큼 뒤 단계로 이동이 가능하다. 또한 '~'와 숫자를 이용할 수도 있다. 뒤로 이동한 상태에서 다시 앞으로 한 단계 이동하려면 '-'을 붙이면 된다.

 

또 checkout은 원격 저장소의 브랜치를 다운로드 하지 않고 확인만 하고자 할 때도 사용할 수 있다.

# 헤드 한 단계 뒤로 이동하기
$ git checkout HEAD^

# 헤드 3 단계 뒤로 이동하기
$ git checkout HEAD^^^
$ git checkout HEAD~3

# 헤드 한 단계 앞으로 이동하기
$ git checkout -

# 원격 저장소의 새 브랜치 확인하기
$ git checkout origin/[브랜치 명]

 

git config

git의 여러 설정들을 변경 하고싶을때 git config 명령어를 이용할 수 있다. 그냥 사용하면 특정 저장소에 대해서만 설정이 사용되고, --global 옵션을 사용하면 사용중인 컴퓨터 내의 모든 저장소에 대한 설정이 변경된다.

 

단축키 지정같은 것도 가능하니 필요하면 찾아서 사용해보면 될 것 같다.

 

아래는 자주 쓸법한 설정들만 간단하게 정리해보았다.

# 윈도우/맥 줄바꿈 호환 문제 해결
$ git config --global core.autocrlf input

# git pull 기본값 머지로 설정하기
$ git config pull.rebase false

# git pull 기본값 리베이스러 설정하기
$ git config pull.rebase true

# 기본 브랜치 이름 main으로 변경하기
$ git config --global init.defaultBranch main

 

git stash

git stash 명령어를 이용하면 작업중인 곳의 변경 사항을 잠시 치워둘 수 있다. 작업을 하다보면 작업이 아직 끝나지 않아서 커밋을 하기는 어렵고, 급하게 다른 작업을 해야할 때가 있을 것이다. 이럴때 stash를 이용할 수 있다.

 

stash를 하려면 먼저 깃의 관리 대상이 되어야하기 때문에 add가 되어있어야 한다. 

 

아래 처럼 여러가지 명령어들이 있으니 조합해서 잘 사용하면 좋을 것이다.

 

인텔리제이 같은 IDE에는 shelve 같이 stash와 유사한 기능을 제공하는데 한 번 사용해보길 권한다.

# 변경 사항 치워두기
$ git stash

# 원하는 변경 사항만 골라서 치워두기
$ git stash -p

# 치워둔 변경 사항 목록보기
$ git stash list

# 치워둔 변경 사항 적용하기
$ git stash apply

# 스태시 목록에서 스태시 삭제하기
$ git stash drop

# 치워둔 변경 사항 적용하고 삭제하기
$ git stash pop

 

git clean

깃에서 관리하지 않는 파일들을 삭제할 때 git clean 명령어를 이용할 수 있다. 다양한 옵션을 뒤에 붙여 삭제할 수 있으니 필요하다면 찾아서 사용하면 될 것 같다.

# 깃에서 추적하지 않는 파일 삭제하기
$ git clean

 

 

git reflog

git reset --hard 같은 명령어를 사용하면 커밋이 작업 내역에서 완전히 삭제된다. 하지만 이 작업 역시 HEAD만 옮기는 것이기 때문에 복구가 불가능하지 않다. git log 명령어를 이용하면 커밋 내역이 나오지 않는다. 하지만 git reflog 명령어를 이용하면 모든 깃 작업 내역을 볼 수 있다. git reset --hard 작업 이전의 해시값을 복사해서 다시 reset을 수행하면 삭제한 커밋을 되돌리는 것이 가능하다.

# 깃 모든 작업 내역 확인하기
$ git reflog

 

 

git tag

커밋에는 별명처럼 태그를 붙일 수 있다. 보통 프로그램의 버전 정보를 태그로 달아 놓는다.

 

git tag 메시지를 이용하여 태그를 달고, 확인하고, 삭제할 수 있다.

 

# 마지막 커밋에 태그 달기
$ git tag [태그]

# 태그 확인하기
$ git tag

# 태그 메시지 입력하여 태그 달기
$ git tag [태그] -m '[태그 메시지]'

# 태그 삭제하기
$ git tag -d [태그]

# 특정 커밋에 태그 메시지 포함하여 태그 달기
$ git tag [태그] [커밋 해시값] -m '[태그 메시지]'

# 로컬의 모든 태그 한 번에 원격 저장소에 올리기
$ git push --tags

 

git cherry-pick

다른 브랜치 전체를 병합하는 것이 아니라 다른 브랜치의 특정 커밋 하나만 가져오고 싶을 때 사용할 수 있는 기능이 체리픽이다.

# 다른 브랜치의 특정 커밋만 가져오기
$ git cherry-pick [커밋 해시값]

git cherry-pick (커밋 해시값) : 다른 브랜치의 커밋 가져오기

 

 

마지막 커밋 수정하기 (amend)

마지막으로 남긴 커밋을 수정할 때 간단하게 사용할 수 있는 명령어이다. 단순히 마지막 커밋 명을 수정할 때 사용할 수도 있고, 변경 사항을 추가할 수도 있다.

# 마지막 커밋 수정하기
$ git commit --amend

# 커밋 메시지 바로 입력하여 마지막 커밋 수정하기
$ git commit --amend -m '[변경할 커밋 메시지]'

 

변경 사항 확인하면서 헝크 단위로 스테이징하기

그냥 git add를 사용하면 한 파일의 모든 변경사항이 한 번에 스테이징 된다. 그런데 모든 변경사항이 아니라 일부 변경사항만 스테이징하여 커밋하고 싶을 때도 있을 것이다. 이때 'git add -p' 명령어를 이용할 수 있다.

 

헝크란 하나의 파일에서 수정된 코드 블록의 일부로 하나의 코드 덩어리라고 할 수 있다. 'git add -p' 명령어를 이용하면 헝크별로 변경 사항이 나타나고 y/n 중 하나를 입력해 해당 헝크를 스테이징할지 말지 선택할 수 있다. 헝크가 너무 큰 덩어리일때는 s를 누르면 더 작은 단위의 헝크로 나눌 수도 있다.

 

직접 사용해보는 것이 이해가 더 쉬울 것이다.

# 헝크별로 스테이징하기
$ git add -p

 

다른 브랜치의 작업 내역을 하나의 커밋으로 묶어서 가져오기

다른 브랜치의 작업 내역을 병합할때 모든 커밋을 다 남기지 않고 해당 커밋들을 하나의 커밋에 모두 합쳐서 추가할 수 있다. 이것을 스쿼시 머지(squash merge)라고 한다.

 

보통 CLI에서 이 명령어를 직접 칠 일은 거의 없고, GitHub 같은 곳에서 PR을 머지할 때 어떤 방식으로 머지할지 옵션을 선택할 수 있는데 이때 squash를 선택할 수 있다.

 

히스토리가 깔끔하게 남지만 변경 사항이 모두 보존되지 않는다는 문제도 있기 때문에 잘 사용해야 한다.

# 대상 브랜치의 모든 커밋을 하나로 묶어 병합
$ git merge --squash [대상 브랜치]

 

 

 

여기까지 git에 대해 학습했던 내용들 대부분을 정리해보았다. 이 정도만 알아도 git을 사용하면서 문제가 생겨도 대부분 쉽게 해결할 수 있었다. 꼭 한 번쯤은 정리가 필요하다고 생각했는데 이렇게 정리하면서 다시 복습도 되고 헷갈렸던 부분도 잘 정리가 되어 기쁘다.