햣
깃(Git)은 어렵다. 계속 사용해도 끊임없이 헷갈리고 어렵다. 그래도 배우는 과정이 재미있는 것 중 하나라고 생각한다.
나는 GUI보다 CLI방식을 더 선호하는데 빠르게 컴퓨터와 소통할 수 있다는 장점 때문이다. 물론 마우스로 끌어당겨서 파일 추가하는 방식이 더 익숙하고 시각적으로 바로 확인할 수 있어서 좋긴 하지만 뭐랄까, 직관적이어서 가급적 명령어를 타이핑하려고 한다.
깃 작업할 때는 상황에 따라 여가지 사용하고 있다. 내 작업 환경은 코드 에디터로 Visual Studio Code를 사용하고 있고(코드와 함께 상시 터미널을 띄워둘 수 있어 커맨드 라인 접근성이 좋다) 익스텐션으로 git graph와 git history를 사용하고 있는데 커맨드 라인에서 더욱 훨씬 깔끔하고 예쁘게 표시해주기 때문에 필수다. 상황에 따라 Github Desktop 애플리케이션을 사용하고 있다.
스스로를 위해서 제대로 정리해볼 필요가 있다는 생각이 들어서 일부 기본적인 명령어를 제외하고 자주 사용하거나 난감한 상황에 부닥쳤을 때 응급 처치용으로 알아두길 잘했다 싶은 것들을 정리해보았다. 주가 되는 명령어 외에는 풀어쓰지 않았으니 정확한 내용은 구글링 꼬.
(깃 다룰 땐 정신 똑바로 차리고 침착하기 ...)
이전에 혼자 코딩할 땐 아무 생각 없이(어차피 본인 노트북만 사용해와서) 생각지도 못했던 부분이지만 과제를 하고 프로젝트를 하면서 특히 개인 사용 노트북이 아닐 때 중요했던 부분이 "깃 설정"이었다. 커밋할 때 담기는 유저의 정보를 이곳에서 설정할 수 있다. 사실 정확한 상황은 기억 안 나지만 내가 저장소에 푸쉬를 하고 나서서였나. 레포를 확인해보니 푸쉬한 사람이 내가 아닌 다른 사람으로 되어있어서 당황했었다. 나중에 원인을 찾고 나니 공용 컴퓨터를 사용 중이라 발생하던 문제였고 그 이후로 설정을 확인해주는 습관이 들였다.
git config -l
→git config (--golbal)
+ user.id
or user.name
or user.email
→참고 자료
Git SCM
Git Cheat Sheat
혼자 작업할 때는 몰랐는데 협업을 진행하고 여러 사람과 함께 레포를 공유하면서 선택한 워크플로에 맞춰서 작업하는 일이 생각보다 까다롭고 또 나름 브랜치를 깔끔하고 예쁘게 그리기 위해서 시간을 들이게 됐다. 커밋을 합치거나 나누고 싶을 때(사실상 내용을 지우고 새로운 커밋을 만드는 것) 사용할 수 있는 명령어는 바로 git rebase -i
이다.
git rebase -i [target HEAD]
를 입력하면 텍스트 에디터가 열리고 합쳐지는(남을) 커밋은 그대로 pick
, 합칠(사라질) 커밋은 squash
로 변경한다.
에디터 저장 및 종료하면(커맨드 :wq
) 커밋 메시지를 수정할 수 있다. 두 번째 커밋내용뿐만 아니라 커밋 메시지도 병합이 되는데 두 번째 커밋 메시지는 주석 처리하면 된다. 이후 다시 저장 및 종료 후에 git log
를 확인하면 커밋 내역이 수정된 것을 확인할 수 있다 !
텍스트 에디터가 열릴 때 주석으로 다른 명령어도 알 수 있어서 필요한 명령어를 참고하면 된다.
이미 푸쉬한 커밋은 강제성을 띠는 -f
옵션을 붙여주면 다시 푸쉬할 수 있다.
참고 자료
Git rebase -i 로 커밋 모두 통합하기
타임터너
git reflog
/git reflog show HEAD
명령어를 통해 로컬 저장소에서 HEAD의 업데이트 기록을 알 수 있다. 브랜치를 삭제했는데 알고 보니 필요했다던가 등의 경우에 HEAD의 기록에는 여전히 남아있어서 원하는 commit hash를 가지고 checkout
할 수 있다. (해당 내용은 .git/object
참고. 깃 저장 방식에 대해서 이해해야 한다...)
로컬에서 작업하다가 엉망진창이 되어가려 할 때 아래의 명령어를 참고할 수 있다.
git reset HEAD^
→ 바로 이전 커밋으로 되돌아가기. HEAD~n
n에 2 이상 숫자를 붙여주면 그에 해당하는 전전, 전전전 등 커밋으로 되돌아갈 수 있다. 필요에 따라 --soft
, --mixed
, --hard
옵션 추가.git commit --amend
→ 커밋 메시지 수정git commit --amend --reset-author
→ 커밋 작성자 수정git clean -f
→ 가끔 추적 중이지 않은(untracked) 파일이 있어 push
가 잘되지 않는다든가 하는 오류가 발생하는데 이때 해당 명령어를 찾아보면 좋다..ignore
이라는 파일을 작업 폴더 내에 생성해서 커밋하고 싶지 않은 파일명을 해당 폴더 안에 작성하면 커밋이 올라가지 않게 된다. 이때 주의할 점은 이미 리모트 저장소에 올라갔다면,
이후 얼른 다시 .ignore
파일을 생성 혹은 수정하고 새로 commit
& push
(❕중요).
git rm -rf <filename>
→ 로컬 & 리모트 브랜치에서 삭제git rm --cached <filename>
→ 리모트 브랜치에서만 삭제git --help
→ ❗️. 깃 매뉴얼. 처음 깃 충돌 해결을 이거 보고 했는데 솔직히 더 친절하게 우리의 모국어인 "한국어"로 알려주는 개발 블로그 정말 많다. 그래도 가끔 막 와이파이 연결 안 되는 상황이 올 수도 있으니까... 🙄git push --delete [branch]
→ 로컬 브랜치 삭제. --delete
는 -d
로 줄일 수 있고, 푸쉬나 merge 하기 전에 강제로 삭제하려면 -D
옵션을 사용할 수 있다. 리모트 브랜치에 대한 명령어는 git push origin --delete [branch]
이다. +)git fetch -p
명령어로 목록 업데이트. 참고git branch set-upstream-to [remote-branch]
or git push -u origin [branch]
→ 로컬과 리모트의 원만한 타겟팅을 위한 커맨드. 참고rm -rf .git
→ 디렉토리 저장소 해제git log --all --decorate --oneline --graph
→ 깃 로그 예쁘게 그려줌. 일명 A DOGgit diff
git branch -m [old-branch-name] [new-branch-name]
→ 브랜치 이름 변경