생활코딩의 명강의, **'지옥에서 온 Git'** 시리즈의 핵심 내용을 깔끔하게 요점 정리해 드릴게요. Git이라는 낯선 도구 앞에서 길을 잃지 않도록 흐름 위주로 정리했습니다. --- ## 1. Git의 핵심 철학: "버전 관리" Git은 단순히 파일을 저장하는 곳이 아니라, **파일의 변화를 기록**하는 도구입니다. * **언제든 과거로 돌아갈 수 있다.** * **누가, 무엇을, 왜 바꿨는지 알 수 있다.** * **여러 명이 동시에 안전하게 협업할 수 있다.** --- ## 2. 세 가지 공간 (Working Tree, Index, Repository) Git을 이해하는 가장 중요한 열쇠는 파일이 거쳐가는 세 가지 단계를 이해하는 것입니다. * **Working Tree:** 내가 현재 실제로 작업하고 있는 폴더 (파일 수정 중). * **Index (Staging Area):** 커밋하기 위해 "준비"시킨 파일들이 머무는 곳. * **Repository:** 커밋된 버전들이 영구적으로 저장되는 저장소. --- ## 3. 필수 명령어 4가지 이 네 가지만 알아도 Git의 기본 사이클은 완성됩니다. 1. **`git init`**: 현재 폴더를 Git이 관리하도록 선언합니다. (.git 폴더가 생성됨) 2. **`git add <파일명>`**: 수정된 파일을 **Index**로 올립니다. (커밋 대기 상태) 3. **`git commit -m "메시지"`**: Index에 있는 파일들을 하나의 버전으로 만들어 **Repository**에 저장합니다. 4. **`git log`**: 지금까지 만든 버전들의 역사를 확인합니다. --- ## 4. 시간 여행: Reset과 Checkout Git의 진가는 과거로 돌아갈 때 나타납니다. * **`git checkout `**: 특정 버전의 시점으로 파일 상태를 되돌립니다. (과거 구경하기) * **`git reset --hard `**: 특정 시점 이후의 모든 기록을 지우고 완전히 그 시절로 돌아갑니다. --- ## 5. 평행 우주: Branch (가지치기) 원래의 코드 흐름(master/main)을 건드리지 않고, 새로운 실험을 하고 싶을 때 사용합니다. * **`git branch <이름>`**: 새로운 가지를 만듭니다. * **`git checkout <이름>`**: 해당 가지로 이동합니다. * **`git merge <이름>`**: 작업이 끝난 가지를 다시 메인 줄기에 합칩니다. --- ## 6. 협업의 시작: Remote Repository (원격 저장소) 내 컴퓨터(Local)에만 있던 소스코드를 GitHub 같은 온라인 공간(Remote)에 올려서 공유합니다. * **`push`**: 내 컴퓨터의 버전을 서버로 올리기. * **`pull`**: 서버의 최신 버전을 내 컴퓨터로 가져오기. * **`clone`**: 서버에 있는 프로젝트 전체를 내 컴퓨터로 복제해오기. --- ### 💡 요약 한 마디 > **"수정하고(Add), 기록하고(Commit), 공유하라(Push)!"** 이 기본 흐름만 익히면 '지옥' 같던 Git이 든든한 '천사'로 바뀔 거예요. 혹시 특정 명령어의 사용법(예: 충돌 해결 방법이나 상세 옵션 등)이 더 궁금하신가요? 원하신다면 해당 부분만 더 깊게 설명해 드릴 수 있습니다. 또한 모든 앱의 전체 기능을 이용하려면 [Gemini 앱 활동](https://myactivity.google.com/product/gemini)을 사용 설정하세요. Git을 쓰다 보면 피할 수 없는 숙명과도 같은 것이 바로 **충돌(Conflict)**이죠. 지옥에서 온 Git 강의의 핵심인 '충돌 해결'을 아주 친절하고 상세하게 정리해 드릴게요. --- ## 💥 충돌(Conflict)은 왜 발생하는가? 충돌은 Git이 **"이건 내가 자동으로 합칠 수 없으니 사람이 직접 결정해!"**라고 선언하는 상태입니다. 보통 같은 파일의 **같은 줄**을 서로 다른 내용으로 수정하고 `merge`할 때 발생합니다. --- ## 1. 충돌 해결의 표준 프로세스 1. **`git merge <대상-브랜치>`**: 병합을 시도했으나 충돌 메시지가 뜹니다. 2. **`git status`**: 어떤 파일에서 충돌이 났는지 확인합니다. (Both Modified 라고 뜹니다.) 3. **파일 수정**: 충돌이 난 파일을 열어 Git이 표시해준 기호를 보고 내용을 선택합니다. 4. **`git add <파일명>`**: 충돌 해결을 완료했음을 Git에게 알립니다. 5. **`git commit`**: 병합을 마무리하는 커밋을 생성합니다. --- ## 2. 파일 안의 충돌 표시 읽는 법 (중요!) 파일을 열면 아래와 같은 해괴한(?) 기호들이 보일 겁니다. ```text <<<<<<< HEAD 현재 내가 위치한 브랜치의 내용 (이미 있던 내용) ======= 합치려고 하는 브랜치의 내용 (새로 들어온 내용) >>>>>>> 브랜치명 ``` * **`<<<<<<<`** 부터 **`=======`** 사이: 현재 내 브랜치의 상태입니다. * **`=======`** 부터 **`>>>>>>>`** 사이: 병합해오려는 상대 브랜치의 상태입니다. * **해결 방법**: 이 기호들을 모두 지우고, 최종적으로 남기고 싶은 내용만 남긴 뒤 저장하면 됩니다. --- ## 3. 상세 옵션 및 유용한 명령어 충돌 상황에서 당황하지 않게 도와주는 중급 옵션들입니다. ### ① `git merge --abort` (작전상 후퇴) 충돌이 너무 복잡해서 일단 병합을 시작하기 전의 깨끗한 상태로 되돌리고 싶을 때 사용합니다. > "일단 없던 일로 해! 나중에 다시 합칠래!" ### ② `git checkout --ours <파일명>` / `--theirs` 파일의 내용을 일일이 지우기 귀찮을 때, 통째로 한쪽의 손을 들어주는 옵션입니다. * **`--ours`**: 내 브랜치의 내용을 선택합니다. * **`--theirs`**: 상대방(합치려는 브랜치)의 내용을 선택합니다. ### ③ `git mergetool` 텍스트 에디터로 직접 수정하기 힘들 때, `pdiff`, `vimdiff`, `vscode` 등 전문적인 병합 도구를 실행하여 시각적으로 비교하며 해결할 수 있게 도와줍니다. --- ## 4. 충돌을 예방하는 꿀팁 🍯 * **자주 Merge 하세요**: 작업량이 많아질수록 충돌은 눈덩이처럼 불어납니다. 자주 합치면 충돌 범위가 작아 해결하기 쉽습니다. * **동일 파일 작업 최소화**: 협업 시에는 미리 업무 범위를 나누어 같은 파일의 같은 부분을 건드리지 않도록 소통하는 것이 최고입니다. * **커밋 메시지 명확히**: 충돌이 났을 때 누가 무엇을 왜 고쳤는지 알 수 있도록 커밋 메시지를 잘 적어두면 의사결정이 빨라집니다. --- 이제 충돌이 나도 당황하지 않고 `<<<<<<<` 기호부터 찾으실 수 있겠죠? 혹시 **GitHub의 'Pull Request' 상에서 발생하는 충돌 해결법**도 궁금하신가요? 원하신다면 이어서 설명해 드릴게요!