git cli!
git
익숙하지 않은 git 명령어만 정리
commit –amend
마지막 commit 에 변경된 파일추가 및 commit 수정하기
해당 명령또한 마찬가지로 force push 를 통해 이미 remote 에 commit 을 변경할 수 있음으로 신중히 사용해야한다.
기존 커밋에 수정된 파일을 밀어넣고 메세지를 수정할 수 있다.
1 | touch test-for-amend.txt |
commit –soft
마지막 커밋을 취소하고 변경된 파일을 다시 stage 로 돌리고 싶을때 사용.
local commit 만 사용하길 권장.
1 | git reset --soft 97b88eb |
rm –cached 원격 저장소 파일 삭제
1 | git rm --cached .idea/modules.xml |
branch, switch
1 | # dev 브런치 생성 |
switch 는 브랜치의 전환만을 위한 명령어.
1 | git switch dev |
checkout 은 branch 이외에도 사용되는 경우가 많아 branch 전환을 위해서는
switch사용을 권장
checkout
checkout 이란 전환 이란 표현이 적용 가능한 모든 아이템에 적용 가능하다.
- branch 전환
- commit 전환
- 특정파일/디렉토리의 전환
- a 파일/디렉토리를 A브런지로부터 전환, 없다면 가져오고, 있다면 전환
1 | # local dev 브런치로 전황 |
reset
잘못 올린 커밋 원격 리포지토리에서도 취소하기
1 | git reset --hard "commit id" |
1 | git reset --hard origin/master |
reflog
실수로 reset 한거 되돌리기
1 | # 과거 commit 으로 강제 이동 및 push |
local 에서만 관리하는 깃에대한 모든 참조변경기록 를 보관하고 있기 떄문에 이전 상태로 돌아갈 수 있음.
merge, rebase
https://gist.github.com/mitchellh/319019b1b8aac9110fcfb1862e0c97fb
모든작업이 main branch 로부터 충돌없이 업데이트된다면 문제는 발생하지 않는다.
하지만 branch 를 나누어 작업하다 보면 충돌은 생기게되고 이를 해결하고 병합하는 과정에서 merge commit 은 반드시 생기게된다.
merge 는 직관적이지만 추가적으로 commit 이 하나 더 생기게 된다.
main 과 dev branch 에 각각 dev.txt 을 생성후 각 브런치에서 수정 후 commit,
그리고 main branch 에서 dev branch 를 병합하면 아래와 같은 형태로 history 가 구성된다.
1 | o---o---o---o---M main branch |
rebase 의 경우 아래처럼 branch 를 한줄로 관리할 수 있게 한다.
물론 합치는 과정에서 충돌은 발생하게 되며 충돌을 수정하는 과정에서 dev branch 의 커밋들은 변경된다.
1 | 원본 상태: |
dev 브런치에선 해당 과정때문에 기존 commit 들이 변경된 뒤 다시 등록될 수 있다,
이럴경우 force push 를 해야하는데 해당 branch 를 사용하는 다른 사용자들의 혼란을 야기할 수 있다.
항상 최신으로 유지되는 main 혹은 자신만 사용하는 branch 에서 사용하는것을 권장한다.
squash 로 commit 기록 통합
아래와 같이 Update 1, Update 2, Update 3 3 개의 커밋을 만들었을 때 rebase 를 통해 합칠 수 있다.
1 | git log --pretty=oneline |
head 에서 총 3개의 commit 을 합치기
1 | git rebase -i HEAD~2 |
위 명령을 실행하면 아래와 같이 3개의 commit 에 대한 처리를 진행하는 vi 입력창이 출력된다.
1 | pick 50a1164 update 1 |
아래와 같이 맨 위 commit 을 합치는 기준(pick)으로 두고 squash 진행
1 | pick 50a1164 update 1 |
해당 명령또한 마찬가지로 force push 를 통해 이미 remote 에 commit 을 변경할 수 있음으로 신중히 사용해야한다.
remote
새로운 remote git 주소를 추가해서 branch 가 추가된것처럼 사용할 수 있다.
1 | git remote add demo https://gitlab.my.company.com/demo-repo |
upstream
fork 한 프로젝트의 코드를 다른 위치에 원본 있는 프로젝트로부터 동기화해야 할 때 사용하는 명령어
1 | git remote add upstream https://github.com/Kouzie/test-repo |
submodule
저장소 안에 또 다른 깃 저장소가 필요한 경우 사용.
하나의 Git 저장소 내에서 다른 Git 저장소를 서브디렉토리로 포함시키는 방법.
각 서브모듈은 독립된 Git 저장소로 관리되며, 상위 프로젝트와 별개로 버전 관리된다.
아래와 같이 3개의 repository 가 있을 때
1 | git clone https://gitlab.my.company.com/test-group/root-module |
root-module repository 에 sub-module repository 2개 를 submodule 로 삽입한다.
1 | cd root-module |

각 디렉토리에는 별도의 .git 파일이 존재하고 commit 버전을 기준으로 연결시키기 때문에 별도의 pull 처리를 해줘야 버전을 따라갈 수 있다.
또한 root repository 에서 어떤 commit 버전을 사용할지도 결정해줘야 한다.
처음 서브모듈이 있는 git repository 를 git clone 하였을 때 서브모듈이 모두 비어있는 상태이다.
아래 init, update 명령을 통해 초기화 해야 한다.
1 | git submodule init # 서브모듈 초기화 |
subtree
subtree는 하나의 Git 저장소 내에서 다른 Git 저장소의 내용을 특정 디렉토리로 병합하는 방법.
서브트리는 상위 프로젝트의 일부로 취급되며, 하나의 통합된 Git 기록을 가진다.
1 | git clone https://gitlab.my.company.com/test-group/root-tree |
subtree 는 기존 git 의 history 를 보존하면서 두 repository 를 합칠 수 있다.
1 | git log |
subtree 에서 변경된 내용을 pull 해올 수 있고
root 에서 subtress 의 내용을 변경하고 push 할 수 있다.
1 | git subtree pull --prefix=sub-tree-a https://gitlab.my.company.com/test-group/sub-tree-a main |
1 | git add . |
추가 옵션
subtree로 사용할 원격 저장소 추가
1 | # git remote add <원격 저장소의 이름> <원격 저장소의 주소> |
새로운 원격 저장소의 브랜치를 서브트리로 추가
1 | # git subtree add --prefix <클론할 폴더> <원격 저장소의 이름> <브랜치 이름> |
worktree
브런치를 이동 & stash 처리를 수행하며 작업하기 불편할 때 사용
쉽게 여러개의 branch 에 접근해서 작업을 수행가능.
1 | # 기존의 test-branch 를 가져와 원하는 위치에 worktree 생성 |
worktree 로 생성한 프로젝트 디렉토리 내부에는 .git 디렉토리 대신 원본위치를 가리키는 .git 파일이 저장되어있다.
1 | cd ../test-branch-path |