[Git 활용하기] git reflog, git log, git rebase, git stash, git cherry-pick, git reset, git checkout

soma·2024년 3월 18일

Git

목록 보기
3/7
post-thumbnail

Git 활용하기

git reset 후 돌아오는 방법

reset하기 전 git history커밋아이디 확인한 경우

$ git history
	// 커밋아이디 확인하기

$ git reset --hard [되돌아갈 커밋아이디]

커밋아이디 모르는 경우

// reflog(refernce log) : 헤드가 이때까지 가리켜왔던 커밋들을 기록한 정보가 출력됨

$ git reflog 
	// 커밋아이디 및 HEAD@{} 확인하기
    
$ git reset --hard [되돌아갈 커밋아이디 or HEAD@{}]
** 과거의 커밋으로 reset을 해도 reset한 커밋 그 이후의 커밋들이 삭제되는 것은 아님



커밋 히스토리 보는 방법

git log --pretty=oneline

현재 branch에 해당하는 커밋들만 보임

git log --pretty=oneline --all

현재 branch에 해당하는 커밋들 뿐만 아니라 다른 모든 branch의 커밋 히스토리를 볼 수 있음

git log --pretty=oneline --all --graph

커밋과 branch의 관계를 그래프로 입체적으로 보여줘 커밋 히스토리 파악이 쉬움




깔끔한 커밋 히스토리

git rebase 사용하기

$ git rebase [합칠 브랜치 이름]

// conflit 해결 후 리베이스 계속 진행시키는 커맨드
$ git rebase --continue

mergerebase

  • rebase나 merge나 결과물은 같음
  • merge는 두 브랜치를 합쳤다는 정보가 커밋 히스토리에 남아야 하는 경우 사용
  • rebase는 새로운 커밋을 만들지 않아 커밋 히스토리를 깔끔하게 유지하고 싶은 경우



임시 저장 & 복구 & 삭제, git stash

✅ 임시 저장, git stash

  • 어떤 브랜치에서 하던 작업을 아직 커밋하지 않았는데 다른 브랜치로 가야하는 상황에서 작업 중이던 내용을 잠깐 저장하고 싶을 때 사용하는 커맨드
  • 최근 커밋 이후로 작업했던 내용은 모두 스택에 옮겨지고 working directory 내부는 다시 최근 커밋의 상태로 초기화됨
// working directory에서 작업하던 내용을 깃이 따로 보관(stack)
$ git stash

// 작업 내용 조회(=스택 살펴보기)
$ git stash list

// 다른 브랜치 이동 후 작업

// 다시 작업을 못끝낸 브랜치로 이동
$ git checkout [브랜치 이름]

// stack에 있는 작업 내용을 다시 working directory에 적용
$ git stash apply [작업 내용 아이디]

✅ 복구, git stash apply

  • 잘못된 브랜치에서 작업했을 경우 사용할 수 있음
  1. git stash로 stack에 작업 내용 저장

  2. 올바른 브랜치로 이동 후 다시 git stash apply [작업내용 아이디] 하면 됨

    ** 작업 내용의 아이디를 생략하면 가장 최근의 작업 내용이 적용됨

✅ 제거, git stash drop

  • 이미 적용한 작업 내용은 지워주는게 좋음
  1. git stash list로 조회
  2. git stash drop [작업 내용 아이디]로 제거

✅ 적용 + 제거, git stash pop

  • 작업 내용을 적용하는 동시에 스택에서 제거할 수 있음
  1. git stash pop [작업 내용 아이디]



필요한 커밋만 가져오기

git cherry-pick

원하는 작업이 있는 커밋의 내용만 가져와서 현재 브랜치에 추가하는 커맨드
1. git history --all
2. git cherry-pick [가져오고 싶은 커밋 아이디]
3. conflict 해결
4. git add .
5. git commit -m "Enter commit messages"




여러 커밋을 하나의 커밋으로!

불필요한 커밋을 없애고 싶을 때 사용할 수 있음

git reset --soft

  • --soft 옵션은 HEAD는 이전 커밋을 가르키지만 working directory는 최신 내용 유지

// accd~~ 와 wxyz 커밋을 하나로!
$ git history
abcdcommit id (HEAD -> Branch name) Enter commit messages2
wxyzcommit id Enter commit messages
opqrcommit id Add get_Sum function

// 과거의 커밋으로 리셋이 되면서도 현재 working directory 내용은 그대로!
$ git reset --soft opqr

// working directory 모습은 최신 상태(Enter commit messages2 커밋 내용)
$ git add .

$ git commit -m "Enter commit messages"



원격 저장소와 로컬 브랜치 간에 충돌 해결

  • ! [rejected] main -> main (non-fast-forward) 오류
  • 원격 저장소의 최신 변경 사항이 로컬 브랜치의 최신 변경 사항보다 앞서 있는 경우

✅ 원격 변경 사항 통합 후 다시 푸시하기

원격 저장소의 변경 사항을 로컬로 가져와서 현재 브랜치에 통합한 후 다시 푸시

$ git pull origin main
$ git push origin main

✅ 강제 푸시하기

로컬 브랜치의 변경 사항을 강제로 원격 저장소의 브랜치에 반영함

$ git push -f origin main

❗❗ 강제 푸시는 원격 저장소의 변경 사항을 덮어쓰므로 주의해야 함.
❗❗ 필요한 경우에만 사용하고, 다른 개발자와 협업할 때에는 사용하지 않는 것이 좋음.




삭제한 파일/디렉토리 복구

✅ Git에서 삭제된 파일/디렉토리 복구하기

// 로컬에서 삭제한 파일 복구
// <파일 경로>: 파일 이름 or 디렉토리 이름 
$ git checkout -- <파일 경로>

// 스테이징 영역에서 삭제한 파일을 다시 로컬로 가져올
$ git reset -- <파일 경로>

// 이전 커밋의 상태로 돌아감
$ git revert <commit>

✅ 원격 저장소의 상태로 파일/디렉토리 복구하기

// 원격 저장소에서 다시 내려받음
$ git checkout <브랜치 이름> -- <파일 경로>

예) NewBranch의 모든 파일을 로컬로 가져옴
$ git checkout NewBranch -- .

개발자 필수 지식 Git이 뭔데?

profile
배움의 기록을 차곡차곡

0개의 댓글