상황
1. 캡스톤 디자인 개발을 진행하면서 AWS EC2 서버를 이용해 API 서버를 배포하는 중이다.
2. Github를 통해 변경된 코드를 서버에 옮기고 있다.
3. 이전에 있던 코드와 충돌이 발생하면서 다음과 같은 에러가 발생한다.
git fetch 명령어를 통해서 커밋을 가져온 후, merge하면 해결할 수 있다.
하지만, Github에서 가져오려는 코드가 어떤 것인지, 이전 코드와 어떻게 다른지 확실히 알고 있기 때문에 이전 코드와 상관없이 Github에 있는 코드를 pull 명령어를 통해서 강제로 덮어씌우고 싶다.
해결 방법
해결 방법은 Repository에서 최신 커밋 정보를 가져와서 강제로 HEAD를 옮긴 후 저장하는 것입니다.
1. git pull을 하기 위해서 깃허브의 repository에서 커밋 정보를 확인합니다.
$git fetch --all
--all 옵션을 통해 모든 정보를 확인합니다.
2 git reset을 통해 head를 최신 커밋을 가리키게 합니다.
$git reset --hard origin/master
--hard 옵션은 강제로 head를 옮기는 것입니다. 이런 옵션들을 사용할 때는 신중할 필요가 있습니다.
3. git pull을 통해 가져온 정보를 저장합니다.
$git pull
이전 코드와 상관 없이 최신 커밋을 덮어 씌우는 것입니다.
세부 사항
git fetch
$git fetch는 원격 저장소(Github)에 있는 정보들을 가져오는 명령어입니다. 어떤 변화가 있는지 확인할 수 있습니다. 정보를 저장하는 것은 아니고, 정보를 확인하고 필요하면 병합(merge)할 수 있습니다. fetch를 사용해서 최신 커밋 정보를 가져오면 FETCH_HEAD라는 브랜치로 가져옵니다. 따라서, 커밋 정보를 보기 위해서는 해당 브랜치로 이동(checkout)해야합니다.
이렇게 최신 커밋 정보를 가져와서 정보를 저장하려면(합치려면) $git pull을 사용해도 되고, $git merge를 사용해도 됩니다.
git reset
$git reset은 HEAD의 포인터를 특정 위치로 옮기는 명령어입니다.
--hard 옵션을 추가해서 이전 커밋으로 돌아가면, 그 커밋 이후에 내용들은 삭제됩니다.
--mixed 옵션을 추가해서 커밋을 이동하면 변경 이력이 모두 삭제되지만 스테이지에 코드가 남아있습니다. 이 코드를 add 후 커밋하면 됩니다.
--soft 옵션을 추가하면 mixed 옵션과 같지만 이미 스테이징 되어있습니다. 이 말은, add 없이 바로 커밋하면 된다는 뜻입니다.
이 명령어는 commit history를 덮어 씌우는 commit history로 바꾸기 때문에 기록이 없어집니다. 이 경우 다른 사람과 협업하는 상황에서 문제를 일으킬 수 있는 여지가 있습니다. 지금 제 상황과 같이 코드에 대한 확신이 있는 경우나 혼자 사용하는 브랜치에만 사용하는 것이 좋습니다.
정리
강제로 덮어쓰는 방법보다는 기존 코드와 잘 병합될 수 있도록 코드를 짜는 것에 신경을 쓸 필요가 있다고 생각했습니다.
'DevOps > GIT & GITHUB' 카테고리의 다른 글
[GIT] git bash 관리자 권한으로 실행하기 (0) | 2021.09.06 |
---|---|
GIT 제대로 활용하기! - branch (0) | 2021.02.13 |
본격적으로 GITHUB 사용하기! - remote, push, pull, fetch (0) | 2021.02.10 |
GIT을 이용한 버전관리 - 생성, 스테이지와 커밋, 커밋 되돌리기 (0) | 2021.02.08 |
GIT을 위한 간단한 리눅스 명령어 모음 (0) | 2021.02.08 |