`pr view` and `pr status` should respect `branch.<name>.pushRemote`
Description
Note
This is very similar to #9364, but instead of all branches pushing to a particular remote (git config remote.pushDefault origin), we can select just one (git config branch.<branch>.pushRemote origin).
When using a triangular workflow, it is possible to have a branch merge changes from upstream while pushing changes to a fork. For example, imagine that we are working on a branch feature in our fork and we want to continually be rebasing on upstream/main, we could do that like so:
First we clone the fork:
➜ gh repo clone williammartin/test-repo Cloning into 'test-repo'... remote: Enumerating objects: 160, done. remote: Counting objects: 100% (45/45), done. remote: Compressing objects: 100% (25/25), done. remote: Total 160 (delta 33), reused 21 (delta 20), pack-reused 115 Receiving objects: 100% (160/160), 24.89 KiB | 2.26 MiB/s, done. Resolving deltas: 100% (53/53), done. From https://github.com/williammartin-test-org/test-repo * [new branch] main -> upstream/main * [new tag] vDraftTriage -> vDraftTriage * [new tag] vDraftyBoi -> vDraftyBoi ! Repository williammartin-test-org/test-repo set as the default repository. To learn more about the default repository, run: gh repo set-default --help ➜ cd test-repo
Then we check out a branch so that it is tracking upstream/main:
➜ git checkout -b remote-branch-push-remote-feature upstream/main branch 'remote-branch-push-remote-feature' set up to track 'upstream/main'. Switched to a new branch 'remote-branch-push-remote-feature' ➜ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote "origin"] url = https://github.com/williammartin/test-repo.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "main"] remote = origin merge = refs/heads/main [remote "upstream"] url = https://github.com/williammartin-test-org/test-repo.git fetch = +refs/heads/*:refs/remotes/upstream/* gh-resolved = base [branch "remote-branch-push-remote-feature"] remote = upstream merge = refs/heads/main
Then we set branch.<branch>.pushRemote to origin so that our new branch is pushed to origin instead of upstream:
➜ git config branch.remote-branch-push-remote-feature.pushRemote origin
➜ test-repo git:(remote-branch-push-remote-feature) cat .git/config
...
[branch "remote-branch-push-remote-feature"]
remote = upstream
merge = refs/heads/main
pushRemote = originSo we create new a commit on the branch, and a new pull request (note that git push knew where to push to due to branch.<name>.pushRemote):
➜ git commit --allow-empty -m "remote-branch-push-remote-feature" && git push [remote-branch-push-remote-feature 7841070] remote-branch-push-remote-feature Enumerating objects: 1, done. Counting objects: 100% (1/1), done. Writing objects: 100% (1/1), 202 bytes | 202.00 KiB/s, done. Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 remote: remote: Create a pull request for 'remote-branch-push-remote-feature' on GitHub by visiting: remote: https://github.com/williammartin/test-repo/pull/new/remote-branch-push-remote-feature remote: To https://github.com/williammartin/test-repo.git * [new branch] remote-branch-push-remote-feature -> remote-branch-push-remote-feature ➜ gh pr create -H williammartin:remote-branch-push-remote-feature --title remote-branch-push-remote-feature --body remote-branch-push-remote-feature Creating pull request for williammartin:remote-branch-push-remote-feature into main in williammartin-test-org/test-repo https://github.com/williammartin-test-org/test-repo/pull/48
However when we try to view our newly created PR it fails because it is trying to find a PR from main since that is the current merge entry in the branch config:
➜ gh pr view no pull requests found for branch "main"
Unfortunately, resolving @{push} doesn't work because the merge entry for the branch config has a different branch name:
➜ git rev-parse --abbrev-ref remote-branch-push-remote-feature@{push}
fatal: cannot resolve 'simple' push to a single destinationProposed Solution
Fortunately we know that if our push.default = current / simple (meaning local and remote branch have the same name) then with the branch.<name>.pushRemote telling us the correct remote we can concatenate these which will give us: origin/remote-branch-push-remote-feature and we'll be able to find the PR!
Additional context
This is already implemented by #9208, I'm just capturing the specific enhancement separately as it was kind of hard for me to understand as someone that's never used these features before.