git 협업 시 알아야 할 명령어들 - 취소 및 복구 명령어, push & pull
git restore
코드를 작성했는데 앞서 작성한 코드가 틀리면 ctrl+z를 눌러서 다시 돌아가면 된다. 그런데 작성 후 하루가 지나서, 또는 해당 작업을 종료했다가 다시 돌아온 경우에는 파일을 실수 전 상태로 복구할 수 있다.
이때 'git restore 파일명'을 입력하여 사용하며, 특정 시점으로 파일을 복구하려면 'git restore --source 커밋아이디 파일명'을 입력하면 된다. 만약 복구해야 할 파일이 스테이징되어 있어서 이것을 취소하려면 'git restore --staged 파일명'을 입력하면 git add 했던 것이 취소된다.
git revert
restore 명령어는 복구하는 데 사용된다면, revert는 취소하는 데 사용되는 명령어이다.
커밋되어 있는 특정 커밋을 취소하려면 'git revert 커밋아이디'를 입력하면 되는데, 커밋아이디를 여러 개 입력해서 여러 커밋을 한번에 취소하는 것도 가능하다.
또, 가장 최근에 한 커밋을 취소하려면 'git revert HEAD'를 입력한다.
이 revert 명령어를 사용해서 merge된 커밋의 취소 또한 가능하다. 이 경우 -m 옵션을 입력하여 병합된 두 개의 커밋 중 어떤 커밋을 기준으로 되돌릴 것인지 지정해줘야 한다.
만약 병합된 커밋아이디가 abab1111일 때, 'git revert -m 1 abab1111'을 입력하면 첫 번째 커밋을 기준으로 되돌릴 수 있다.
git reset
특정 과거시점으로 시간을 되돌릴 수 있다면 좋겠다는 생각을 종종 한다. 현실은 불가능하지만 git 세계에서는 가능한데, reset 명령어를 사용하면 된다.
특정 시점으로 모든 것을 되돌리려면 'git reset --hard 커밋아이디'를 입력한다. 명령어에도 있듯이 하드리셋이기 때문에 협업시에는 잘 사용하지 않는다.
또, 'git reset --soft 커밋아이디'를 입력하면 지금까지의 변동사항을 지우지 않고 스테이징 상태로 해 놓을 수 있다.
'git reset --mixed 커밋아이디'를 입력하면 마찬가지로 변동사항을 지우지 않지만, 스테이징은 하지 않는다.
git push와 git pull
개발자가 커밋한 것을 원격저장소에 올릴 때 git push 명령어를 이용한다. 이 때 'git push 원격저장소 주소'를 입력하는데, 원격저장소 주소를 매번 입력하는 것은 비효율적이다.
그래서 git의 변수문법을 사용하는데, 'git remote add origin 원격저장소 주소'를 입력하면 origin이라는 변수에 주소가 저장되어 이후에 push할 때 'git push origin main'으로만 입력이 가능해진다.
이 경우, 'git push -u origin main'으로 -u 옵션을 붙일 수 있는데, 이는 주소를 기억하라는 옵션이며, 입력 후 push할 때는 git push만 입력해도 해당 원격저장소에 올릴 수 있다.
그리고 협업 시 팀원이 push한 내용을 내 로컬저장소에도 적용하려면 git pull 명령어를 사용한다. 사용시 'git pull 원격저장소 주소 브랜치명'을 입력하며, 변수문법을 사용하면 'git pull origin main'으로도 입력할 수 있다.
또, 팀원이 push한 상태에서 내가 해당 원격저장소에 push하려고 하면 오류가 발생한다. 팀원이 작성한 내용이 반영이 안되어 있기 때문인데, 이 경우에도 git pull 명령어를 통해 push된 내용을 합친 후, 새로 push해주면 오류가 발생하지 않는다.
참고로 git pull 명령어는 git fetch와 git merge가 합쳐진 형태이다. git fetch는 원격저장소의 신규 커밋을 가져오는 명령어이고, git merge는 내 브랜치에 병합하는 명령어이다. 그래서 git pull을 입력하면 작성된 커밋을 가져와서 합쳐주는 것이다.
그리고 협업 시에 각 브랜치에서 개발 후 merge하기 전에 코드 리뷰를 거치고 깃허브에서 merge하는 경우가 많은데, 이렇게 깃허브에서 merge하는 것을 pull request라고 한다.