설정
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 커밋을 생성