[250521수841H] Git & GitHub (2)

윤승호·2025년 5월 21일

험난한 깃허브 여행이 시작되었습니다 ^ㅅ^

학습시간 09:00~02:00(당일17H/누적841H)


◆ 학습내용

내가 보려고 만든 Git & GitHub 명령어 모음


1. 초기화 명령어

# 터미널 화면만 깔끔하게 정리
clear

# 로컬 Git 저장소 초기화 (.git 폴더 삭제)
rm -rf .git

# 현재 디렉토리의 모든 일반 파일과 폴더 삭제
rm -rf *

# 숨김 파일 및 폴더 삭제 (.gitignore 등 포함)
rm -rf .*

# 특정 파일 삭제
rm hello.txt

# 특정 폴더 삭제
rm -rf test-folder/

# Git 사용자 이름 전역 설정 제거
git config --global --unset user.name

# Git 사용자 이메일 전역 설정 제거
git config --global --unset user.email

# Git 전역 설정 파일 자체 삭제
rm ~/.gitconfig

# Git 자격증명 캐시 종료
git credential-cache exit

# Git 자격증명 캐시 설정 제거
git config --global --unset credential.helper

2. 기초 명령어

# 새 Git 저장소 생성
git init

# 파일 상태 확인
git status

# 변경 파일 스테이징
git add filename.txt
git add .                            

# 커밋 생성
git commit -m "메시지"

# 커밋 수정
git commit --amend                  

# 파일 변경점 비교
git diff                            

# 스테이징된 파일과 커밋 간 비교
git diff --cached                   

# 커밋 로그 보기
git log
git log --oneline                   
git log --graph --oneline --all    

# 파일 추적 해제 (삭제 X)
git rm --cached filename.txt       

# 파일 삭제 + 추적 제거
git rm filename.txt                

# 파일 이름 변경
git mv old.txt new.txt             

3. 브랜치 명령어

# 브랜치 목록 보기
git branch

# 원격 브랜치까지 모두 보기
git branch -a

# 브랜치 생성
git branch new-branch

# 브랜치 생성 + 바로 이동
git checkout -b new-branch

# 브랜치 전환
git checkout main

# 브랜치 삭제 (병합된 경우만 가능)
git branch -d old-branch

# 브랜치 강제 삭제 (병합 안 돼도 삭제)
git branch -D old-branch

# 브랜치 이름 변경 (현재 브랜치에서 실행)
git branch -m new-name

# 브랜치 병합 (현재 브랜치 기준으로)
git merge branch-name

# 병합 충돌 발생 시 병합 중단
git merge --abort

# 병합 대신 리베이스 시작
git rebase branch-name

# 리베이스 중 충돌 해결 후 계속 진행
git rebase --continue

# 리베이스 중단
git rebase --abort

# 브랜치 차이점 확인
git diff main..feature

# 커밋 그래프 확인 (브랜치 흐름 시각화)
git log --oneline --graph --all --decorate

4. 팀플 명령어

# 깃허브 레포지토리 복제
git clone https://github.com/팀이름/프로젝트.git
cd 프로젝트

# 작업 전 항상 최신 상태 동기화
git checkout main
git pull origin main

# 새 브랜치 생성 및 이동 (기능 단위 작업)
git checkout -b feature/login-ui

# 코드 작업 후 변경 확인
git status
git diff

# 변경사항 스테이징 및 커밋
git add .
git commit -m "로그인 UI 레이아웃 구현"

# 원격 브랜치로 푸시
git push -u origin feature/login-ui

# GitHub에서 Pull Request(PR) 생성 → 팀원 리뷰 요청

# 팀원이 merge하기 전, 최신 main 반영하기
git checkout feature/login-ui
git fetch origin
git rebase origin/main  # 내 브랜치에 최신 main을 덮어씌움
# 충돌 발생 시 수동 해결 후:
git add .
git rebase --continue

# PR 승인 후 병합 → main으로 이동
git checkout main
git pull origin main

# 작업 브랜치 정리
git branch -d feature/login-ui
git push origin --delete feature/login-ui

팀원 PR 리뷰할 때 체크할 것

  • 커밋 메시지 명확한가?
  • 파일 구조 지켰는가?
  • main 반영 여부 확인했는가?
  • 불필요한 파일(ex. .DS_Store, .env) 올라오지 않았는가?

동시 작업 시 주의사항

  • 절대 main에서 바로 작업하지 말 것
  • 항상 브랜치 기반 → PR 기반 워크플로우로
  • 커밋 후 반드시 push → pull 요청 전 최신 main 기준 rebase

5. 병합 명령어

❗ git merge 안 될 때

# [1] 병합하려고 했는데 충돌(conflict)이 발생한 경우
# 에러 메시지: "Automatic merge failed; fix conflicts and then commit the result."

# 해결 방법:
git status                        # 어떤 파일에 충돌이 났는지 확인
# 충돌 파일 열어서 직접 수정 (<<< >>> 표시 있는 부분 수정)
git add 충돌해결한파일들
git commit -m "병합 충돌 해결"

# [2] 병합 도중 중단하고 싶을 때
git merge --abort                # 병합 전 상태로 되돌림 (단, 아직 커밋 전일 때만 가능)

# [3] 병합 전에 main이 최신이 아닌 경우
git checkout main
git pull origin main             # 최신 상태 반영

# [4] 내 브랜치가 너무 오래된 상태일 때 → rebase로 최신화
git checkout 내브랜치
git fetch origin
git rebase origin/main
# 충돌 발생 시:
git status
# 수정 → add → 
git rebase --continue

# [5] fast-forward 병합만 허용되어 있어서 병합 안 되는 경우
# (보통 깃허브에서 PR merge policy 때문)
# → main에서 새 브랜치 만들고, 최신화 후 rebase → PR 재작성

# [6] 병합이 안 되는 정확한 이유 모를 때
git status
git log --oneline --graph --all
# 위 두 명령어로 현재 브랜치 상태와 병합 지점 확인

6. 에디터 명령어

# [1] vi 에디터로 파일 열기
vi filename.txt

# [2] vi 모드 기본 조작
# 입력 모드 전환
i               # 현재 커서 위치에서 입력 시작
a               # 커서 다음 위치부터 입력
o               # 아래 줄에 새 줄 추가 후 입력

# 명령 모드 (ESC 누르고 아래 조작)
:w              # 저장
:q              # 종료
:wq             # 저장 후 종료
:q!             # 저장 없이 강제 종료
dd              # 한 줄 삭제
yy              # 한 줄 복사
p               # 붙여넣기

# [3] Git 커밋 메시지를 vi로 수정할 때
git commit --amend
# 또는 충돌 해결 후 커밋 시 vi가 뜸 → 위 조작 사용

# [4] 커밋 메시지를 편집기 없이 직접 쓰고 싶을 때
git commit -m "메시지 내용"

# [5] Git이 vi가 아니라 nano나 다른 편집기를 여는 경우
git config --global core.editor "vim"      # 기본 에디터를 vi로 설정

# [6] 터미널 내에서 파일 빠르게 확인 (수정은 아님)
cat filename.txt        # 내용 출력만
less filename.txt       # 페이지 단위로 보기
head filename.txt       # 앞쪽 10줄 보기
tail filename.txt       # 뒤쪽 10줄 보기

7. 기타 명령어

# [1] 실수한 커밋 되돌리기 (작업은 그대로 보존)
git reset --soft HEAD~1

# [2] 실수한 커밋 + 스테이징까지 되돌리기
git reset --mixed HEAD~1

# [3] 커밋도 스테이징도 전부 없애기 (파일만 남음)
git reset --hard HEAD~1

# [4] 특정 파일만 이전 커밋 상태로 되돌리기
git checkout HEAD -- filename.txt

# [5] 작업 중인 코드 임시로 저장 (stash)
git stash

# [6] 저장한 stash 다시 꺼내기
git stash apply

# [7] 여러 개 stash 중 특정 stash 보기
git stash list
git stash show stash@{0}

# [8] 과거 커밋으로 이동 (checkout은 읽기 전용)
git checkout 커밋ID

# [9] 커밋 되돌리기 (되돌린 기록도 남음)
git revert 커밋ID

# [10] .gitignore 수정 후 바로 반영
git rm -r --cached .
git add .
git commit -m ".gitignore 적용"

# [11] 자주 쓰는 상태 확인 세트
git status
git log --oneline
git branch
git remote -v

연습

####################
## 셋팅
####################
# 팀프로젝트 불러오기
git clone 링크
cd 폴더명
# 브랜치 생성
git checkout -b feature/login


####################
## 파일 관련
####################
# 파일 생성
echo "# 아래 내용을 먼저 읽어주세요." > README.md
# 파일 수정
vi README.md
# 파일 확인
ls -al
# 파일 삭제
rm -f README.md


####################
## 깃허브 관련
####################
# Git 스테이징 & 커밋
git add README.md
git commit -m "README.md 작성 완료"
git push -u origin feature/login


####################
## 신규 브랜치 끼워넣기
####################
git checkout main  # main 브랜치로 이동
git pull origin main  # GitHub의 main 다운로드
git checkout -b develop  # 브랜치 생성 및 이동
git push -u origin develop  # 브랜치 GitHub에 업로드
git checkout feature/login  # 작업 중이던 위치로 복귀
git fetch origin  # GitHub 변경사항으로 패치
git rebase origin/develop  # 내 브랜치를 origin/develop 위에 올림
git add .  # rebase 충돌 시 수정내역 확인 [문제 직접 확인 필요]
git rebase --continue  # 충돌 해결 후 재시도


# 이후 GitHub 홈페이지 가서 PR 진행


# 시간을 되돌리는 방법
git rebase -i --root

# 내 로컬에서 충돌 수정
git checkout 내브랜치명
git pull origin main
git add README.md
git commit -m "내용"
git push -u origin 내브랜치명
profile
나는 AI 엔지니어가 된다.

0개의 댓글