처음 git 명령어를 접하게되면 흔히 발생되는 내용이 소스간에 충돌이 나는 것인데 이때 git이 소스를 관리하는 특성만 이해한다면 git을 사용함에 있어 어려움이 없을 것입니다. git은 기본적으로 로컬 저장소와, 원격 저장소 둘로 나뉘어 소스를 관리합니다. 그래서 보통 로컬에 내용을 업데이트 하는 명령어(pull)와 원격 저장소에 업데이트하는 명령어(push)로 구분되어 집니다. 프로젝트를 하다보면 특성상 같은 이름의 소스를 같이 수정하게되면 소스 충돌이 나게되면서 어떻게 해야하나 싶습니다. 대부분의 문제는 아래와 같은 명령어로 해결이 가능하니 사용해 보시기 바랍니다.
로컬 소스 <-- 서버 소스 (강제 overwrite)
# 1. 로컬 main 브랜치로 이동
git checkout main
# 2. 원격 저장소의 최신 내역을 가져옵니다.
# (아직 로컬 브랜치는 변경되지 않음)
git fetch origin
# 3. 로컬 main 브랜치를 원격 origin/main과 동일하게 만듭니다.
# 로컬 커밋과 변경사항이 모두 삭제됩니다.
git reset --hard origin/main
원격 저장소의 히스토리가 git push --force로 인해 변경되었다면, 로컬 저장소의 히스토리도 동일하게 맞춰야 합니다.
가장 안전하고 명확한 방법은 **git fetch**로 최신 상태를 확인한 후, **git reset --hard**로 강제 동기화하는 것입니다. 이 방법을 통해 의도치 않은 로컬 커밋 손실을 방지하고, "무엇을 하려는지"를 명확히 인지할 수 있습니다.
로컬 소스 --> 서버 소스 (강제 overwrite)
git push --force origin main
git push --force-with-lease origin main
Git을 처음 사용하기 전에 사용자 이름과 이메일을 설정합니다. 이 정보는 커밋(commit)에 기록됩니다.
# 사용자 이름 설정 (예시: Hong Gildong)
git config --global user.name "Your Name"
# 사용자 이메일 설정 (예시: your.email@example.com)
git config --global user.email "your.email@example.com"
기타 설명
Git은 파일의 상태를 세 가지 영역으로 구분하여 관리합니다.
기본적인 작업 흐름은 수정 -> 스테이징 -> 커밋 순서로 진행됩니다.
명령어 | 설명 |
git status |
현재 파일들의 상태를 보여줍니다. (어떤 파일이 수정되었고, 어떤 파일이 스테이징 되었는지 등)
|
git add <파일이름> |
작업 공간의 변경 내용을 스테이징 영역에 추가합니다.
|
git commit -m "커밋 메시지" |
스테이징 영역에 있는 파일들을 Git 저장소에 확정하여 기록합니다. 커밋 메시지는 어떤 변경 사항인지 명확하게 작성합니다.
|
예시
# 1. 파일 수정 또는 새로 생성 (예: index.html)
# 2. 상태 확인 (untracked)
git status
# 3. index.html 파일을 스테이징 영역에 추가
git add index.html
# 4. 상태 확인 (Changes to be committed)
git status
# 5. 커밋 (버전 확정)
git commit -m "feat: 홈페이지 초기 레이아웃 추가"
모든 파일을 한 번에 스테이징하려면 git add . 를 사용합니다.
git add .
로컬에서 작업한 내용을 원격 저장소에 반영하거나, 원격 저장소의 최신 내용을 가져옵니다.
명령어 | 설명 |
git push | 로컬 저장소의 커밋 내역을 원격 저장소에 업로드합니다. |
git pull | 원격 저장소의 최신 내역을 가져와서 로컬 저장소에 병합(merge)합니다. |
예시
# 로컬의 변경 사항을 원격 저장소로 푸시
git push origin main
# 원격 저장소의 최신 내역을 가져와서 병합
git pull origin main
유용한 추가 명령어
이 명령어들만 숙지해도 대부분의 기본적인 Git 작업을 수행할 수 있습니다.
브랜치 & 병합 (Branching & Merging)
여러 사람이 협업하거나 기능을 분리해서 개발할 때 사용하는 명령어들입니다.
명령어 | 설명 |
git branch | 저장소의 브랜치 목록을 확인합니다. |
git branch [이름] | 새로운 브랜치를 생성합니다. |
git checkout [이름] | 다른 브랜치로 이동합니다. (레거시 명령어) |
git switch [이름] | 다른 브랜치로 이동하는 최신 명령어입니다. |
git checkout -b [이름] | 새로운 브랜치를 만들고 바로 이동합니다. |
git merge [이름] | 지정된 브랜치의 내용을 현재 브랜치에 병합합니다. |
git rebase [이름] | 현재 브랜치의 커밋을 지정된 브랜치 위에 덮어씌워 깔끔한 히스토리를 만듭니다. |
변경사항 되돌리기 & 기록 수정 (Undoing & Rewriting)
실수를 했을 때 변경사항을 되돌리거나 커밋 기록을 수정할 때 사용합니다.
명령어 | 설명 |
git restore [파일] | 작업 디렉토리의 변경 내용을 되돌립니다. (git checkout [파일]의 최신 명령어) |
git reset [커밋해시] | HEAD를 특정 커밋으로 되돌립니다. (--soft, --hard 등 옵션 사용) |
git revert [커밋해시] | 특정 커밋의 변경 내용을 되돌리는 새로운 커밋을 생성합니다. |
git commit --amend | 가장 최근의 커밋 메시지나 내용을 수정합니다. |
git stash | 작업 중인 변경 내용을 임시로 저장하고 작업 디렉토리를 정리합니다. |
기록 확인 및 비교 (Inspection & Comparison)
버전 기록을 확인하거나 변경된 내용을 비교할 때 사용합니다.
명령어 | 설명 |
git log | 커밋 히스토리를 시간순으로 확인합니다. (--oneline, --graph 등 옵션이 유용) |
git diff | 두 커밋, 브랜치, 또는 작업 디렉토리와 스테이징 영역의 차이를 보여줍니다. |
git show [커밋해시] | 특정 커밋의 내용을 상세히 보여줍니다. |
원격 저장소 관리 (Remote Management)
원격 저장소와의 연결을 관리하는 명령어입니다.
명령어 | 설명 |
git remote | 연결된 원격 저장소 목록을 확인합니다. |
git remote add [이름] [URL] | 새로운 원격 저장소를 추가합니다. |
git push --force | 로컬 브랜치로 원격 브랜치를 강제로 덮어씁니다. (매우 위험!) |
git push --force-with-lease | 원격 브랜치가 최신 상태일 때만 강제로 덮어쓰는 안전한 명령어입니다. |
기타 & 고급 명령어 (Advanced)
자주 사용되지는 않지만, 매우 유용한 고급 기능들입니다.
명령어 | 설명 |
git reflog | HEAD가 이동한 모든 기록을 확인합니다. (잃어버린 커밋 복구에 유용) |
git bisect | 버그가 발생한 커밋을 이진 탐색으로 빠르게 찾습니다. |
git tag [버전] | 특정 커밋에 태그를 붙여 중요 버전을 표시합니다. |
git blame [파일] | 파일의 각 라인을 누가 언제 커밋했는지 보여줍니다. |
웹소켓 통신 시 1::, h, a와 같은 문자열 (3) | 2025.01.08 |
---|---|
java:comp/env/ 규칙은 뭘까? (3) | 2025.01.08 |
클래스 불변식(Class Invariant) (3) | 2024.12.31 |
로드 밸런싱 (Load Balancing) vs 리버스 프록시 (Reverse Proxy) 차이 (5) | 2024.11.29 |
L4 및 L7 로드 밸런싱이란? (2) | 2024.11.28 |