Git 되돌리기 (부제: revert, reverse)

이번에는 되돌리기 두번째 revert에 관해 알아보려고 한다.

The difference between Reset and Revert
- reset은 버전을 지우지만, revert는 버전을 유지한다.
- reset은 선택한 버전으로 돌아가지만, revert는 선택한 버전의 변경사항을 반대로 수행해서 이전의 버전으로 돌아간다.
- reset은 mode에 따라 다르지만, revert는 Working Directory에 영향을 주지 않는다.

Precautions for Revert
- 선택한 버전을 revert할 때 순차적으로 하지 않고 여러 버전을 건너뛰면 conflict가 발생할 수 있다.

Understanding Revert
1. pending files에  README.md 파일이 있는 것을 보면, 이전 버전에는 없던 README.md 파일이 추가되었고 그 내용은 'this is git!'임을 알 수 있다. 만약 README.md 파일이 추가되기 전의 버전으로 돌아가고 싶다면 revert(reverse)를 이용하면 된다.


2. revert 하려는 버전을 우클릭하고  Reverse commit...  을 클릭한다.


3. reverse 확인 창이 뜨면  Yes 를 클릭한다.


4. revert 가 완료되어서 README.md 파일이 삭제되었다.


5. revert 전의 Working Directory 파일들이다.


6. revert(reverse)는 Working Directory에 영향을 주지 않는다.



Revert in sequence several times & Why use the word "Revert"?
최근 커밋부터 순서대로 Revert를 하면서, Revert의 의미를 이해해보자.

1. "hello 추가" 버전을 현재 버전으로 적용하기 위해, 앞선 예제에서 한 Revert "this is git"에 이어서 Revert "3'rd commit"과 Revert "version control system 추가"를 수행하였다. (적용하려는 버전 이후의 버전을 모두 최신 순서부터 revert)


2. 1번의 버전 : "version control system 추가"와 비교하면 버전: Revert "version control system 추가"는 오른쪽 아래 소스코드에서 알수 있는 것처럼  + 와  - 가 반대(revert)다.



Non-sequential and non-continuous Revert : Merge conflict occured
최근 커밋부터 Revert하는 도중 중간에 커밋을 건너뛰면 어떻게 되는 지 알아보자.

1. 바로 이전의 Revert in sequence several times & Why use the word "Revert"?에 이어서 revert "hello 추가"를 건너뛰고 revert "wow.java 추가"를 하면 어떻게 될지 보자.


2. "wow.java 추가" 버전을 우클릭하여  Reverse commit...  을 클릭한다.


3. Merge Conflicts가 발생하였다. Working Directory에서 Merge Conflicts가 발생하여 revert하기 전에 해결해야한다. Merge Conflicts가 발생한 파일을 선택하여 'Resolve Conflicts' 옵션을 사용하면 해결이 가능하다. 일단은  닫기(C) 를 클릭하자.


4. 소스코드가 실제로 변경되지는 않았지만 Merge Conflicts가 발생하면서 외부 영향으로 파일이 변경되었다는 알림창이 발생했다. 원래는 revert 하면 Working Directory의 파일들은 영향을 받지 않는다.


5. 'Uncommitted changes(커밋하지않은 변경사항)'가 존재한다. 4번에서 Working Directory 파일이 변경되었음을 입증하는 것이다. Staged&Unstaged files에서 wow.java 파일이 Merge Conflicts의 원인임을 알 수 있다. stage에 올라가 있는 파일과 unstaged 상태인 Working Directory에 있는 파일이 stage에 올라가려다가 발생한 문제로 추정된다. 오른쪽아래 소스코드 부분에  no changes in this file have been detected, or it is a binary file 이라고 표시되어 있다. 파일의 변경사항이 검색되지 않았거나 바이너리 파일이라는 뜻인데 stage의 파일과 unstaged 상태의 파일이 똑같아서 그렇다.


6. 3번에서 제시한 해결 방법에 따라 Merge Conflicts가 발생한 파일을 우클릭하고  Resolve Conflicts  옵션을 클릭한다.  Resolve Using 'Mine'  과  Resolve Using 'Theirs'  중에 하나를 클릭한다.


7-1.  Resolve Using 'Mine'  클릭한 경우)
해당 files의 Merge Conflicts를 해당 커밋을 이용해서 해결할 것인지 확인하는 창이 뜬다.  OK 를 누른다.


7-2.  Resolve Using 'Theirs'  클릭한 경우)
 Resolve Using 'Mine'  과의 차이점은 없다. 내부적으로 다른 점이 있는 지, 현재 다른 브런치가 없어서 그런 것인지 모르겠다.


8-1.  Resolve Using 'Mine'  클릭한 경우) 
7번에서 확인한 commit: f0752b0...(생략) 버전으로 index가 바꼈다.


8-2.  Resolve Using 'Theirs'  클릭한 경우)
 Error  가 발생한다. 'Could not update one or more files, please check that no other application is locking your files.' 7-2에서 확인한 커밋 버전의 파일로 현재 인덱스를 업데이트하는데 실패해서 다른 어플리케이션이 파일을 lock 중인지 확인해보라는 에러 메시지다. 파일을 lock 중인 앱이 없으므로 다른 문제가 존재한다는 것이다. 하지만 그 원인을 아직 알아내지 못하고  Resolve Using Mine'  으로 다시 해결해두었다.
-> Resolve Using 'Theirs' 옵션은 branch끼리 merge할 경우에 사용가능하다고 추측한다. 아래의 설명과 같이 'Theirs'는 병합하려는 다른 브랜치의 파일을 사용하여 해결하는 옵션인데, 지금은 하나의 브랜치에서 revert하는 중에 오류가 발생했기 때문이다.


+ 'Mine'과 'Theirs'의 차이가 무엇인지 직관적으로 알수있었지만 무의식적으로 프로젝트에 적용하다가 문제가 될까봐 찾아봤다. v4브랜치를 Develop브랜치에 merge하는 상황으로 설명한다. 당연히 현재 브랜치는 Develop이다. ; current branch=checkout(=HEAD) ; 여기서  마지막에 커밋된 스냅샷인 HEAD는 애매한듯
Mine == 현재 브랜치의 파일을 사용하여 해결
Thires == 현재 브랜치에 병합하려는 다른 브랜치의 파일을 사용하여 해결
https://community.atlassian.com/t5/Git-questions/Resolve-using-quot-theirs-quot-vs-quot-mine-quot-what-is-the/qaq-p/393422
Resolve Using 'Mine' vs 'Theirs' - What is the difference?

Hi I'd just like to point out that Henrique's answer is incorrect for SourceTree 2.5.2 (current as of June 2017) per my understanding and experience (perhaps I misunderstood). This is a git repo.
Here is the state before merge: branch v4 has all the new stuff, branch develop is behind. I'm merging v4 into develop.
Current branch: develop
Merge v4 -> Develop

Mine == Use the file as it is in Develop, ie. the same branch I am in
Theirs == Use the file as it is in v4, ie. the branch I am not in







댓글

이 블로그의 인기 게시물

AWS RDS DB 인스턴스에 연결하기 (Oracle Database Instance)

tomcat server.xml ( 톰캣 서버 설정 )

Git resolving merge conflicts as Mark resolved (mark resolved 옵션으로 해결)