개요
로컬에서 작업한 코드를 git에 커밋하고 푸시 하려는데, 다음과 같은 오류가 발생했다.
> git push fatal: The current branch test has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin test To have this happen automatically for branches without a tracking upstream, see 'push.autoSetupRemote' in 'git help config'.
오류의 원인과 해결 방법을 알아보자.
분석
로컬에서 코드를 작업하면서 새로운 브랜치를 만들고, 이를 푸시할때
git push
를 진행하면 발생하는 오류이다. git에서 암묵적으로 로컬과 오리진의 브랜치를 연결하지 않기 때문에 명시적으로 설정해야 한다고 알려주고 있다.예를 들어, 로컬에서
feature/new
브랜치를 작업했지만 오리진에서는 다른 이름의 브랜치를 지정할 수도 있고, 같은 이름의 브랜치를 지정할 수도 있다. 어찌되었든 사용자가 이를 명시적으로 제공하지 않았기 때문에 혼란의 여지가 없도록 명시적으로 지정해달라는 것이다.이를 해결하는 방법은 두 가지가 있다. 첫 번째는 오리진에 명시적으로 브랜치 이름을 제공하는 방법이다.
git push --set-upstream origin feature/new
이렇게 하면 현재 작업중인 로컬 브랜치에 대해서 오리진의
feature/new
브랜치와 연결하겠다고 선언하는 것이다. 그래서 오리진에도 같은 이름으로 브랜치를 생성하거나 이미 있는 브랜치에 푸시를 하게 된다. 이런 명시적 설정에서는 오리진의 이름이 다른 브랜치를 지정하는 것이 가능하다!어쩌다가 같은 브랜치로 여러 사람이 작업해서 푸시한 경우에는 충돌이 발생하므로 임의로 오리진 브랜치를 변경해야 할 수도 있다. 그러면 번거롭게 로컬 브랜치 이름을 변경하고 푸시하지 않고도 기존 브랜치를 오리진의
feature/new-2
처럼 다른 이름으로 연결하는 것이다.두 번째 방법은 오류 로그에서 제안한 것처럼
push.autoSetupRemote
설정을 지정하는 것이다. 해당 설정은 단순하게 로컬 브랜치와 동일한 이름의 브랜치를 오리진과 자동으로 연결하겠다고 선언하는 것이다.git config --global push.autoSetupRemote true
이처럼 글로벌 설정을 추가하면, 앞으로 작업하는 모든 git 코드의 로컬 브랜치는 암묵적으로 오리진 또는 다른 리모트에서도 동일한 이름의 브랜치를 연결하도록 설정된다. 만약 글로벌 설정이 부담스럽다면 리포지토리별로 글로벌 대신에
--local
을 이용하여 리포지토리별로도 설정을 추가할 수 있다.맺음말
가뜩이나 신경쓸게 많은 git 에서 브랜치 이름까지 로컬과 리모트를 따로 생각하기에는 너무 혼란스럽기 때문에 가급적 위 설정을 추가하고 일관된 브랜치 이름 또는 충돌하지 않는 독립적인 이름을 잘 가져가는 것이 유리해보인다.