티스토리 뷰
Git에는 작업한 것을 되돌리는 방법이 있다.
- (낮은 수준)Staging Area에 있는 작업을 되돌리기 (아마도..?)
- (높은 수준)실제 변경이 복구되는 방법
여기서는 실제 변경을 복구하는 방법에 대해서 알아보자.
git에서 변경한 내용을 되돌리는 방법은 크게 2가지가 있다.
- git reset
- git revert
git reset
git reset은 브랜치가 예전의 커밋을 가리키도록 이동시키는 방식으로 변경 내용을 되돌린다. 즉, git reset은 마치 애초에 커밋하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 것이다.
사용 방법
- git reset <옮겨갈 커밋 위치>
사용 예제
local은 로컬에만 존재하는 브랜치이고 pushed는 리모트 브랜치이다.
$git reset HEAD^
위의 명령어를 사용하면 현재위치(브랜치: local, 커밋: C3)에서 부모인 C1으로 현재 브랜치인 local의 위치가 옮겨지고 C3 커밋 내역이 사라진다
git revert
만약 커밋을 되돌리고 싶은 브랜치가 로컬 브랜치가 아닌 리모트 브랜치라면 git reset이 아닌 git revert를 사용해야 한다.
사용 방법
- git revert<되돌릴 커밋>
- 해당 커밋의 내용을 되돌린다
- git revert <되돌릴 커밋n..되돌릴 커밋1>
- 마지막 커밋만이 아니라 여러 개의 커밋을 되돌리고 싶을 때 사용한다
- 만약 커밋을 시간순서대로 C1, C2, C3, C4(C4가 마지막 커밋)를 했고 C2~C4의 커밋을 되돌리고 싶다면 git revert C1..C4을 사용하면 된다
- git revert <머지커밋> -m <부모커밋 번호>
- 만약 되돌리고 싶은 커밋이 머지에 대한 커밋이라면 위의 명령어를 사용해야 한다
- git log 명령어를 사용하면 커밋 히스토리를 조회할 수 있는데 이 때 머지된 시점의 커밋을 보면 ‘Merge: 부모1해시값 부모2해시값’에 대한 정보가 나온다.
- 이 때 머지된 커밋을 되돌릴 때 어느시점의 부모로 돌아갈지 선택할 수 있는데 부모1로 돌아가고 싶다면 -m 1, 부모2로 돌아가고 싶다면 -m 2를 사용하면 된다
- 아래처럼 커밋 정보가 있고 b786c47 부모의 위치로 되돌리고 싶다면 git revert 70b4bb884a64a939b08463a469ce467799a67bac -m 1 이라고 사용하면 된다.
사용 예제
1. git revert <되돌릴 커밋>
$git revert HEAD
위의 명령어를 사용하면 현재 위치인 C5의 커밋 내역을 되돌린다(되돌린 내용인 C5’가 생겼다)
2. git revert <되돌릴 커밋n..되돌릴커밋1>
$git revert HEAD~3..HEAD
위의 명령어를 사용하면 HEAD~3(C1)의 다음 커밋부터(C2) HEAD(C5)까지의 커밋 내역을 되돌린다.
그러면 역으로 각 커밋을 되돌린 내역인 C5’, C4’, C2’ 커밋들이 생성된다.
3. git revert <머지커밋> -m <부모커밋 번호>
$git revert C6 -m 1
만약 머지 커밋인 C6의 부모 정보가 C5 C3 순으로 나왔다면 위의 명령어를 사용하면 머지 내역을 되돌려서 최종 상태가 C5의 상태와 같아지게 된다
목표
local 브랜치와 pushed 브랜치에 있는 최근 두 번의 커밋을 되돌리기
$git reset HEAD^
$git checkout pushed
$git revert HEAD
'Git' 카테고리의 다른 글
[코드 이리저리 옮기기] 2: 인터랙티브 리베이스 소개 (0) | 2023.11.04 |
---|---|
[코드 이리저리 옮기기] 1: Cherry-pick 소개 (0) | 2023.11.04 |
[다음 단계로] 3: 상대 참조 #2 (~) (0) | 2023.10.28 |
[다음 단계로] 2: 상대 참조 (^) (Relative Refs) (1) | 2023.10.28 |
[다음 단계로] 1: HEAD 분리하기 (0) | 2023.10.28 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크