티스토리 뷰

Commit 한 메시지를 바꾸고 싶으면?

  • git commit --amend -m "new message"
  • git log --oneline => 변경된 메시지가 보임

같은 커밋에 몇 가지 파일을 더 추가하고 싶은면?

  • git add -A
  • git commit --amend -m "new message"

staging에 add했는데 원하지 않을때? (이부분은 git command에서 알려줌)

  • "Use git reset HEAD <file>... to unstage" 메시지 
  • rm <file>
  • git status

push전에 커밋을 지우고 싶을 때? (꼭 푸시전에, 안그러면 다른 사람들은 영향을 받음)

  • git reset <hash>

Reset --hard, --soft, --mixed 차이?

  • git reset --soft HEAD~1
    • 헤드를 바로 뒤로 (~1) 보낸다.
    • 현재 커밋을 staging 상태로 보냄
  • git reset --mixed HEAD~1
    • 헤드를 바로 뒤로 + 현재 커밋을 unstaging 상태로 보냄
  • git reset --hard HEAD~1
    • 헤드를 바로 뒤로 + 변경 사항을 다 지워버림

Reset --hard로 지워진 내용을 살리고 싶으면?

  • git reflog 에서 복구하고 싶은 커밋 해시값을 찾아 git reset --hard <hash>

이미 푸시한 커밋을 undo 하고 싶으면?

  • git revert <hash>
  • 히스토리는 남아있으나 최근 커밋은 사라짐
  • 히스토리가 있다는 것은 커밋을 되돌리면 사라진 내용을 되살릴 수 있다는 것

한 브랜치에서 커밋을 다른 브랜치로 복사하려면?

  • git cherry-pick <hash>
  • 가져오지만 해시값은 달라짐 (복사가 된다는 이야기)

잘못된 브랜치에서 커밋된 걸 옮기는 방법

  • 옮길 브랜치에서 체리픽을 먼저 함
  • 잘못된 브랜치로 가서 git reset <hash>
  • git checkout <file> => reset --hard와 같은 효과이지만 수동으로 직접 리셋할 파일을 지정할 수 있다는 점에서 이런 방식을 선호

로컬에서 수정중에 (커밋전) pulling을 하고 싶을때?

  • 스태시를 하거나 현재 수정중인걸 커밋하거나
  • 스태시하는 법
    • git stash
    • git stash list
  • 가져오기
    • git stash pop => merge conflict => 파일을 수정하면됨
    • 머지 충돌이 일어나면 pop을 해도 스태시에 남아있다
    • git stash drop stash@{0} 스태시 삭제

이전 커밋으로 가서 수정하는 방법?

  • git checkout <hash>를 하면 그 상태로 이동하는데 HEAD가 브랜치에서 떨어진 상태가 된다. => 이 말은 HEAD가 가리키는 브랜치가 없다는 말이다.
  • 우리가 이 상태에 있는 것을 저장하려면 브랜치가 필요하다.
  • 브랜치 생성 git checkout -b my-new-branch
  • git branch -vv =>전체 브랜치 상태를 볼 수 있다.

머지 충돌이 있는 pull request 고치는 법

  • 여러 방법이 있는데, 일단 깃헙에서 pull request를 할 때 conflict가 있다고 뜬다면 pull request를 삭제하거나 진행하지 말고 git merge master를 현재 브랜치에서 먼저 해 충돌을 없앤 뒤 다시 pull request를 한다. (merge conflict를 로컬에서 관리한다)

pull request를 한 뒤 브랜치 삭제하기

  • git remote prune origin --dry-run 브랜치에 원격 브랜치가 연결되어 있다면 (dry-run으로 일단 테스트 한뒤 prune하면 사라진다)
  • 여전히 로컬에서 브랜치가 남아있다
  • git branch -d <branchname> 하면 브랜치 삭제
  • git reflog를 보면 브랜치를 삭제한 해시 상태가 있어서 브랜치를 다시 복구시킬수도 있다.

이전 커밋의 메시지를 변경하고 싶으면?

  • git rebase -i HEAD~3 (위치는 수정하고자 하는 해시의 이전까지)
  • 해당 커밋을 기본 선택된 pick대신 reword로 변경 후 저장
  • 메시지를 변경하면 변경되었다고 알려줌

이미 커밋하고 푸시된 파일 무시하기

  • gitignore에 파일 추가 후 우선 커밋 & 푸시
  • 그래도 푸시한 파일은 보임
  • git rm -r --cached .
  • git add -A
  • 커밋 후 푸시
  • 여전히 히스토리에서는 보이긴하지만 최신 레파지토리에서는삭제됨

이전 커밋에 파일 추가

  • git rebase -i HEAD~1
  • edit
  • git status를 보면 현재 리베이스 진행중이라 뜸
  • git add <file>
  • git commit --amend --no-edit
  • git rebase --continue 리베이스 완료
  • 변경한 커밋의 해시값이 바뀜

리베이스를 하다가 충돌이나는경우

  • 머지를 완료한 뒤 리베이스를 완료할 수 있다.

리베이스 squash

  • 이전 커밋들을 한꺼번에 묶을 수 있다.
  • 리베이스 한 뒤 묶을 커밋들만 squash 로 바꾸고 저장
  • 변경된 커밋 메시지를 볼 수 있음 => 수정후 저장하면 커밋은 변경되어 있다.

깃 히스토리에 푸시된 파일 완전히 삭제하기

  • BFG라는 도구가 있다 ( BFG 설명)
  • BFG jar 파일 다운
  • git clone --mirror [repo url]
  • java -jar ~/Downloads/bfg-1.13.0.jar --delete-files .env my-repo.git
  • git reflog expire --expire=now --all && git gc --prune=now --aggressive
  • git push
댓글