You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
'gh pr create' fails if skipping pushing with "GraphQL error: Head sha can't be blank, Base sha can't be blank, No commits between master and <branch>, Head ref must be a branch" #2691
Under some circumstances (not sure exactly why, see below), if I choose to skip pushing the current branch, PR creation fails with the following error:
GraphQL error: Head sha can't be blank, Base sha can't be blank, No commits between master and , Head ref must be a branch"
This is on 1.4.0 but also happened on 1.3.1.
Steps to reproduce the behavior
I think this should reproduce the problem. I'm pretty sure the bug is linked to the upstream configuration for the current branch :
Add some commits, and push to your fork : git push origin HEAD
Create the PR with gh: gh pr create
Choose "Skip pushing the branch" when asked where to push. I already pushed it myself, and I don't want gh to mess with my upstream configuration (i.e. I want to avoid gh doing git branch --set-upstream-to=origin/$(git branch --show-current) or git push -u origin $(git branch --show-current)), a behaviour which can't be disabled at the moment).
Enter title
Edit body
Submit
Experience error: pull request create failed: GraphQL error: Head sha can't be blank, Base sha can't be blank, No commits between master and my-topic, Head ref must be a branch
Expected vs actual behavior
I expected the PR creation to succeed. The GraphQL error seems to imply that gh is making a incorrect API request because (I assume) it can't correctly compute the required arguments.
Logs
## Git state before attempting PR creation# upstream branch is upstream/master
$ git rev-parse --symbolic-full-name @{upstream}
refs/remotes/upstream/master
# current branch is one commit ahead of its upstream
$ git log --oneline --decorate @{upstream}..HEAD
494173a586 (HEAD -> fix-linkgit-git1, origin/fix-linkgit-git1) git.txt: fix typos in'linkgit' macro invocation
# current branch is already pushed to my fork
$ git log --oneline --decorate origin/$(git branch --show-current)..HEAD
# empty# configured remote for 'gh' is 'ggg', which I do not have push access to:
$ git config --get-regexp 'remote.*.gh-resolved'
remote.ggg.gh-resolved base
# Try creating the PR:
$ gh pr create
? Where should we push the 'fix-linkgit-git1' branch? Skip pushing the branch
Creating pull request forfix-linkgit-git1 into masterin gitgitgadget/git
? Title Fix typo in'linkgit' macro invocation
? Body <Received>? What's next? SubmitX operation failed. To restore: gh pr create --recover /var/folders/lr/r6n2057j0dzd4gdb614fp0740000gp/T/gh303112606.jsonpull request create failed: GraphQL error: Head sha can't be blank, Base sha can't be blank, No commits between master and fix-linkgit-git1, Head ref must be a branch
Another thing I noticed while debugging this: If I choose to open the PR against my own fork (-R phil-blain/git), it works., even if I do not skip pushing the branch.
I created a branch test with "upstream/trunk" as upstream, and committed some changes: git checkout -b test upstream/trunk && date>>README.md && git commit -am test
I pushed to my fork: git push origin HEAD
I tried creating a PR with DEBUG=api gh pr create -b "Trying to reproduce https://github.com/cli/cli/issues/2691" -t "Test PR to reproduce https://github.com/cli/cli/issues/2691" --head $(git branch --show-current)
If I remove --head $(git branch --show-current), and choose to push to my fork (phil-blain/cli) when prompted, this is the request that is sent, and it succeeds:
Thanks for the detailed reproduction steps! I think the problem is that we don't detect properly that your branch is already published to originunless it has git upstream configuration set up #575
We do detect it if it's fully pushed, but as you've mentioned, your local branch was one commit ahead.
Thanks for the detailed reproduction steps! I think the problem is that we don't detect properly that your branch is already published to originunless it has git upstream configuration set up #575
Yes, I agree.
We do detect it if it's fully pushed, but as you've mentioned, your local branch was one commit ahead.
It was one commit ahead of @{upstream} (upstream/trunk), but it was fully pushed to @{push} ( origin/test).
It was one commit ahead of @{upstream} (upstream/trunk), but it was fully pushed to @{push} ( origin/test).
We don't have support for @{push}, so only @{upstream} was taken into account, and since there was a mismatch, gh could not determine where the branch was pushed.
Sometimes I think that our branch push detection is trying to be too smart. Maybe we can just assume that a branch was pushed to a remote if there is a same-named branch on the remote. That could be prone to false positives, but I think they would be rarer than current false negatives.
Reacted by George Kenneally, Jan Brasna and Tom Hughes
Why not just check the local hashes? in the case above, "test" and "origin/test" point to the same hash, so it means the branch was pushed... Then you can't have "false positives" , no ?
Also, I think the doc could be clearer about the "owner:branch" syntax for the --head argument. I only tried it after reading the code, and only afterwards realized that gh pr create --help had "gh pr create --base develop --head monalisa:feature" as the last example...
For me a branch is a Git term, and "phil-blain:test" is not a branch, so I think the documentation could be clearer in that regards.
Reacted by Mislav Marohnić, KeisukeYamashita, Alejandro Germain, Mauro Locatelli, Sami Kurvinen, Marco Deleu, Derrik Ammons, Tomo Suzuki, Aakash Mohandas, Ronnie Ghose and 2 more
@tmandry I'm sorry that you almost lost your work. Are you running a recent version of gh? We've had the --recover option for failed gh pr createsince v1.3, and if that never showed up for you, we'd appreciate an open issue about it!
I create branches with the naming convention ${username}/${jira_ticket} and always want my PR to be formatted with [${jira_ticket}] in front. The command above sets the title and body to the last commit message and prepends the jira ticket to the title. You can omit the $(git branch --show-current) from the title if you do not want that part.
This error also comes up using gh stack link, in my case while using Jujutsu. AFAICT I'm doing exactly what the documentation directs, but it still fails with this inscrutable message.
Activity
phil-blain commentedon Jan 14, 2021
Here are some standalone reproduction steps:
testwith "upstream/trunk" as upstream, and committed some changes:git checkout -b test upstream/trunk && date>>README.md && git commit -am testgit push origin HEADDEBUG=api gh pr create -b "Trying to reproduce https://github.com/cli/cli/issues/2691" -t "Test PR to reproduce https://github.com/cli/cli/issues/2691" --head $(git branch --show-current)Here is the request that is sent:
{ "query": "\n\t\tmutation PullRequestCreate($input: CreatePullRequestInput!) {\n\t\t\tcreatePullRequest(input: $input) {\n\t\t\t\tpullRequest {\n\t\t\t\t\tid\n\t\t\t\t\turl\n\t\t\t\t}\n\t\t\t}\n\t}", "variables": { "input": { "baseRefName": "trunk", "body": "Trying to reproduce https://github.com/cli/cli/issues/2691", "draft": false, "headRefName": "test", "repositoryId": "MDEwOlJlcG9zaXRvcnkyMTI2MTMwNDk=", "title": "Test PR to reproduce https://github.com/cli/cli/issues/2691" } } }--head $(git branch --show-current), and choose to skip pushing when asked, I get the same result.-R phil-blain/cli, I get the same kind of request, and it succeeds:{ "query": "\n\t\tmutation PullRequestCreate($input: CreatePullRequestInput!) {\n\t\t\tcreatePullRequest(input: $input) {\n\t\t\t\tpullRequest {\n\t\t\t\t\tid\n\t\t\t\t\turl\n\t\t\t\t}\n\t\t\t}\n\t}", "variables": { "input": { "baseRefName": "trunk", "body": "Trying to reproduce https://github.com/cli/cli/issues/2691", "draft": false, "headRefName": "test", "repositoryId": "MDEwOlJlcG9zaXRvcnkzMjk0ODI5Nzk=", "title": "Test PR to reproduce https://github.com/cli/cli/issues/2691" } } }--head $(git branch --show-current), and choose to push to my fork (phil-blain/cli) when prompted, this is the request that is sent, and it succeeds:{ "query": "\n\t\tmutation PullRequestCreate($input: CreatePullRequestInput!) {\n\t\t\tcreatePullRequest(input: $input) {\n\t\t\t\tpullRequest {\n\t\t\t\t\tid\n\t\t\t\t\turl\n\t\t\t\t}\n\t\t\t}\n\t}", "variables": { "input": { "baseRefName": "trunk", "body": "Trying to reproduce https://github.com/cli/cli/issues/2691", "draft": false, "headRefName": "phil-blain:test", "repositoryId": "MDEwOlJlcG9zaXRvcnkyMTI2MTMwNDk=", "title": "Test PR to reproduce https://github.com/cli/cli/issues/2691" } } }So,
headRefNameis set tophil-blain:test, whereas it is onlytestin the failing requests. I'm guessing that's where the bug comes from.phil-blain commentedon Jan 14, 2021
Interestingly, I tried with
--head phil-blain:$(git branch --show-current)instead, and this succeeded:mislav commentedon Jan 14, 2021
Thanks for the detailed reproduction steps! I think the problem is that we don't detect properly that your branch is already published to
originunless it has git upstream configuration set up #575We do detect it if it's fully pushed, but as you've mentioned, your local branch was one commit ahead.
phil-blain commentedon Jan 14, 2021
Yes, I agree.
It was one commit ahead of
@{upstream}(upstream/trunk), but it was fully pushed to@{push}(origin/test).mislav commentedon Jan 14, 2021
We don't have support for
@{push}, so only@{upstream}was taken into account, and since there was a mismatch, gh could not determine where the branch was pushed.cli/pkg/cmd/pr/create/create.go
Lines 353 to 363 in 4750e4a
Sometimes I think that our branch push detection is trying to be too smart. Maybe we can just assume that a branch was pushed to a remote if there is a same-named branch on the remote. That could be prone to false positives, but I think they would be rarer than current false negatives.
phil-blain commentedon Jan 15, 2021
Why not just check the local hashes? in the case above, "test" and "origin/test" point to the same hash, so it means the branch was pushed... Then you can't have "false positives" , no ?
Also, I think the doc could be clearer about the "owner:branch" syntax for the
--headargument. I only tried it after reading the code, and only afterwards realized thatgh pr create --helphad "gh pr create --base develop --head monalisa:feature" as the last example...For me a branch is a Git term, and "
phil-blain:test" is not a branch, so I think the documentation could be clearer in that regards.deleugpn commentedon Aug 5, 2021
Who is the owner of a branch?
tmandry commentedon Sep 4, 2021
I just hit this and it caused the whole PR description I'd written to disappear. Better error recovery would be nice.
Edit for anyone who hits this: I was able to find a copy in vim's backup dir.
mislav commentedon Sep 6, 2021
@tmandry I'm sorry that you almost lost your work. Are you running a recent version of gh? We've had the
--recoveroption for failedgh pr createsince v1.3, and if that never showed up for you, we'd appreciate an open issue about it!tmandry commentedon Sep 8, 2021
Ah, mine's v1.2. I'll upgrade then! Thanks for the helpful response.
MikePendo commentedon Oct 31, 2021
same issue here
imsanjoykb commentedon Nov 27, 2021
I use ---
gh pr create --title "The bug is fixed" --body "Everything works again"
but getting error
julianwagle commentedon Apr 19, 2022
I kept getting this error - I was calling the wrong branch name in --head. Hopefully that can help someone down the line.
8 remaining items
cchiriac518 commentedon Aug 4, 2023
Hey. I had the same issue and in my case the issue is that I put my branches in the wrong order (head and base were reversed)
git push before creating pr
chore(ci): Automatically prepare a PR for the release
chore(ci): Automatically prepare a PR for the release
amzar96 commentedon Mar 4, 2025
Hello, I faced the same issue. It only occurs when creating a pull request using CLI.
fredleger commentedon Apr 4, 2025
same started after i guess git update ?
MacOS Silicon M1 / git version 2.49.0
Try fix from cli/cli#2691
itinance commentedon Aug 28, 2025
running into exact this issue today gh version 2.78.0 (2025-08-21)
LucaPrete commentedon Sep 9, 2025
+1 same issue
tedwardd commentedon Oct 22, 2025
FWIW, here is my workaround for
gh create -fnot working with git worktrees:I create branches with the naming convention
${username}/${jira_ticket}and always want my PR to be formatted with[${jira_ticket}]in front. The command above sets the title and body to the last commit message and prepends the jira ticket to the title. You can omit the$(git branch --show-current)from the title if you do not want that part.fredleger commentedon Oct 27, 2025
Interesting, i also created the branch PR with à
/in it (something likefeat/some-cool-feature). Is it the case of the others as well ?toddjonker commentedon Sep 9, 2026
This error also comes up using
gh stack link, in my case while using Jujutsu. AFAICT I'm doing exactly what the documentation directs, but it still fails with this inscrutable message.