거인의 어깨위에 서려는/트렌디한 개발자를 위한
Git 여러가지 실수에 대처하는 방법
Jane Park
2020. 7. 22. 06:58
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