[git] 자주쓰는 깃 명령
2024년 4월 5일
windows invalid path #
깃 레포의 파일명 중 윈도우에서 사용할 수 없는 문자(? 등)로 인해 invalid path 에러가 발생하는 경우
1git config --global core.protectNTFS false
특정 태그로 체크아웃 하는 방법 #
1git tag
2git checkout tags/<tag_name>
커밋 위치로 이동 #
git checkout이 만능 기능이지만, 이동은 switch로 변경됐다.
1git log # 이동할 커밋위치 확인 (커밋해시 5자리 정도만 긁어와도됨)
2git switch --detach <commit_hash> # 사실 checkout 하면 되긴함
3
4git switch - # 볼일 다 봤으면 이전 커밋 위치로 돌아오기
태그, 브랜치 삭제 #
1git tag -d <tag_name>
2git branch -d <branch_name> # 로컬브랜치 삭제
원격 트래킹 브랜치 가지치기 #
원격에서 pull하면 원격의 브랜치가 local에 origin/<branch> 형태로 캐시되는데, 이게 남아있으면 git branch -d 로 지울수가 없음
그러니까 local - origin(remote의 mirror) - remote 상태임
1git branch -r
2git branch -vv # 어떤 origin 과 연결되어 있는지 확인. gone 상태라면 삭제된것
원격에서 지워진 origin 브랜치를 지우고싶을때 prune
1git remote prune origin
2# 이후 gone 상태인(로컬에만 있는) 것들을 git branch -d 로 삭제
커밋 여러개 합치기 #
1git rebase -i HEAD~3
2,3 번째 커밋들을 pick -> s 로 변경 후 저장하고나면 메시지를 수정할 수 있다.
이후 강제 푸시
HEAD^ == HEAD~1
중간 커밋 합치기 #
맨위에서부터 합치는게 아니라 중간부터 합치고 싶을 수 있다.
1git rebase -i <합칠 최초 커밋의 바로 직전 커밋>
마찬가지로 합치기 base 커밋을 pick으로 둔 상태에서 합칠 커밋들을 s(squash)로 변경한다.
메시지 수정 후 확인해보면 합쳐져 있다.
소스트리 강제 푸시 #
서브모듈이 있는 경우 서브모듈에 대해서도 ssh 키를 사용해야돼서 agent를 사용하면 된다.
소스트리에서 터미널을 열고 아래 작업을 수행하면 된다.
- 이때 .ssh/id_rsa.pub 키는 등록하는 ssh 키의 pub 키여야 한다.
1eval "$(ssh-agent -s)"
2ssh-add ~/.ssh/bitbucket
3git push -f
직전 커밋 작성자 변경 #
1git commit --amend --author="peter_kim_ <peter.kim@inka.co.kr>" --no-edit
커밋 검색 #
특정 커밋이 어떤 태그나 브랜치에 포함되어 있는지 확인 #
1git tag --contains 39952bb
2git branch -a --contains 5dec6c | grep bluejay
커밋 메시지에서 문자열 찾기 #
1# bug라는 문자열이 대소문자 상관없이(-i) 포함된 메시지 갯수만 출력
2# android15-release에서 android15-qpr2-release 사이의 커밋만 검색
3git log android15-release..android15-qpr2-release --grep=bug -i --pretty=format:%h | wc -l
4
5# 메시지 전체도 출력
6# 특정 파일 속 커밋만 출력
7git log android15-release..android15-qpr2-release --grep=bug -i .\services\core\java\com\android\server\pm\
커밋간 diff #
1git diff 7cdd118f3..2c94851d -- C:\Users\gmds\Documents\GitHub\base\services\core\java\com\android\server\pm\PackageManagerServiceUtils.java
리베이스, 충돌 머지 #
feature/~~~ 브랜치의 베이스를 develop 으로 설정하는 작업
1git checkout feature/~~~~~~~
2git stash // 리베이스할 내용이라면 커밋해두고, 리베이스에서 제외하려면 stash
3git rebase develop
4// 충돌난 파일 처리
5git status // 충돌난 파일 확인 가능
6git add <충돌파일>
7git rebase --continue
특정 파일만 stash #
1# 변경된 파일 목록 확인
2git status
3
4# 예를 들어 file1.txt, file2.txt가 변경되었고 file1.txt만 스태시하려는 경우:
5git add .
6git reset file1.txt # file1.txt는 스테이징에서 제외
7
8# 스테이지된 파일들만 스태시
9git stash --keep-index
10
11# 스테이지된 변경 사항 언스테이지
12git reset
git 서브모듈 관련 #
1# 추가
2git submodule add <서브모듈-저장소-URL> <경로>
3git submodule update --init --recursive
4git submodule status
5
6# 서브모듈 업데이트
7git submodule update --remote
8
9# 삭제
10# 1. .gitmodules 에서 서브모듈 정보 삭제
11# 2. .git/config 에서 서브모듈 섹션 삭제
12rm -rf <서브모듈-경로>
13git rm --cached <서브모듈-경로>