안녕하세요.
Hynn 입니다.
이번 포스팅에서는 이전에 Git 에 대한 기본 사항을 다루었습니다.
이번 포스팅에서는 Git 의 핵심기능이 되는 Commit 과 Branch 를 조금 더 조작하는 방법에 대해서 학습해보도록 하겠습니다.
이러한 기본사항들을 다루고 나면, 이제 Github 와 연동하는 방법도 다룰 수 있게 될 것이라고 생각합니다.
===========
1. Commit/Branch 조작하기
2. Reset/Revert
3. Merge / Rebase
===========
1. Commit/Branch 조작하기
Commit 이야말로, 이전 포스팅에서도 언급했지만, Git 에서 가장 핵심적인 기능이라고 해도 과언이 아닙니다.
Git 을 사용하는 가장 중요한 이유는, 이전에도 언급했듯이, VCS 의 핵심 기능인, 버전(Commit) 별로 파일의 변경사항을 추적하고, 변경사항 이전의 단계로 돌릴 수 있는 기능이 가장 핵심적입니다.
가령, 자신이 작업한 파일에 약 1,000개의 Commit 이 존재한다고 가정했을때, 단계적으로 작업을 하던 중 1,003번째의 Commit 을 하려는 도중, 파일의 심각한 결함이 발견되어 이전으로 돌아가야만 하는 상황이 발생하였다고 가정했을 때, 작성자가 일일히 코드를 확인하지 않아도, Commit 의 이전 단계로 돌아가는 기능이 있다면, 개발자로서는 작성한 코드가 안타깝더라도, 전체적 작업의 성공을 위해서는 꼭 돌아가야만 하는 상황이 발생할 수도 있습니다.
이를 로컬에서 구현한 것이 바로 Git 의 Commit 입니다. 이를 Github 와 결합하면 더욱 더 막강한 기능이 되겠지만, 지금의 포스팅 단계에서는 Local 을 기준으로 "학습" 하는것이 우선되기 때문에, 그에 대해서는 Github 포스팅에서 다시 다룰 예정입니다.
이를 수정하기 위한 명령어는 다양한 것이 존재하지만, 여기서는 네가지를 중점적으로 사용할 예정입니다.
git merge
git rebase
git reset
git revert
2. Reset/Revert
먼저 이 두개의 차이점을 이해한다면, 작성자가 어떠한 의도를 가졌는지에 따라 적합한 명령이 결정됩니다.
이 두 명령어의 차이점은 아래와 같습니다.
- Reset : Commit 을 취소합니다 사이의 데이터는 유실됩니다.
- Revert : Commit 의 내용을 되돌립니다. 사이의 데이터는 유지됩니다.
위의 설명만 놓고보면, Reset 이 보다 파괴적인 방법으로 보일 수 있습니다.
하지만 이전의 Git 의 동작개념에 맞추어 설명하면 보다, 편리하게 이해할 수 있습니다.
Reset 을 먼저 살펴보도록 하겠습니다.
이 Reset 명령에는 3가지의 Option 기능이 포함됩니다.
- hard : 데이터를 삭제하고 Working Directory 와 Repository 를 일치시킵니다.
- soft : 데이터를 삭제하고 사이 데이터를 Staging Area 로 이동합니다.
- mixed : 데이터를 삭제하고 Working Directory 로 이동합니다.
테스트 용으로 Commit 을 4개 가량 생성해보도록 하겠습니다.
이제 여기서 작성자가, Commit 중 Test2 를 기준으로 삭제하려고 합니다.
이러한 경우, 각각의 차이를 사진으로 설명드리도록 하겠습니다.
먼저 Hard 의 결과물입니다.
명령어 구조는 아래와 같습니다.
git reset --[옵션명] hash value
즉 여기서 hard 를 사용하고, test2 의 hash 값을 대입하면 아래와 같습니다.
git reset --hard d76296b64215f62b88b5f6afb10eeb1aad25786d
이렇게 될 경우, "test2" 로 돌아가게 되고, 현재시점과, test 2 사이의 데이터인, "test3" , "test4" 는 삭제가 됩니다.
Working Directory , Staging Area, Repository 에도 남아있지 않게됩니다.
반면에 soft 의 경우, 동일한 명령을 사용할 경우, 데이터가 "Staging Area" 에 남기는 하지만, 표현은 동일하게 표시됩니다. Mixed 역시 마찬가지 입니다.
하지만 명령에는 의도치않은 상황으로 인해 취소해야 하는 상황이 발생할 수 있습니다.
이럴때 먼저 확인해야 할 사항이 존재합니다.
바로 아래의 명령어를 사용하는 것입니다.
git reflog
바로, 작성자가 reset 을 이용해서 commit 을 삭제한 기록을 확인할 수 있습니다.
여기서 이제 삭제에 관여된 "hash" 를 확인해서 복구를 시작해야 합니다.
지금 위의 코드를 예시를 보면 "be1f304" 을 기준으로 복구를 하도록 하겠습니다.
현재의 GitGraph 상태를 아래와 같습니다.
git reset be1f304
복구가 완료되었습니다. reset 은 이런형태로, 사이의 데이터를 자르는 형태가 될 수 도 있지만, 복구를 하기도 하기때문에, 이 명령어 모두를 잘 기억하고 사용해야 합니다. 하지만 revert 는 다른 형태의 방식으로 동작됩니다. 위에서 언급한 차이점을 보기에도 실제 예제를 보는것이 가장 이해가 빠를 것이라고 생각됩니다.
git revert d76296b64215f62b88b5f6afb10eeb1aad25786d
역시 위에서 언급한대로 "Test 2" 를 기준으로 작성하게 되면, Reset 과 다르게 기존의 "Commit History" 를 모두 유지한 상태에서 Test 2 를 최 상단으로 추가합니다.
이 Revert 의 장점은 Reset 처럼 사이의 Commit 들을 삭제하는 경우, "Github" 원격 저장소의 데이터와 틀어지게 되는 경우가 발생할 수 있어, 주의가 필요한 반면, Revert 는 기존의 Commit 을 유지하기때문에, 이러한 점에서는 제약이 다소 없을 수 있습니다.
하지만 이는 전적으로 상황에 맞게 사용해야 합니다.
이 revert 의 동작 방식은 Log 에서도 확인할 수 있습니다.
3. Merge / Rebase
Merge 와 Rebase 는 위의 Delete, Copy and paste 같은 형태와는 조금 다른 명령입니다.
이를 각각 살펴보도록 하겠습니다.
임의의 테스트를 위해 여러 Commit 을 여러명의 Branch 로 나누어 구성했습니다.
참고로 Branch 생성과, Branch 전환은 Remind를 위해 아래의 명령을 사용합니다.
1) Branch 생성
git branch [생성할 branch명]
2) Branch 전환
git switch [branch명]
여기서 먼저 다루어 볼 명령어는 Merge 입니다.
이 Merge 는 단어 그대로, 병합하는 기능입니다. 여기서는 Branch 가 되겠습니다.
즉 작업자의 Commit 을 병합하는 형태의 작업이 될 것입니다.
여기서 먼저 알아두어야 할 것은 "기준"이 되는 Branch 로 Switch 를 하고 난 상태에서 시작해야 합니다.
여기서의 기준은 "Main" 을 기준으로 진행해보도록 하겠습니다.
테스트를 위해 "Hynn" Branch 와 Main 을 병합해보도록 하겠습니다.
git merge hynn
가장 상단에 나타나는 "Merge branch "Hynn" 이 Commit 에 남고, Branch 가 병합된다는 의미입니다.
이 경우 상단의 #이 붙지 않은 영역을 수정하면 Commit Message 가 그에 맞게 수정됩니다. 여기서는 테스트를 위해 제 블로그 주소를 남겨보도록 하겠습니다.
Merge 가 이루어짐과 동시에 GitGraph 에서도 제가 작성한 제 블로그 주소가 Commit Message 로 변경된 것을 볼 수 있습니다.
아주 간단하게 처리가 이루어집니다.
만약 이를 복구하기 위해서는, 위에서 언급한 reset 을 이용해 Merge 이전의 hash 값을 사용하여 되돌려야 합니다.
하지만 Commit 을 병합할때는 --abort 를 사용할 수 있습니다.
명령은 아래와 같습니다.
git merge --abort
Rebase 는 주로 Commit 을 편집할 때 사용됩니다.
이 편집에는 몇가지 옵션이 존재하는데 전체옵션과, 주로 사용되는 옵션을 정리했습니다.
전체 옵션은 이전에 포스팅을 모두 따라오셨다면, 아래의 명령 및 입력을 사용하시면 Terminal 에서 이용이 가능합니다.
기본 명령구성은 아래와 같습니다.
git rebase -i
여기서 사용되는 주요명령은 p, r, e , d 입니다.
- p : pick 의 약자입니다. Commit 을 사용합니다.
- r : reword 의 약자입니다. Commit 을 유지하되, 메시지를 편집합니다.
- e : edit의 약자입니다. Commit 을 유지하되, 수정을 위해 잠시 중단합니다.
- s : squash 의 약자입니다. Commit 을 병합합니다.
이를 작성하는 방법은 역시 hash 가 필요합니다.
hash의 기준은 내가 "편집"하려는 Commit 의 "이전" hash 입니다.
만약 제가 Test 2 의 Commit 을 편집하려면 Test1 의 Commit hash 가 필요합니다.
git rebase -i ee076b1022e9c0b2f01eff10bdced276ca81344a
위의 리스트에서 이제 수정하고자 하는 hash 왼측에 있는 pick 을 CLi 에서 지운 뒤, p,r,e,d,s 약어중 원하는 명령의 약어로 편집하고 편집기에서 저장 후 종료를 하면 작업이 수행됩니다.
만약 Merge 의 경우, 일반적으로 합치기 전 단계로 되돌릴 수 있으며, 이때는 "--abort" 를 사용할 수 있습니다.
만약 이 경우, 충돌사항이 발생하거나, 수정이 필요한 경우, 잘못된 명령의 경우 아래의 메시지가 출력되며, 이 때에는 변경사항을 수정완료 한 뒤, --continue 를 사용하면, 작업이 완료됩니다.
git rebase --abort
git rebase --continue
이러한 작업이 모두 완료가 되면, 기본적인 Commit, Branch 의 이해가 종료됩니다.
물론 블로그에서 다루지 않은 더 많은 기능도 존재하지만, 이 단계까지 따라오신 여러분들이라면 충분히 다른 기능은 검색을 통해 이용이 가능할 것이라고 생각됩니다.
이제 다음 포스팅에서는 이렇게 작업한 파일을 Github 와 함께 이용하는 방법에 대해서 알아보도록 하겠습니다.
감사합니다.
'개발공부일지 > Git&Github' 카테고리의 다른 글
Git/GitHub 사용하기 - GitHub 를 사용하여 Git 관리 (0) | 2022.11.24 |
---|---|
Git 기본 설정하기 - Visual Studio Code 에서 Git 기본 설정하기 (0) | 2022.11.23 |
댓글