Logo

git push 사용법/팁

git push는 원격 저장소(remote repository)에 코드 변경분을 업로드하기 위해서 사용하는 Git 명령어 입니다.

git commit vs. git push

git commit 명령어는 로컬 저장소(local repository)에 코드 변경 이력을 남기기 위해서 사용됩니다. 여기서 로컬 저장소란 git clone 명령어를 통해서 내 컴퓨터에 복제해둔 원격 저장소의 복사본을 의마합니다. 따라서, git commit를 통해 로컬 저장소에 아무리 많은 코드 변경 이력을 남기더라도 원격 저장소에서는 알 길이 없습니다. 반드시 명시적으로 git push를 날려줘야, 그 동안 로컬 저장소에서 남겨놓은 코드 변경 이력들이 원격 저장소로 전송이 됩니다.

기본 사용법

git push 명령어는 기본적으로 원격 저장소명과 브랜치명을 인자로 받습니다.

$ git push <저장소명> <브랜치명>

예를 들어, my-feature라는 브랜치에 남겨놓은 코드 변경 이력을 origin라는 원격 저장소에 올리기 위한 git push 명령어는 다음과 같습니다.

$ git push origin my-feature

원격 저장소명은 git clone을 통해 저장소를 복제를 했다면 일반적으로 origin이며 git remote 명령어를 통해서 정확한 저장소명을 알아낼 수도 있습니다.

$ git remote
origin

인자 생략 하기 1

로컬에서 새롭게 만든 브랜치를 git push 명령어를 사용하여 원격으로 올리려고 하면 아래와 같은 오류를 접하게 됩니다.

$ git push
fatal: The current branch my-feature has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin my-feature

To have this happen automatically for branches without a tracking
upstream, see 'push.default' in 'git help config'.

git push 명령어 뒤에 저장소명과 브랜치명을 명시해주지 않아서 발생하는 오류인데요. git push 명령어를 실행할 때 마다 매번 똑같은 저장소명과 브랜치명을 입력하는 게 귀찮게 느껴질 수 있습니다. 😫

이럴 경우, -u 옵션 또는 --set-upstream 사용하면 최초에 한 번만 저장소명과 브랜치명을 입력하고 그 이후에는 모든 인자를 생략할 수 있습니다.

예를 들어, 다음과 같이 저장소명과 브랜치명을 넘기면서 -u 옵션과 함께 git push 명령어를 날리면,

$ git push -u origin my-feature

그 이후에 커밋한 코드 변경분을 원격 저장소에 올릴 때는 인자없이 git push 명령어만 날리면 됩니다.

$ git commit -m "Change 1"
$ git commit -m "Change 2"
$ git commit -m "Change 3"
$ git push

인자 생략 하기 2

여러 브랜치를 넘나 들면서 작업을 하는 경우에는 최초에 한 번 인자를 넘기는 것도 귀찮게 느껴질 수 있습니다. 😅 대부분의 경우에는 로컬 저장소와 원격 저장소에서 동일한 브랜치 이름을 사용하기 때문에 항상 현재 브랜치를 기준으로 git push 명령어가 작동한다면 매우 편리할 것 같습니다.

이를 위해서는 약간의 설정이 필요한데요. 다음과 같이 push.default 설정을 current로 설정해줍니다.

$ git config --global push.default current

자, 이제부터는 어느 브랜치에서 작업을 하든 git push만 날리면 원격 저장소에 동일한 브랜치로 코드 변경분이 업로드됩니다. 🤗

$ git push

코드 변경 이력 덮어쓰기

로컬 저장소에서는 자유롭게 코드 변경 이력을 수정해도 내 컴퓨터 밖에 모르는 일이기 때문에 뭐라고 할 동료가 없습니다. 하지만 일단 원격 저장소에 코드 변경분을 올린 이후에는 더 이상 해당 코드 변경분은 순전히 나의 코드가 아니기 때문에 함부로 변경 이력을 수정하면 안 됩니다. 왜냐하면 동료가 해당 코드 변경분을 내려 받았는데, 내가 그 코드 변경 이력을 수정해서 다시 올리면, 그 동료에게 코드 충돌이 발생할 것이기 때문입니다. 😱

그렇기 때문에, git push로 원격 저장소에 올린 코드 변경분은 절대 덮어쓰지 않는 것이 원칙입니다만… 개인 프로젝트에서는 이러한 원칙이 큰 의미가 없기 때문에, 간혹 코드 변경 이력을 덮어쓰고 싶을 때가 있습니다.

이럴 때는 다음과 같이 -f 옵션을 사용하면, 원격 저장소 내의 해당 브랜치의 코드 변경 이력을 로컬 저장소의 코드 변경 이력으로 덮어써줍니다.

$ git push -f origin my-feature

마치면서

이상으로 git push 명령어를 사용하는 기본적인 방법과 좀 더 편리하게 사용할 수 있는 간단한 팁을 알아보았습니다.