push는 업로드고, push rejection은 이력 보호야
git push origin feature/x는 로컬 feature/x의 commit을 remote의 feature/x로 올려. 새 branch를 처음 push할 때는 tracking을 설정하는 -u를 붙여 git push -u origin feature/x를 써. 이후에는 feature/x에서 plain git push만 실행해도 알맞은 곳으로 향해. Tracking이 오가는 일을 한 줄짜리 습관으로 만들어주는 거야.
Push rejection은 서버에는 있지만 로컬에는 없는 이력을 덮지 않으려는 Git의 보호 장치야. 메시지도 분명해. "Updates were rejected because the remote contains work that you do not have locally." 할 일은 거부를 우회하는 게 아니라 remote 작업을 먼저 통합하는 거야. git fetch한 뒤 새 tip 위로 git rebase origin/feature/x하거나 git merge origin/feature/x하고 다시 push해.
Force push는 가볍게 쓸 명령이 아니야. git push --force는 commit 손실을 무릅쓰고 remote branch를 로컬 이력으로 덮어써. 다른 사람이 네가 아직 받지 않은 작업을 push했다면 그 commit을 서버에서 지울 수도 있어. 더 안전한 대안은 git push --force-with-lease야. 마지막 fetch 뒤 remote tip이 움직였다면 push를 거부해. 평소 편의는 같고 위험한 순간에만 멈춰.
두 pattern을 손에 익혀. 첫 push에서 tracking 설정: git push -u origin <branch>. rebase 뒤 안전장치를 둔 force-push: git push --force-with-lease. git config --global push.default current를 설정하면 인자 없는 git push가 현재 branch를 tracked remote로 보내 잘못된 branch를 밀어 올리는 실수를 줄여.