콘텐츠로 이동

pull·push가 꼬였을 때 대처하기 - pull 옵션, merge commit, force push 이후

git 2.27부터 git pull의 동작 옵션 지정이 강제되어, 옵션을 정하지 않으면 pull이 되지 않는다.

해결책은 세 가지다.

  1. git config pull.rebase false
  2. git config pull.rebase true
  3. git config pull.ff only

팀에서는 rebase를 권장하지 않고 merge commit을 만드는 방식을 지향했기 때문에, git bash를 열고 아래 명령을 입력해 해결했다.

터미널 창
git config pull.rebase false

커밋한 뒤 push하기 전 사이에 다른 작업자가 변경점을 push하면, 로컬 브랜치에는 새로 pull 받아야 하는 커밋 수와 push할 커밋 수가 함께 표시된다.

이 상태에서 그대로 pull 후 push하면 로컬 브랜치의 그래프와 원격 그래프가 달라 merge commit이 생긴다.

merge commit을 남기고 싶지 않다면 pull할 때 rebase 옵션을 켜서 받은 뒤 push한다.

이미 pull을 받아 merge commit이 생겼다면, 내 커밋(들)을 reset --soft한 뒤 다시 pull 받으면 된다. 이미 push까지 했다면 merge commit을 없애는 데 push -f가 필요하다. 위험하므로 포기한다.

force push 이후 pull·auto-merge가 안 될 때

섹션 제목: “force push 이후 pull·auto-merge가 안 될 때”

누군가 push -f를 하면, 그 이전에 브랜치를 받아 둔 사람은 경우에 따라 pull을 받지 못한다.

  • 로컬 변경점이 있는 경우: 커밋하지 않은 변경은 stash로 치워 두고, 이미 커밋한 변경은 다른 브랜치를 체크아웃한 뒤 체리픽한다. 로컬에서 rebase해도 된다.
  • 로컬 변경점이 없는 경우: 로컬 변경점과 브랜치를 삭제하고 원격 브랜치를 새로 체크아웃한다.

공유 feature 브랜치가 원격에서 rebase되어 push가 거부되는 경우는 원격 브랜치가 rebase된 뒤 push가 거부될 때에 따로 정리했다.