2024. 7. 2. 13:10ㆍGit&Github
안녕하세요. 진득 코딩입니다. 협업을 하기 위해 github를 사용하면서 conflict가 발생하지 않게 예방하는 것이 가장 중요하지만 발생했다면 이러한 상황을 해결하는 것도 굉장히 중요합니다. 이번 시간에는 conflict와 잘못 add나 commit을 했을 때의 대처법에 대해서 살펴보도록 하겠습니다.
conflict 오류
conflict는 위와 같이 같은 파일이나 같은 위치에 있는 내용이 겹치는 경우에 conflict가 발생하게 됩니다. 이러한 conflict를 최소화하기 위해서는 자주 자주 commit, 자주 자주 push, 자주 자주 pull 함으로서 예방할 수 있습니다. 또한 많은 사람이 작업할 때에는 파일을 많이 나누어서 각자의 작업 공간을 확보해주는 것이 좋습니다. 이렇게 conflict는 안나도록 최대한 예방하는 것이 좋지만 그래도 conflict가 나는 경우에는 어떻게 해결하는지에 대해서 살펴보도록 하겠습니다.
conflict난 파일이나 코드를 확인해보면 위와 같이 HEAD부분과 merge한 내용 중 충돌되는 부분을 표시해주게 됩니다. 해당 부분을 살펴본 후에 <<<<<<HEAD, =======, >>>>>> f1 부분을 삭제하고 맞는 코드만 남겨둔 후에 저장하고 다시 git add, git commit을 해주시면 conflict를 해결하실 수 있습니다.
시간을 되돌리는 마법의 명령어 reset과 revert
1. reset
reset은 add나 commit을 취소할 수 있는 명령어입니다. reset은 Staging Area에 수정사항이 반영된 상태에서 commit된 내역도 log에서 삭제되는 명령어입니다. restore은 비슷해보이지만 git에는 올라와있지만 Staging Area에 수정사항까지는 반영되지 않은 상황에서 사용됩니다.
가장 최근 commit을 reset할 때에는 git reset HEAD^을 사용하여 바로 전 단계로 되돌릴 수 있습니다. 또한 git reset --hard로 깔끔하게 reset도 가능합니다. 그냥 git reset을 사용하게 되면 git reset --mixed가 적용되게 됩니다.
2. revert
git revert는 롤백이고 commit 내용이 취소된다는 기능은 reset과 유사하지만 revert됐다는 log가 남는다는 차이점이 있습니다. git revert를 취소시키려면 해당 commit 이름과 함께 reset을 사용하시면 revert를 취소할 수 있습니다.
reset이나 revert를 사용하면서 commit 이름을 생각보다 많이 사용하는 것을 알 수 있습니다. commit 이름은 git log를 입력하면 나오는 commit이라는 문자의 옆에 있는 문자 + 숫자로 이루어진 문자열입니다. git bash에서 ctrl + c와 ctrl + v를 누르게 되면 작동을 안하고 마우스로 복사 + 붙여넣기를 하거나 ctrl + Insert로 복사하고 Shift + Insert로 붙여넣기를 할 수 있습니다.
revert를 진행할 때 두 번 revert를 진행하고 싶으면 바로 전 commit 이름으로 두 번 revert하는 것이 아니라 전 commit으로 한 번, 전전 commit으로 한 번 revert를 해야만 전전 단계로 성공적으로 revert할 수 있습니다. 전 commit으로 두 번 revert하게 되면 제자리로 돌아오게 되기 때문에 사용시 유의합시다.
push는 원격저장소로 넘어가버리기 때문에 취소할 수 없습니다. 따라서 push를 할 때에는 항상 조심해서 해야합니다. 강제로 덮어쓰는 방법은 있지만 이러한 방법은 위험한 방법이고 협업에서 굉장히 좋지 않은 명령이기 때문에 유의하시고 push하시는 것을 추천드립니다.
추가적인 쓰기 좋은 명령어들
1. git commit --amend
개발을 하다보면 방금 커밋한 사항에서 사소한 실수나 변경 사항이 있어서 계속 변경해서 커밋 로그가 더러워지는 상황이 있습니다. 이런 경우에는 방금 커밋한 곳에 내용이나 커밋 메세지만 수정하고 불필요하게 커밋 노드들이 생성되는 것을 방지해줄 수 있는 명령어가 있습니다.
git add .
git commit --amend -m "commit message"
위 명령어를 사용하게 되면 새로운 커밋을 추가하는 것이 아니라 가장 최근 커밋 노드에 해당 내용이 추가되게 됩니다.
2. cherry-pick
어떤 레파지토리에서 pull을 하고 싶은데 모든 내용이 아닌 특정 기능이나 파일만 가져오고 싶을 때 유용한 명령어가 있습니다. 체리픽이라는 이름처럼 원하는 파일이나 기능만 가져올 수 있으며 생각보다 유용한 명령어입니다.
git Cherry-Pick <커밋-해시>
이렇게 협업을 하면서 제일 머리 아프고 마주하기 싫은 순간이 conflict 나거나 잘못 커밋을 하는 순간이라고 생각합니다. 이러한 상황을 만들지 않도록 예방하는 것이 가장 좋지만 이러한 문제를 해결하기 위해 위와 같은 내용들을 꼭 숙지하는 것이 개발자들의 숙명이라고 생각합니다. 이번 포스팅은 여기까지입니다. 끝까지 봐주셔서 감사합니다.😀
'Git&Github' 카테고리의 다른 글
[GitHub] Visual Studio에 깃허브를 연결하여 사용해보자 (0) | 2024.07.04 |
---|---|
[Git&GitHub] GitHub의 기능들을 살펴보자 (2) | 2024.07.02 |
[Git&GitHub] GitHub와 브랜치에 대해 알아보자 (0) | 2024.07.01 |
[Git&GitHub] Git에 대해 알아보자 (0) | 2024.07.01 |