cs

자주쓰는 Git 명령어들

ssoonn 2024. 12. 24. 15:20

1. Git과 Github

Git: Local Repository

로컬에서 다양한 버전 작업 및 히스토리 추적

Github: Remote Repository

협업 관리, 로컬 작업 내용들의 원격 저장

 

Git 설정이 정상적으로 된 경우 .git 디렉토리를 확인할 수 있다 → .git을 어디서부터 생성하여 시작할까?

  • Local에서 시작 Remote에 Push (git push)
  • Github Repository(Remote)에서 가져오기 Local로 Clone (git clone)

 

2. Git 주소 관리 (Remote)

git fetch -p 원격에 있는 변경사항(브랜치, 커밋 등) 가져오기

-p: remote repo에서 삭제된 브랜치를 로컬에서도 삭제하여 가져옴
git pull origin main 원격 main 브랜치의 최신 커밋들을 로컬로 가져오기 (Pull + Merge)
git push 로컬에 있는 내 코드 원격으로 올리기
git remote -v remote repo의 정보 확인: 로컬 저장소의 이름과 원격 저장소의 url 출력

origin https://github.com/username/repo.git (fetch)
origin https://github.com/username/repo.git (push)
git remote add origin <주소> 새로운 원격 저장소 추가

*origin: remote repo의 기본 명칭. 이름을 바꿀 수 있음
*주소는 HTTPS 형식이나 SSH 형식으로 추가할 수 있음
HTTPS타입: https://github.com/example/repo.git
SSH 타입: git@github.com:example/repo.git
git remote set-url origin <주소> set-url: 기존 url을 새로운 url로 교체
origin: 변경 대상 원격 저장소의 이름
<주소> 새로 설정할 url
git remote set-url --push origin <주소> --push: push URL만 변경하고 fetch URL은 유지
git remote remove origin origin 원격 저장소를 삭제

 

3. Branch 관리

git branch -r remote 브랜치 조회
git branch -l 로컬 브랜치 조회
git branch -a remote + local 브랜치 조회
git checkout -b <브랜치명> <브랜치명>의 새로운 브랜치 생성
git branch --delete <브랜치명> 로컬에 있는 <브랜치명> 브랜치 삭제
-D: 강제 삭제 옵션
git push --delete origin <브랜치명> remote repo(origin)에 있는 <브랜치명> 브랜치 삭제

 

4. git rebase

커밋 히스토리를 재정렬(rewrite)하는 것.

다른 브랜치의 최신 변경 사항을 내 브랜치의 커밋에 반영하는 방식이다.

git merge와의 차이점

git merge는 병합 커밋을 추가하여 히스토리를 보존한다.
A---B---C  (main)
     \
      D---E (feature)
# git merge main 실행 후
A---B---C---M  (main)
     \     /
      D---E (feature)

git rebase는 작업 브랜치의 커밋을 다른 브랜치의 끝에 재배치한다.
A---B---C  (main)
     \
      D---E (feature)
# git rebase main 실행 후: D와 E 커밋이 새로운 커밋(D', E')으로.
A---B---C---D'---E' (feature)

 

5. conflict 관리

브랜치를 합치는 merge 전, 원격에 있는 변경사항과 로컬에 있는 변경사항이 일치하는지 확인해야 한다.

1. git fetch로 원격 변경 사항 가져오기

2. 로컬 브랜치를 원격 브랜치에 맞게 재정렬: git rebase origin/main

 

2-1. 로컬에 있는 변경사항과 원격에 있는 변경사항이 다른 경우가 생긴다. (Conflict 발생)

// remote app.ts
console.log("Hello, world!");

// local app.ts
console.log("Hello, Local world!");

2-2. 이 경우, 로컬 파일의 코드를 의도에 맞게 수정한다.
2-3. git add <충돌 파일명>

2-4. 모든 충돌이 해결될때까지 git rebase -- continue 를 통해 2-2, 2-3 과정 반복

2-5. 모든 충돌이 해결된다면, git push -f를 통해 로컬의 변경사항을 강제 푸시한다.

 

3. 그 후 작업브랜치를 메인 브랜치로 머지한다.

 

# 1. 작업 브랜치에서 최신 메인 브랜치로 머지하기
# 1-1 메인 브랜치 최신화
git fetch origin
git checkout main
git pull origin main
# 1-2 작업 브랜치로 이동
git checkout feature-branch
# 1-3 작업 브랜치를 메인 브랜치에 rebase
git rebase main

# 2. Conflict 발생할 경우
# 2-1 충돌 해결 후 충돌 파일 추가
git add <파일>

# 2-2 Rebase 계속 진행
git rebase --continue

# 3. 작업 브랜치를 메인 브랜치로 병합(머지)
# 3-1 메인 브랜치로 이동
git checkout main

# 3-2 작업 브랜치 병합
git merge feature-branch

# 4. 메인 브랜치를 원격 저장소에 푸시
git push origin main

 

 

6. 파일 관리, stash, commit

6-1. 파일관리

변경된 파일을 staged 상태로 만든다. 일종의 커밋 대기 상태

git add . 변경사항 모두 추가

6-2. stash

임시저장. 

A 브랜치에서 작업하던 작업물 잠깐 저장 후, B 브랜치로 이동하여 커밋 조작 후 다시 이어 작업

git stash 현재 staged된 모든 수정사항을 임시 저장소에 저장한다.
git stash pop 가장 최근에 stash한 변경사항을 꺼내온다.
git stash list stash 리스트들 조회

git stash pop <스태시명> <스태시명>의 스태시를 pop한다.

git stash pop stash@{1}

6-3. commit

git log 커밋 메세지 기반 커밋 확인
git commit -m "메세지" 입력한 메세지를 통해 바로 커밋
git commit --amend 앞선 커밋 수정 (커밋 메세지 수정 or 커밋 내용 추가)
git push 현재 브랜치에 커밋된 내용 모두 원격에 업로드(푸시)
git push -u origin main
git push --set-upstream-to origin main
로컬 브랜치에 연결된 원격 브랜치가 없을때 최초 연결
git reset HEAD~1 커밋했던 수정본 모두 다시 커밋되지 않은 상태로 롤백
git reset --hard HEAD~1 커밋했던 수정본 (흔적도 없이) 싹다 없애고 롤백

 

7. 기타: cherry-pick, reflog, revert

7-1. git cherry-pick

특정 브랜치나 히스토리에 있는 개별 커밋을 선택해 현재 브랜치에 적용

git cherry-pick <커밋 해시>

# 예시
main:  A --- B --- C
feature: A --- B --- D --- E

# main 브랜치에 D 커밋만 가져오고 싶을 때
git checkout main
git cherry-pick <D의 해시>

git checkout main
git cherry-pick <D의 해시>

# D 커밋의 내용이 main 브랜치에 적용되었지만 새로운 커밋으로 기록됨(D')
main:    A --- B --- C --- D'
feature: A --- B --- D --- E

 

7-2. git  reflog

로컬 저장소에서 발생한 모든 HEAD 변경 기록을 보여준다.

 

  • 커밋, 리셋, 병합, 리베이스 등 모든 HEAD 이동 기록을 확인 가능.
  • 실수로 브랜치나 커밋을 삭제했을 때 복구에 유용
git reflog

# 출력 예시
1c2f32a (HEAD -> main) HEAD@{0}: commit: Fix bug in login
abc1234 HEAD@{1}: checkout: moving from feature to main
efg5678 HEAD@{2}: commit: Add feature X

# 복구 예시
# 잘못된 작업 후 특정 시점으로 복구
git reset --hard HEAD@{2}
# 특정 커밋 복구
git checkout <커밋 해시>

 

 

7-3. git revert

특정 커밋의 변경 사항을 되돌리는 새 커밋을 생성한다.

이전 상태로 완전히 덮어쓰는 reset과 다르게, 히스토리를 유지하면서 되돌림.

git revert <커밋 해시>

# 예시
# 브랜치 상태
A --- B --- C
# C 커밋 되돌리기
git revert <C의 해시>
# 결과: C커밋 기록은 그대로 남아있고, C 커밋을 취소하는 C'커밋이 새로 생성)
A --- B --- C --- C' (revert of C)