1. 개요
git rebase 는 특히 다중 개발자 코드 리포지토리의 경우 깨끗한 코드 커밋 기록을 작성하는 데 권장되는 모범 사례입니다. 이 작업을 수동으로 수행한 후 나중에 원래 상태로 돌아가고 싶다는 것을 깨닫게 될 수 있습니다.
이 사용방법(예제)에서는 git rebase 작업 을 실행 취소하는 몇 가지 기술을 살펴 보겠습니다.
2. 설정
여러 분기가 있는 다중 개발자 코드 리포지토리를 시뮬레이션하는 테스트 베드를 만들어 보겠습니다 . 우리는 개발 분기가 모든 개발자가 기능별 분기를 사용하여 특정 기능에 대해 작업하는 데 사용하는 프로젝트의 단일 소스 라고 가정할 수 있습니다 .
이제 프로젝트에 대해 위의 버전 관리가 준비되었다고 가정하고 feature2 브랜치를 확인하겠습니다.
$ git branch --show-current
feature2
마지막으로 feature1 및 feature2 분기 에 대한 코드 커밋 기록을 살펴보겠습니다 .
$ git log feature1
commit e5e9afbbd82e136fc20957d47d05e72a38d8d10d
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:27:22 2022 +0530
Add feature-1
commit 033306a06895a4034b681afa912683a81dd17fed
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:27:22 2022 +0530
Add .gitignore file
$ git log feature2
commit 9cec4652f34f346e293b19a52b258d9d9a49092e
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:27:22 2022 +0530
Add feature-2
commit 033306a06895a4034b681afa912683a81dd17fed
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:27:22 2022 +0530
Add .gitignore file
다음 섹션에서는 이 기본 시나리오를 반복적으로 사용하여 git rebase 를 수행 한 다음 rebase 작업을 실행 취소하기 위해 한 번에 하나의 접근 방식을 적용합니다.
3. ORIG_HEAD 사용
깨끗한 시나리오로 feature2 브랜치 의 현재 커밋을 확인하는 것으로 시작하겠습니다 .
$ git log HEAD
commit 728ceb3219cc5010eae5840c992072cac7a5da00 (HEAD -> feature2)
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
commit 6ed8a4d2a961fdfc4d5e4c7c00b221ed6f283bf4 (development)
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add .gitignore file
이제 feature1 브랜치 위에 feature2 브랜치를 리베이스해 보겠습니다 .
$ git rebase feature1
리베이스 작업을 수행한 후 HEAD 참조를 살펴보겠습니다.
$ git log HEAD
commit 9d38b792d0c9a8d0cd8e517fcb2ca5260989cc4a
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
commit 1641870338662a016d5c8a17ef5cada0309f107e
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-1
commit 6ed8a4d2a961fdfc4d5e4c7c00b221ed6f283bf4
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add .gitignore file
또한 ORIG_HEAD 가 여전히 728ceb3219cc5010eae5840c992072cac7a5da00 커밋 을 가리키고 있는지 확인할 수 있습니다 .
$ git log ORIG_HEAD
commit 728ceb3219cc5010eae5840c992072cac7a5da00
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
commit 6ed8a4d2a961fdfc4d5e4c7c00b221ed6f283bf4
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add .gitignore file
마지막으로 ORIG_HEAD 참조 를 사용하여 재설정 합니다 .
$ git reset --hard ORIG_HEAD
$ git log HEAD -1
commit 728ceb3219cc5010eae5840c992072cac7a5da00
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 16:46:56 2022 +0530
Add feature-2
그게 다야! ORIG_HEAD 의 도움으로 리베이스 작업을 성공적으로 되돌렸습니다 .
4. git reflog 사용
다시 한 번 새로운 시나리오 설정부터 시작하겠습니다.
$ git log HEAD
commit 07b98ef156732ba41e2cbeef7939b5bcc9c364bb
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-2
commit d6c52eb601e3ba11d65e7cb6e99ec6ac6018e272
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 17:53:35 2022 +0530
Add .gitignore file
이제 리베이스를 수행하고 커밋 기록을 확인하겠습니다.
$ git rebase feature1
$ git log HEAD
commit b6ea25bf83ade2caca5ed92f6c5e5e6a3cb2ca7b
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-2
commit d2cabe48747699758e2b14e76fb2ebebfc49acb1
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-1
commit d6c52eb601e3ba11d65e7cb6e99ec6ac6018e272
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 17:53:35 2022 +0530
Add .gitignore file
다음으로 git reflog 명령을 사용 하여 세분화된 수준에서 이벤트 기록을 검사해 보겠습니다 .
$ git reflog
b6ea25b HEAD@{0}: rebase (continue) (finish): returning to refs/heads/feature2
b6ea25b HEAD@{1}: rebase (continue): Add feature-2
d2cabe4 HEAD@{2}: rebase (start): checkout feature1
07b98ef HEAD@{3}: commit: Add feature-2
d6c52eb HEAD@{4}: checkout: moving from feature1 to feature2
d2cabe4 HEAD@{5}: commit: Add feature-1
d6c52eb HEAD@{6}: checkout: moving from development to feature1
d6c52eb HEAD@{7}: Branch: renamed refs/heads/master to refs/heads/development
d6c52eb HEAD@{9}: commit (initial): Add .gitignore file
우리는 git 이 rebase 작업 전 HEAD의 위치가 HEAD@ {3} 참조로 표시되는 세분화 된 수준 에서 참조를 내부적으로 유지한다는 것을 알 수 있습니다 .
따라서 마지막 단계로 git reset 을 수행하여 이전 상태를 복원해 보겠습니다 .
$ git reset --hard HEAD@{3}
$ git log HEAD
commit 07b98ef156732ba41e2cbeef7939b5bcc9c364bb
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 17:53:35 2022 +0530
Add feature-2
commit d6c52eb601e3ba11d65e7cb6e99ec6ac6018e272
Author: Tapan Avasthi <tavasthi@Tapans-MacBook-Air.local>
Date: Sun Jul 31 17:53:35 2022 +0530
Add .gitignore file
엄청난! 우리는 이 접근법도 성공적으로 배웠습니다. 그러나 이 접근 방식은 git의 하위 수준 세부 정보를 사용하므로 고급 git 사용자만 사용해야 합니다.
5. 결론
이 기사에서는 git 리포지토리에 대한 테스트 시나리오를 사용하고 git rebase 작업을 실행 취소하는 두 가지 인기 있는 기술에 대해 배웠습니다.