revert : 특정 commit 취소하기.
revert: 되돌리다.
git revert [취소할 commit id (hash value)]
는 repository에 반영된 내용을 취소해야 하는 경우 사용됨.
- 취소를 시키고 취소된 상태의 새로운 commit을 추가하는 방식임. : 취소되는 commit도 log에서 확인 가능함.
- 이 부분이 아예 취소되는 commit를 log에서도 삭제해버리는
reset
과의 가장 큰 차이점임.reset
은 되돌아갈 commit의commit id
(=hash value)를 인자로 넘겨줌.revert
는 취소시킬 commit의commit id
를 인자로 넘겨줌.
- remote repository로 공동작업자와 같이 작업하는 경우,
reset
이 아닌revert
로 commit을 취소 시켜야 함.
자동으로 commit이 이루어지는데, repository에서 특정 commit을 취소시키고 이전 상태로만 돌아가려면 (즉, commit만 하지 않으려면) 다음과 같이 --no-commit
옵션을 준다.
git revert --no-commit [취소할 commit id (hash value)]
- 이 경우,
revert
하고 나서 다른 수정을 하고 나서 commit를 할 수 있음.
예제.
1. git_ex_revert
라는 directory를 만들고 해당 디렉토리 안에서 git init
을 수행한다.
2. test00.txt
파일을 해당 directory 내에 만들고 내용을 다음과 같이 함.
# 최초 내용.
이 파일은 revert로 돌아올 때 확인할 수 있는 file임.
3. git add test00.txt
를 통해 stage로 이동시키고, git commit -m "first commit"
를 수행하여 repository로 이동시킴.
4. test01.txt
파일을 추가하고 해당 파일의 내용은 다음과 같이 함.
# content
두번째 commit에 추가되는 파일임.
5. git add test01.txt
를 통해 stage로 이동시키고, git commit -m "second commit"
를 수행하여 repository로 이동시킴.
6. test01
.txt` 파일을 다음과 같이 새로운 내용을 추가하여 저장.
# content
두번째 commit에 추가되는 파일임.
# modified
세번째 commit에서 수정된 부분임.
7. git add .
를 통해 stage로 이동시키고, git commit -m "third commit"
를 수행하여 repository로 이동시킴.
8. git log
를 수행하여 두번째 commit에 대한 commit id
를 얻어온다 :
d20e2899b05d18b8fa37ff56bea56e419feaa47b
라고 가정.
9. git revert d20e2899b05d18b8fa37ff56bea56e419feaa47b
를 수행한다.
9번을 수행하며 , CONFLICT
가 발생한다. 메시지는 다음과 같다.
❯ git revert d20e2899b05d18b8fa37ff56bea56e419feaa47b
CONFLICT (modify/delete): test02.txt deleted in parent of d20e289 (sencond commit) and modified in HEAD. Version HEAD of test01.txt left in tree.
error: could not revert d20e289... sencond commit
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git revert --continue".
hint: You can instead skip this commit with "git revert --skip".
hint: To abort and get back to the state before "git revert",
hint: run "git revert --abort".
❯
- 앞서
revert
로 두번째 commit을 취소하면,test01.txt
가 없는 첫번째 commit으로 되돌려지고,
이 후 네번째 commmit이 이루어져야 한다. - 문제는 세번째 commit에서
test01.txt
에 수정을 했는데,
두번째 commit을 취소키기 위해
git은test01.txt
를 삭제하여 첫번째 commit와 동일한 상태로 네번째 commit을 하려고 시도함. - 이 시도는 해당 세번째 commit에서 해당 파일을 고친 내용과 충돌(conflict)이 됨.
- 때문에 이를 해결(resolving conflicts)하고나서
해결된 working tree를 stage로 올린(mark them with ...) 후에git revert --continue
를 수행하라는 메시지가 뜨게 됨.
일반적으로 conflict가 발생하지 않는 경우엔 그냥 잘 되었다는 메시지가 뜨지만,
생각보다revert
의 경우 conflict가 자주 발생한다.
때문에 예제에서 conflict가 발생하도록 한 것임.
10. confilct 문제를 일으키는 test01.txt를 git rm test01.txt
로 삭제하고 이를 stage에 반영시켜 conflict를 해결한다.
11. 이 후 git revert --continue
를 수행한다.
위의 예는 revert
를 하는 간단한 예제이며, conflict를 해결하는 방법을 소개하고 있다.
제대로 수행하면 다음과 같은 메시지가 보임.
❯ git rm test01.txt
rm 'test01.txt'
❯ git revert --continue
[main 2f66ee0] Revert "sencond commit"
1 file changed, 7 deletions(-)
delete mode 100644 test02.txt
'utils > git and github' 카테고리의 다른 글
[git] stash : 현재 작업을 임시 저장 (1) | 2023.12.31 |
---|---|
[git] branch : branch를 생성하거나 확인 또는 삭제 및 변경 (0) | 2023.12.30 |
[git] .gitignore : 특정 resources를 git으로부터 격리. (1) | 2023.12.30 |
[github] ssh 키 등록하기. (0) | 2023.12.27 |
[ssh-keygen] ssh 관련 private key와 public key 생성하기. (0) | 2023.12.27 |