18회차 Git&Github

정상희·2025년 4월 2일

코딩공부

목록 보기
29/60
post-thumbnail

현재 오즈코딩스쿨 강의를 통해 프론트엔드를 학습하고 있습니다.
본 포스트는 해당 강의에 대한 내용 정리를 목적으로 합니다.

1. reset 사용해 commit 되돌리기


git reset은 커밋이나 스테이징된 파일을 이전 상태로 되돌리는 명령어다.
Git에서 작업을 취소하거나, 특정 커밋 이전으로 돌아갈 때 사용한다.

#log 정보 확인 후 커밋 해시 확인 및 복사
git log

#복사한 커밋 해시를 이용해 reset 명령어와 원하는 옵션을 사용합니다. 
git reset --hard [커밋 해시]
git reset --soft [커밋 해시]
git reset --mixed [커밋 해시]

#다시 한번 log를 활용해 정상적으로 reset이 되었는지 확인
git log

1) reset에 사용할 수 있는 옵션

옵션설명
--softHEAD만 이동 (변경 내용 유지, 스테이징도 유지)
이전 commit으로 되돌린후, 그 이후 이력들의 내용이 삭제되지 않고 stage에 올라가있어 언제든지 commit을 진행할 수 있는 상태가 됨
--mixed (기본값)HEAD 이동 + 스테이징 취소 (파일은 그대로)
이전 commit으로 되돌린후, 그 이후 이력들의 내용이 삭제되지 않았지만 다시 commit하기 위해서는 다시 add 명령어를 이용해 stage에 올려 commit을 진행해야 함
--hardHEAD 이동 + 스테이징 취소 + 파일 변경까지 삭제
이전 commit으로 되돌린 후, 그 이후 이력들을 모두 삭제

Reset은 언제 사용하나요?

  • 혼자만 사용하는 브랜치인 경우
  • origin에 있지만 아무도 이 브랜치를 사용하지 않는다는 확신을 가지는 경우

그 외 거의 모든 경우에서 commit을 되돌릴때 revert를 사용한다.


2) git reset 기본 사용법

git reset [옵션] [커밋 해시]

옵션에 따라 동작 방식이 다르니 주의해야 한다.


3) git reset 사용 예제

a. --soft (최근 커밋 취소, 코드 유지)

git reset --soft HEAD~1

✅ 최근 커밋을 취소하고 변경 내용을 그대로 유지
git commit -m "새로운 메시지"로 다시 커밋 가능

b. --mixed (최근 커밋 취소 + 스테이징 해제)

git reset --mixed HEAD~1

✅ 최근 커밋을 취소하고, 변경 내용을 작업 디렉터리로 이동
git add . 후 다시 커밋 가능

c. --hard (모든 변경 사항 삭제)

git reset --hard HEAD~1

✅ 최근 커밋을 완전히 삭제하고, 변경 사항까지 날림
❗ 되돌리기 어려우므로 주의해야 함

d. 특정 커밋으로 되돌리기

git reset --hard <커밋 해시>

✅ 해당 커밋 시점으로 프로젝트를 완전히 되돌림
✅ git reflog로 기록을 보고 복구 가능

4) git reset vs git revert 차이점

명령어설명
git reset커밋을 삭제하고 이전 상태로 되돌림
git revert새로운 "되돌리는 커밋"을 생성


2. reflog 명령어

git reflog는 HEAD가 이동한 모든 기록을 확인하는 명령어다.
보통 git log는 커밋 히스토리만 보여주지만, git reflog는 체크아웃, 리셋, 병합 등 HEAD가 움직인 모든 기록을 남긴다.

1) git reflog 기본 사용법

git reflog

이렇게 실행하면 HEAD가 이동한 모든 기록이 출력된다.


2) git reflog에서 확인할 수 있는 정보

  • 커밋 해시(commit hash)

  • HEAD 이동 기록 (체크아웃, 리셋, 병합 등)

  • 시간(timestamp)

  • 작업 내용 요약


3) 실수 복구 예제

a. 실수로 커밋을 되돌렸을 때 (reset --hard 취소하기)

git reset --hard HEAD~1  # 마지막 커밋을 삭제함

👉 하지만 실수로 삭제했을 경우

git reflog

이렇게 확인하면 삭제된 커밋 해시가 보인다.

1a2b3c4 HEAD@{0}: reset: moving to HEAD~1
9d8e7f6 HEAD@{1}: commit: 중요한 기능 추가

✅ 여기서 삭제된 커밋 9d8e7f6을 다시 살릴 수 있다.

git reset --hard 9d8e7f6

b. 브랜치를 실수로 삭제했을 때

git branch -D feature-branch

👉 브랜치가 날아갔을 경우

git reflog

출력된 커밋 해시를 확인한 뒤, 복구하면 된다.

git checkout -b feature-branch <해당 커밋 해시>

c. git log vs git reflog 차이점

명령어설명
git log커밋 히스토리만 확인
git reflogHEAD 이동 기록까지 포함 (체크아웃, 리셋 등)

즉, git reflog는 Git에서 내가 무슨 작업을 했는지 추적할 수 있는 중요한 도구다.
실수로 커밋을 날렸거나, 브랜치를 잃어버렸을 때 유용하니 꼭 기억해둬라. 🔥



3. revert 사용해 commit 되돌리기


git revert는 기존 커밋을 되돌리는 새로운 커밋을 생성하는 명령어다.
git reset과 달리 기록을 유지하면서 변경 사항을 되돌리기 때문에 협업할 때 안전하게 사용할 수 있다.

1) git revert 기본 사용법

git revert <커밋 해시>

✅ 해당 커밋을 취소하는 새로운 커밋을 생성
✅ 기록이 남으므로 팀 프로젝트에서 안전하게 되돌릴 때 사용


2) git revert 사용 예제

a. 가장 최근 커밋을 되돌리기

git revert HEAD

✅ 최근 커밋을 되돌리는 새로운 커밋을 생성


b. 특정 커밋을 되돌리기

git log --oneline  # 되돌릴 커밋 해시 확인
git revert <커밋 해시>

✅ 이전 커밋들을 유지하면서 특정 커밋만 취소 가능


c. 여러 개의 커밋을 한 번에 되돌리기

git revert -n HEAD~3..HEAD  # 마지막 3개 커밋을 되돌림 (새 커밋 생성 안 함)
git commit -m "되돌리기 완료"

✅ 여러 개의 커밋을 하나의 되돌리기 커밋으로 묶어서 처리


d. git revert vs git reset 차이점

명령어설명협업 시 추천?
git reset커밋 자체를 삭제 (히스토리 사라짐)
git revert커밋을 되돌리는 새로운 커밋 생성 (기록 유지)

✅ git revert는 되돌리는 새로운 커밋을 만든다

✅ 기록을 유지하면서 안전하게 되돌릴 때 사용

✅ 협업할 때 유용하지만, 여러 개의 커밋을 되돌릴 땐 -n 옵션으로 묶어서 처리 가능



4. Sourcetree 사용해 commit 되돌리기

1) Sourcetree를 이용해 git reset 실행하기

History 탭의 로그 화면에서 되돌리게 할 커밋을 선택하고 마우스 오른쪽 버튼을 클릭합니다. 팝업 항목중에서 “main를 이 커밋으로 초기화” 항목을 선택하면 reset에 적용할 옵션이 나옵니다. 원하는 옵션을 선택 후 확인을 누릅니다.


2) Sourcetree를 이용해 git revert 실행하기

History 탭의 로그 화면에서 되돌리게 할 커밋을 선택하고 마우스 오른쪽 버튼을 클릭합니다. 팝업 항목중에서 커밋 되돌리기 항목을 선택하면 Revert 커밋과 메시지가 자동으로 생성됩니다.



5. branch

git branch는 독립적인 작업을 할 수 있도록 새로운 가지(branch)를 만드는 기능이다.
각 브랜치는 서로 영향을 주지 않으면서 개발을 진행할 수 있기 때문에, 새로운 기능 개발, 버그 수정 등에 유용하게 사용된다.
쉽게 말하면 협업 중인 코드를 나만의 연습장에 그대로 복사해서 작업하는 것.

필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에
아래 그림과 같이 여러 작업을 동시에 진행할 수 있다.

또한, 이렇게 만들어진 branch는 다른 branch와 병합(Merge)함으로써, 작업할 내용을 다시 새로운 하나의 브랜치로 모을 수 있다.

아래 그림을 보면, branch를 사용하여 동시에 여러 작업을 진행하다가 Master or main branch에 병합(Merge)하는 과정을 볼 수 있다.

1) git revert 기본 사용법

a. 현재 브랜치 확인

git branch

✅ 현재 저장소의 브랜치 목록을 출력하고, 현재 작업 중인 브랜치는 * 표시됨


b. 새로운 브랜치 생성

git branch 브랜치이름

✅ 새로운 브랜치를 생성하지만, 현재 브랜치는 변경되지 않음


c. 브랜치 이동 (체크아웃)

git checkout 브랜치이름

✅ 특정 브랜치로 이동
✅ 최신 Git에서는 git switch 사용 가능

git switch 브랜치이름

d. 브랜치 생성 + 이동 (한 번에)

git switch -c 브랜치이름

✅ 새 브랜치를 만들고, 동시에 이동


e. 브랜치 삭제

git branch -d 브랜치이름

✅ 병합된 브랜치만 삭제 가능

git branch -D 브랜치이름

✅ 병합되지 않은 브랜치도 강제 삭제


f. 브랜치 병합 (merge)

git checkout 메인브랜치  # 보통 main 또는 develop
git merge 병합할브랜치

✅ 병합할 브랜치의 변경 사항을 현재 브랜치로 합침

merge의 두가지 방식

  • Fast-forward 병합 (빠른 병합)

    • 현재 브랜치가 병합할 브랜치보다 뒤처지지 않은 경우
    • 브랜치 포인터만 이동하여 병합됨 (새로운 커밋이 생성되지 않음)
    git merge feature-branch
    • fast-forward 방식으로 merge하기(--ff)
    git merge --ff [브랜치명]
    • fast-forward 방식으로 merge되지 않도록 하기(--no-ff)
    git merge --no-f [브랜치명]
    • root 브랜치의 마디들을 하나로 묶어 main 브랜치로 가져올 수 있습니다.
    git merge --squash (대상 브랜치)

    - 변경사항들 스테이지 되어 있음
    - git commit 후 메시지 입력


  • Recursive 병합 (일반 병합)

    • 두 브랜치가 각각 다른 커밋을 가지고 있는 경우

    • 새로운 "병합 커밋"이 생성됨

      git merge feature-branch

      ✅ 두 브랜치의 변경 사항을 하나의 커밋으로 합침


충돌(conflict)이 발생한 경우

  • 같은 파일의 같은 부분이 수정되면 Git이 자동 병합을 못 함
  • git status로 충돌 파일 확인
git status
  • 파일을 수정 후, 병합 완료
git add 충돌해결한파일
git commit -m "병합 충돌 해결"

✅ 충돌이 해결되면 병합 완료


g. 원격 브랜치 가져오기

git fetch
git checkout -b 브랜치이름 origin/브랜치이름

✅ 원격 저장소의 브랜치를 로컬에서 생성하고 체크아웃


2) 브랜치 개념 정리

브랜치 관련 명령어설명
git branch브랜치 목록 확인
git branch 브랜치이름새 브랜치 생성
git checkout 브랜치이름브랜치 이동
git checkout -b 브랜치이름새 브랜치 생성 + 이동
git branch -d 브랜치이름브랜치 삭제
git merge 브랜치이름브랜치 병합
git fetch원격 브랜치 목록 가져오기

📌 브랜치를 잘 활용하면 코드 충돌을 최소화하면서 여러 작업을 동시에 진행할 수 있다.

HEAD란?
터미널에 git log를 입력했을때 여러분들은 HEAD라는 단어를 본적 있다.

HEAD란 해당 branch의 마지막 commit을 뜻합니다.
즉, HEAD가 특정 commit에 위치해 있다면 그 branch의 가장 마지막 commit이라고 해석할 수 있습니다.



6. rebase


git rebase는 브랜치의 변경 사항을 다른 브랜치의 최신 커밋 뒤로 재배치하는 명령어다. 즉, 브랜치 히스토리를 깔끔하게 정리하는 역할을 한다.

1) git rebase 기본 사용법

a. 다른 브랜치의 최신 변경 사항을 내 브랜치에 적용

git checkout feature-branch  # 내 브랜치로 이동
git rebase main  # main 브랜치의 최신 커밋 뒤로 재배치

✅ feature-branch의 커밋을 main의 최신 커밋 뒤로 옮김
✅ 커밋 히스토리가 일직선으로 정리됨


2) git merge vs git rebase 차이점

a. git merge

  • 새로운 병합(merge) 커밋이 생성됨

  • 브랜치 구조를 유지하면서 변경 사항을 합침

  • 히스토리에 병합 커밋이 남아 복잡해질 수 있음

git checkout main
git merge feature-branch

📌 협업 시 안전하지만, 히스토리가 복잡해질 수 있음


b. git rebase

  • 브랜치 히스토리를 깔끔하게 정리

  • 병합 커밋 없이 커밋을 재배치

  • 강제 푸시(git push -f)가 필요할 수 있어 협업 시 주의해야 함

git checkout feature-branch
git rebase main

📌 개인 작업 시 유용하지만, 협업 시 주의해야 함


3) git rebase 예제

a. feature-branch를 main 브랜치 뒤로 재배치

git checkout feature-branch
git rebase main

✅ feature-branch의 커밋을 main의 최신 커밋 뒤로 이동


b. rebase 중 충돌 해결

  • 같은 파일이 수정되면 충돌 발생
  • 충돌 파일을 직접 수정
git status  # 충돌 난 파일 확인
nano 수정된파일  # 파일 수정
git add 수정된파일
git rebase --continue

✅ 충돌을 해결하고 rebase 계속 진행


c. rebase 중단하고 원래 상태로 되돌리기

git rebase --abort

✅ rebase를 취소하고 원래 브랜치 상태로 복구


d. git rebase 주의할 점

  • 공유된 브랜치에서 rebase를 하면 안 됨!

    • git push -f가 필요할 수도 있어 다른 사람의 작업이 꼬일 수 있음
  • 협업할 때는 git merge, 개인 작업할 때는 git rebase 사용이 좋음



7. cherry-pick

1) git cherry-pick 기본 사용법

특정 커밋을 현재 브랜치로 가져오기

git checkout main  # 적용할 브랜치로 이동
git cherry-pick <커밋 해시>

✅ feature-branch에서 특정 커밋만 main 브랜치로 가져옴


2) git cherry-pick 예제

a. feature-branch의 특정 커밋을 main 브랜치로 복사

git checkout main
git cherry-pick abc1234

✅ feature-branch의 abc1234 커밋만 main 브랜치에 적용


b. 여러 개의 커밋을 한 번에 적용

git cherry-pick abc1234 def5678

✅ 여러 개의 커밋을 선택해서 현재 브랜치에 적용


c. 연속된 여러 커밋을 적용

git cherry-pick abc1234..def5678

✅ abc1234부터 def5678까지의 커밋을 모두 적용


d. cherry-pick 중 충돌 해결

  • 같은 파일을 수정하면 충돌 발생

  • 충돌 파일을 수정한 후

git add 수정된파일
git cherry-pick --continue

✅ 충돌 해결 후 cherry-pick 계속 진행


e. cherry-pick 취소

git cherry-pick --abort

✅ cherry-pick을 취소하고 원래 상태로 복구



8. conflict

conflict(충돌)는 Git이 자동으로 병합할 수 없는 상황을 의미한다.
보통 두 개의 브랜치에서 같은 파일의 같은 부분을 수정했을 때 발생한다.

git conflict(충돌) 발생 상황

  • git merge 중 충돌

  • git rebase 중 충돌

  • git cherry-pick 중 충돌

  • git stash pop 중 충돌

1) 충돌 해결 방법

a. 충돌 확인

git status

✅ 충돌이 발생한 파일을 확인


b. 충돌 파일 열기

nano 충돌난파일  # 또는 VSCode, Vim 등 사용

✅ Git은 충돌이 난 부분을 아래처럼 표시함

<<<<<<< HEAD
내 브랜치에서 수정한 내용
=======
다른 브랜치에서 수정한 내용
>>>>>>> feature-branch

✅ HEAD 부분: 현재 브랜치의 변경 내용
✅ feature-branch 부분: 병합하려는 브랜치의 변경 내용


c. 충돌 해결 후 변경 사항 저장

✅ 올바른 내용으로 수정한 후 저장

git add 충돌난파일

✅ 모든 충돌 파일을 해결한 후 다음 명령 실행

git merge --continue  # merge 중이라면
git rebase --continue  # rebase 중이라면
git cherry-pick --continue  # cherry-pick 중이라면

d. 충돌 해결 후 커밋

git commit -m "충돌 해결"

✅ 병합 완료


e. git conflict 해결 시 주의할 점

  • 충돌이 발생한 부분을 신중하게 수정해야 함

  • VSCode, GitKraken 같은 GUI 툴을 사용하면 편리함

  • 협업 중이라면 다른 개발자와 논의 후 해결



끝맺음.

어렵다...어려워...복습이 답이다!!

profile
UI/UX디자이너의 코딩 공부

0개의 댓글