본문 바로가기
Git

깃 명령어로 알아보는 깃 메커니즘

by 파피요트 2023. 3. 15.

설정

git config --global core.editor "code --wait" : 텍스트 편집을 vim대신에 vsc에서 할 수 있게 함

 

repo 생성 (repo == 체크포인트(커밋) 덩어리 )

git init : repo 새로 만들기(git status 명령어로 현재 폴더 또는 상위 폴더 중 일부가 깃 저장소가 아님을 확인하고 생성) 

git clone <url> : repo 불러오기 (remote가 자동으로 설정됨)

 

업데이트

staging area

git add . : staging area 업데이트

 

local repo

git commit -m "~" : repo에 커밋 추가

git commit -am "~" : git add . 를 포함한 옵션

git fetch <remote> <remote-branch> : remote-branch에 추가된 커밋들 가져와서 origin/remote-branch에 추가. (동기화)

git fetch origin master : origin/master 브랜치 동기화

         내 master 브랜치는 그대로인 상태에서

         git checkout origin/master로 동료가 무엇을 추가했는지 확인할 수 있다.

git fetch : 모든 origin브랜치들 동기화

 

workspace , local repo

git pull <remote> <remote-branch> : origin/remote-branch 동기화, local-branch와 병합 

git pull origin master : remote master브랜치의 커밋들을 가져오고 , 병합

 

remote repo (push 전에 pull 해서 병합하자) 

git push <remote> <branch> : remote에 로컬 branch를 푸쉬 (디폴트로는 같은 이름의 remote브랜치에 푸쉬함)(없다면 생성)

git push <remote> <local-branch>:<remote-branch> : 뒤에 remote브랜치 이름을 붙이면 이 브랜치에 푸쉬함

git push -u ~ : 푸쉬하고 upstream설정 , 이후에는 설정한 local-branch위치에서 git push만으로 설정한 upstream에 푸쉬

 

remote 설정 ( remote == 목적지 url ) 

git remote -v : remote 확인

git remote add <remote> <url> : git remote 설정

         git remote add origin url (origin 이라는 이름의 remote를 명시한 url로 설정)

git remote set-url <remote> <newurl> : 새로운 url로 origin 변경

git remote rename <oldname> <newname> : remote 이름 변경

git remote remove <remote> : 특정 remote 제거

 

push

처음에 다음과 같이 푸쉬한다 .

git branch -M main : 현 브랜치 master의 이름을 main으로 변경

git push -u origin main : 현 로컬 브랜치 main을 푸쉬하고 , 로컬브랜치 main의 upstream을 리모트브랜치 main으로 설정

 

브랜치 관련

git branch  : 브랜치 목록을 보여줌

git branch -v : 브랜치 목록을 마지막 커밋 정보와 함께 보여줌

git branch -r : remote tracking 브랜치 보여줌 ( ex. origin/master )

git branch ~ : 브랜치 생성

git branch -d ~ : 브랜치 삭제

git branch -D ~ : 브랜치 삭제 (병합 여부에 상관 없이)

git branch -m ~ : 브랜치 이름 변경

 

병합

git switch a : a브랜치로 이동 

git merge b : a브랜치에 b브랜치 병합

 

변경 사항 확인

git diff : 스테이지 영역과 워킹 디렉토리의 차이를 보여줌

         (등록되지 않은 모든 변경 사항을 알고 싶을 때 사용)

git diff -HEAD : HEAD가 가리키는 것( 최신 커밋)과 워킹 디렉토리 간의 차이를 보여줌

         (마지막 커밋 이후의 변경 사항을 알고 싶을 때 사용)

 

 

 

스태쉬 관련

git stash : HEAD로 복원, 변경 사항들 저장

         변경 사항(워킹 디렉토리 or Staging area)들은 The Stash에 저장

         (커밋을 하지 않은 상태로 다른 브랜치로 이동하고 싶을 때 사용)

git stash pop : 변경 사항들 복원, 저장된 변경 사항 삭제

git stash apply : 변경 사항들 복원 ( 스태시 영역에 변경 사항들 남겨둠)

         (여러 브랜치에 적용하고 싶을 때 사용)

git stash list : 스태시 목록 확인

git stash drop stash@{2} : 스태시에 있는 특정 목록 삭제.

git stash clear : 스태시 비우기

 

이동

git switch <local-branch>: 브랜치 이동

git switch -c <newbranch> : 브랜치 생성, 이동

git switch -c <newbranch> 515c633a : 특정 커밋에서 브랜치 생성,이동

git switch <remote-branch> : 동일한 이름의 로컬 브랜치 생성, 이동, 생성된 로컬 브랜치가 <remote>/<remote-branch>추적

git checkout 486f994 : HEAD를 특정 커밋으로 이동 (hash를 인덱스로 사용)

         위 명령어들의 사용예시는 다음과 같다. 

         우선 git log --oneline 을 입력했을 때 나오는 해시값과 브랜치가 다음과 같다고 가정했다.

                  5 master HEAD (일반적으로 HEAD는 커밋이 아닌 브랜치를 참조)

                  4

                  3

                  2

                  1

         사용예시 1 ) 과거로 돌아가서 관찰만 하고 돌아옴

         git checkout 3

                 5 master

                 4

                 3 HEAD (detached HEAD 상태)

                 2

                 1

 

         git switch master

                 5 master HEAD

                 4

                 3

                 2

                 1

 

         사용예시2) 과거로 돌아가서 새로운 미래를 만들고 돌아옴

         git checkout 3

                 5 master

                 4

                 3 HEAD (detached HEAD 상태)

                 2

                 1

 

         git switch -c newbranch

                 5 master

                 4

                 3            3 newbranch HEAD           

                 2            2

                 1            1

 

         git commit -am "~ 추가했습니다."

                5 master

                4             a newbranch HEAD  

                3             3         

                2             2

                1             1

 

         git switch master

                5 master HEAD

                4             a newbranch

                3             3

                2             2

                1             1

 

git checkout HEAD~1 : HEAD를 특정 커밋으로 이동 (HEAD를 인덱스로 사용)(ex.현 헤드에서 1개 이전 커밋을 참조)

git checkout origin/master : remote tracking branch로 이동

git switch - : 가장 최근에 있던 브랜치로 이동 (시간여행을 떠났던 곳으로 이동)

 

복원

git restore a.txt  : HEAD로 a.txt파일 복원( 커밋하지 않은 변경사항들은 사라짐)

        (파일의 변경사항을 취소하고 싶을 때 사용)

git restore --source HEAD~2 a.txt : 특정 커밋으로 복원(HEAD를 인덱스로 사용)

git restore --source 486f994 a.txt : 특정 커밋으로 복원(hash를 인덱스로 사용)

git restore --staged secrets.txt : 언스테이징 (파일의 스테이징을 취소하고 싶을 때 사용)

         사용 예시는 다음과 같다.

         git add .

         git status

                 modified: a.txt

                 modified: b.txt

                 new file: secrets.txt

         git restore --staged secrets.txt

         git status

                 modified: a.txt

                 modified: b.txt

 

커밋 취소

git reset 486f994 : 특정 커밋 이후 커밋들 삭제 (워킹 디렉토리에는 변경사항들 남아있음 )

         (새로 브랜치를 파서 워킹 디렉토리에 남아있는 변경사항들을 커밋하고 돌아오면 특정 커밋시점으로 복원 됨) 

git reset --hard 486f994 :  특정 커밋 다음 커밋들 삭제 +워킹 디렉토리 복원 ( 특정 커밋 이후의 변경사항들 날아감) 

git revert 486f994 : 특정 커밋 이후 변경사항이 제거된 새로운 커밋을 생성

         동료들과 내가 1,2,3커밋을 공유한 상황에서 내가 2,3 커밋을 삭제하면 꼬여버림.

         따라서 1,2,3커밋을 유지하고 2,3 커밋에서 생성된 변경사항이 제거된 4 커밋을 생성