본문 바로가기
Git

[Git] 깃과 좀더 친해지길 바라

by yonikim 2022. 7. 4.
728x90

git 은 어렵다. git 을 사용하다 보면 되돌리고 싶은 순간들이 많이 발생하는데, 이러한 실수를 되돌리는 방법을 찾는건 너무 복잡하다. 그리하여 작성한 깃과 좀더 친해지길 바라...⭐️

 

 

이런, 뭔가 단단히 잘못됐는데, 다 뒤엎고 예전으로 돌리고 싶어!

# 모든 브랜치의 기록을 볼 수 있다.
# 각각 HEAD@{index} 형태로 index 를 가지고 있으니, 잘못되기 전에 해당하는 index 를 찾고
git reflog

# 타임머신을 타자!
git reset HEAD@{index}

이 기능은 실수로 지운 파일을 되돌리거나, 뭔가 잘못 수정한걸 되돌리거나, 실수로 머지한걸 되돌리거나, 다됐고 그냥 잘 동작하던 때로 되돌리고 싶을때 사용하면 된다. 

 

 

이런, 방금 커밋했는데 하나 깜빡했어!

 주의: 이 기능은 반드시 아직 로컬에만 있는 커밋에 사용해야 한다. 이미 원격 저장소에 push 된 커밋은 절대로 수정하면 안 된다. 

# 새로 바뀐 파일들을 add 하고
git add .

# 마지막 커밋에 바뀐 파일이 등록된다.
git commit --amend --no-edit

커밋을 하고나서 테스트/린터를 돌렸더니...아 이런, 오타가 난걸 커밋했네. 와 같은 상황에서 사용하는 기능이다. 새로 커밋을 하고 rebase -i 를 이용해서 두 커밋을 squash 하는 것도 가능하지만, 이 방법이 훨씬 더 빠르다.

 

 

 

이런, 커밋 메시지를 잘못 썼어!

git commit --amend

 

 

이런, 다른 브랜치에 커밋해야 하는걸 실수로 main/master 브랜치에 커밋해 버렸어!

 주의: 이미 원격 저장소에 push 했다면 슬프게도 이 방법은 소용 없다. 

# 현재 main/master 상태로 새로운 브랜치를 만든다.
git branch some-new-branch-name

# main/master 브랜치의 마지맛 커밋을 제거한다.
git reset HEAD~ --hard
# 여러개의 커밋을 했을 경우엔,아래 command 를 사용하면 된다.
git reset HEAD@{돌아갈 커밋 개수}

# 아래 브랜치에는 해당 커밋이 남아있다.
git checkout some-new-branch-name

 

 

 

이런, 실수로 이상한 브랜치에 커밋해 버렸어!

# 마지막 커밋은 취소하되, 변경된 사항은 남겨둔다.
git reset HEAD~ --soft
git stash

# 올바른 브랜치로 이동
git checkout name-of-the-correct-branch
git stash pop
git add .
git commit -m "Commit message"

 

 

이런, diff 를 실행했는데 왜 아무것도 안보이지?

분명히 뭔가를 수정했는데 diff 의 결과가 아무것도 나타나지 않는다면, 아마도 add 를 실행해서 파일을 staging 상태로 만들었을 가능성이 높다. 이 경우에는 옵션을 줘야 한다.

git diff --staged

 

 

이런, 예전에 한 커밋으로 되돌려야 하잖아?

# 되돌려야 할 커밋을 찾는다.
git log

# 해당 커밋의 hash 를 기억한다.
git revert {saved hash}

옛날 커밋을 일일이 찾아서 예전 파일 내용을 복사-붙여넣기 할 필요가 없다. 

 

 

이런, 파일 수정한걸 되돌려야 하잖아?

# 해당 파일이 수정되기 전의 커밋 hash 를 찾는다. 
git log

# 해당 커밋의 hash 를 기억한다.
git checkout [saved hash] -- path/to/file

git commit -m "Wow, you don't have to copy-paste to undo"

 

 

아 몰라. 그냥 다 포기하고 새로 만들래!

cd ..
sudo rm -r fucking-git-repo-dir

git clone https://some.github.url/fucking-git-repo-dir.git 
cd fucking-git-repo-dir

 

레포지토리 다시 받기를 이용한 방법이 아닌 git 명령어를 이용하여 초기화하고 싶다면

git fetch origin
git checkout main

# 추적되고 있지 않은 파일/폴더를 모두 삭제한다.
git reset --hard origin/main

# 초기화하고 싶은 각 브랜치에 대해 checkout, reset, clean 을 반복하면 된다.
git clean -d --force

 

 

728x90