[git] 자주쓰는 깃 명령

windows invalid path

깃 레포의 파일명 중 윈도우에서 사용할 수 없는 문자(? 등)로 인해 invalid path 에러가 발생하는 경우

git config --global core.protectNTFS false

특정 태그로 체크아웃 하는 방법

git tag   
git checkout tags/<tag_name>

커밋 위치로 이동

git checkout이 만능 기능이지만, 이동은 switch로 변경됐다.

git log    # 이동할 커밋위치 확인 (커밋해시 5자리 정도만 긁어와도됨)
git switch --detach <commit_hash>   # 사실 checkout 하면 되긴함

git switch -     # 볼일 다 봤으면 이전 커밋 위치로 돌아오기

태그, 브랜치 삭제

git tag -d <tag_name>
git branch -d <branch_name>     # 로컬브랜치 삭제

원격 트래킹 브랜치 가지치기

원격에서 pull하면 원격의 브랜치가 local에 origin/<branch> 형태로 캐시되는데, 이게 남아있으면 git branch -d 로 지울수가 없음

그러니까 local - origin(remote의 mirror) - remote 상태임

git branch -r 
git branch -vv    # 어떤 origin 과 연결되어 있는지 확인. gone 상태라면 삭제된것 

원격에서 지워진 origin 브랜치를 지우고싶을때 prune

git remote prune origin
# 이후 gone 상태인(로컬에만 있는) 것들을 git branch -d 로 삭제

3eed472e-b30d-4ebe-9513-eb7555a3e5a6
3eed472e-b30d-4ebe-9513-eb7555a3e5a6

커밋 여러개 합치기

git rebase -i HEAD~3

2,3 번째 커밋들을 pick -> s 로 변경 후 저장하고나면 메시지를 수정할 수 있다.

26b8a1a2-d3f2-4240-b43a-03939bab2c58
26b8a1a2-d3f2-4240-b43a-03939bab2c58

이후 강제 푸시
HEAD^ == HEAD~1

중간 커밋 합치기

맨위에서부터 합치는게 아니라 중간부터 합치고 싶을 수 있다.

f89bd9bd-955c-45ce-bb62-4994fdaa8257
f89bd9bd-955c-45ce-bb62-4994fdaa8257

git rebase -i <합칠 최초 커밋의 바로 직전 커밋>

마찬가지로 합치기 base 커밋을 pick으로 둔 상태에서 합칠 커밋들을 s(squash)로 변경한다.

fd50321a-b4be-4d8a-bba0-96a2ecf3931a
fd50321a-b4be-4d8a-bba0-96a2ecf3931a

메시지 수정 후 확인해보면 합쳐져 있다.

c70cac13-fcc0-4737-ae96-9f33fc0ca66c
c70cac13-fcc0-4737-ae96-9f33fc0ca66c

소스트리 강제 푸시

서브모듈이 있는 경우 서브모듈에 대해서도 ssh 키를 사용해야돼서 agent를 사용하면 된다.
소스트리에서 터미널을 열고 아래 작업을 수행하면 된다.

  • 이때 .ssh/id_rsa.pub 키는 등록하는 ssh 키의 pub 키여야 한다.
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/bitbucket
git push -f

직전 커밋 작성자 변경

git commit --amend --author="peter_kim_ <peter.kim@inka.co.kr>" --no-edit

커밋 검색

특정 커밋이 어떤 태그나 브랜치에 포함되어 있는지 확인

git tag --contains 39952bb
git branch -a --contains 5dec6c | grep bluejay

커밋 메시지에서 문자열 찾기

# bug라는 문자열이 대소문자 상관없이(-i) 포함된 메시지 갯수만 출력
# android15-release에서 android15-qpr2-release 사이의 커밋만 검색
git log android15-release..android15-qpr2-release --grep=bug -i --pretty=format:%h | wc -l

# 메시지 전체도 출력
# 특정 파일 속 커밋만 출력
git log android15-release..android15-qpr2-release --grep=bug -i .\services\core\java\com\android\server\pm\

커밋간 diff

git diff 7cdd118f3..2c94851d -- C:\Users\gmds\Documents\GitHub\base\services\core\java\com\android\server\pm\PackageManagerServiceUtils.java

리베이스, 충돌 머지

feature/~~~ 브랜치의 베이스를 develop 으로 설정하는 작업

git checkout feature/~~~~~~~
git stash      // 리베이스할 내용이라면 커밋해두고, 리베이스에서 제외하려면 stash 
git rebase develop
// 충돌난 파일 처리
git status       // 충돌난 파일 확인 가능
git add <충돌파일>
git rebase --continue

특정 파일만 stash

# 변경된 파일 목록 확인
git status

# 예를 들어 file1.txt, file2.txt가 변경되었고 file1.txt만 스태시하려는 경우:
git add .
git reset file1.txt  # file1.txt는 스테이징에서 제외

# 스테이지된 파일들만 스태시
git stash --keep-index

# 스테이지된 변경 사항 언스테이지
git reset

git 서브모듈 관련

# 추가
git submodule add <서브모듈-저장소-URL> <경로>
git submodule update --init --recursive
git submodule status

# 서브모듈 업데이트
git submodule update --remote

# 삭제
# 1. .gitmodules 에서 서브모듈 정보 삭제
# 2. .git/config 에서 서브모듈 섹션 삭제
rm -rf <서브모듈-경로>
git rm --cached <서브모듈-경로>

Comments

ESC
Type to search...