안녕하세요.
#yeoneeblog 여니입니다 :)
git add 취소하기, git commit 취소하기, git push 취소하기
1. git add 취소하기 (파일 상태를 Unstage로 변경하기)
한번쯤 아래와 같은 실수로 git add * 명령을 사용하여 모든 파일을 Staging Area에 넣은 경우,
Staging Area(git add 명령 수행한 후의 상태)에 넣은 파일을 빼고 싶을 때가 있을 것입니다.
// 모든 파일이 Staged 상태로 바뀐다.
$ git add *
// 파일들의 상태를 확인한다.
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
이때, git reset HEAD [file] 명령어를 통해 git add를 취소할 수 있습니다.
뒤에 파일명이 없으면 add한 파일 전체를 취소합니다.
ex) CONTRIBUTING.md 파일을 Unstaged 상태로 변경해봅시다.
// CONTRIBUTING.md 파일을 Unstage로 변경한다.
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
git reset HEAD [file] 명령어를 통해 add했던 파일을 취소했습니다.
// 파일들의 상태를 확인한다.
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
그리고 파일의 상태를 확인해보니,
"커밋을 위해 준비되지 않은 변경 사항:
(커밋할 내용을 업데이트하려면 "git add <file>..."을 사용하세요)"라는 문구가 뜨며 해당 파일이 Unstaged상태로 변경되어 다시 add 할 수 있도록 변경되었습니다.
2. git commit 취소하기
누구나 한번쯤 완료한 commit을 취소해야할 때가 있었을 것입니다.
먼저 commit 목록을 확인해봅니다.
// commit 목록 확인
$ git log
방법1 - 너무 일찍 commit한 경우, 방법2 - 어떤 파일을 빼먹고 commit한 경우
가 있으며, 방법2의 경우에는 git reset HEAD^ 명령어를 통해 git commit을 취소할 수 있습니다.
// [방법 1] commit을 취소하고 해당 파일들은 staged 상태로 워킹 디렉터리에 보존
$ git reset --soft HEAD^
// [방법 2] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에 보존
$ git reset --mixed HEAD^ // 기본 옵션
$ git reset HEAD^ // 위와 동일
$ git reset HEAD~2 // 마지막 2개의 commit을 취소
// [방법 3] commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에서 삭제
$ git reset --hard HEAD^
commit message 변경하기
commit message를 잘못 적은 경우, git commit –amend 명령어를 통해 git commit message를 변경할 수 있습니다.
$ git commit --amend
TIP) git reset 명령은 아래의 옵션과 관련해서 주의하여 사용해야 합니다.
[ reset 옵션 ]
–soft : index 보존(add한 상태, staged 상태), 워킹 디렉터리의 파일 보존. 즉 모두 보존.
–mixed : index 취소(add하기 전 상태, unstaged 상태), 워킹 디렉터리의 파일 보존 (기본 옵션)
–hard : index 취소(add하기 전 상태, unstaged 상태), 워킹 디렉터리의 파일 삭제. 즉 모두 취소.
TIP) 만약 워킹 디렉터리를 원격 저장소의 마지막 commit 상태로 되돌리고 싶으면, 아래의 명령어를 사용합니다.
단, 이 명령을 사용하면 원격 저장소에 있는 마지막 commit 이후의 워킹 디렉터리와 add했던 파일들이 모두 사라지므로 주의해야 합니다.
// 워킹 디렉터리를 원격 저장소의 마지막 commit 상태로 되돌린다.
$ git reset --hard HEAD
3. git push 취소하기
이 명령을 사용하면 자신의 local의 내용을 remote에 강제로 덮어쓰기를 하는 것이기 때문에 주의!!해야 합니다.
되돌아간 commit 이후의 모든 commit 정보가 사라지기 때문에 주의해야 합니다.
특히, 협업 프로젝트에서는 동기화 문제가 발생할 수 있으므로 팀원과 상의 후 진행하는 것이 좋습니다.
1. 워킹 디렉터리에서 commit 되돌립니다.
가장 최근의 commit을 취소하고 워킹 디렉터리를 되돌립니다.
원하는 시점으로 워킹 디렉터리를 되돌립니다.
// 가장 최근의 commit을 취소 (기본 옵션: --mixed)
$ git reset HEAD^
원하는 시점으로 워킹 디렉터리를 되돌립니다.
// Reflog(브랜치와 HEAD가 지난 몇 달 동안에 가리켰었던 커밋) 목록 확인
$ git reflog 또는 $ git log -g
// 원하는 시점으로 워킹 디렉터리를 되돌린다.
$ git reset HEAD@{number} 또는 $ git reset [commit id]
2. 되돌려진 상태에서 다시 commit을 합니다.
$ git commit -m "Write commit messages"
3. 원격 저장소에 강제로 push 합니다.
$ git push origin [branch name] -f
또는
$ git push origin +[branch name]
// Ex) master branch를 원격 저장소(origin)에 강제로 push
$ git push origin +master
+ TIP) 경고를 무시하고 강제 push하기
[방법 1] -f 옵션
–force 옵션과 동일하다.
[방법 2] +[branch name]
해당 branch를 강제로 push한다.
즉, -f 혹은 + 붙일 경우 강제 push가 가능합니다.
untracked 파일 삭제하기
git clean 명령은 추적 중이지 않은 파일만 지우는 게 기본 동작이다. 즉, .gitignore 에 명시하여 무시되는 파일은 지우지 않는다.
$ git clean -f // 디렉터리를 제외한 파일들만 삭제
$ git clean -f -d // 디렉터리까지 삭제
$ git clean -f -d -x // 무시된 파일까지 삭제
TIP) option
1. -d 옵션
디렉터리까지 지우는 것
2. -x 옵션
무시된 파일(.DS_Store나 .gitignore에 등록한 확장자 파일들)까지 모두 지우는 것
ex) .o 파일 같은 빌드 파일까지도 지울 수 있다.
3. -n 옵션
가상으로 실행해보고 어떤 파일들이 지워질지 알려주는 것
$ git clean -n -d
Would remove build.TMP
Would remove tmp/
$ git clean -n -d -x
Would remove build.TMP
Would remove test.o
Would remove tmp/
commit 취소하고 다시 push해보기
내가 작업한 파일을 add . 하여 commit -m "String, substring"으로 잘못 커밋&push했습니다.
그래서 git reset HEAD^를 입력 후, 다시 git init 해준뒤, git add .하여 내가 커밋할 파일을 저장해줍니다.
그리고 git commit -m "DataType"이라고 다시 커밋해준 뒤, git push origin master -f으로 강제 push 해주었습니다.
올바르게 DataType으로 커밋된 모습입니다.
+ 참조사이트