# git: Separate revisions from paths in git commands \(\#63666\) · gitcafe/zed

[View on GitCafe](https://git.cafe/gitcafe/zed/commit/801c087af22dd189dc1aa49e2f370b4f04190b19)

Repository: [gitcafe/zed](https://git.cafe/gitcafe/zed)

Visibility: public

Requested revision: 801c087af22dd189dc1aa49e2f370b4f04190b19

Requested commit: 801c087af22dd189dc1aa49e2f370b4f04190b19

Commit: 801c087af22dd189dc1aa49e2f370b4f04190b19

Tree: 1eddef1bbf8711adecd1bd05727c33ac8af0ea98

Author: itsfuad

Committer: GitHub

## Message

````
git: Separate revisions from paths in git commands (#63666)

Closes #63665

A branch whose name also matches a path in the working tree, such as a
branch `docs/rewrite` in a repository that also has a `docs/rewrite`
directory, was passed to git as a bare argument, so git could not tell
the revision from the path:

```
fatal: ambiguous argument 'docs/rewrite': both revision and filename
```

The git panel's History tab showed "Failed to load commit history",
commit search returned no results, branch diff failed, and opening a
commit by ref failed.

The revision lists are now terminated with `--`.

That also required moving `--no-ext-diff` in `build_command`. It was
appended after the caller's arguments, so once a terminator was present
it landed past the separator and git read it as a pathspec. The diff
then came back empty with exit status 0 and no error, which broke three
existing `merge_base_worktree` tests. It now goes directly after the
subcommand, where it cannot fall past a terminator. This also means it
is no longer swallowed as a pathspec by `diff_stat`, which already ended
its arguments with `--` and a path list.

`git merge-base` takes no pathspec, so it was never ambiguous and is
unchanged.

This also fixes the `fatal: ambiguous argument` error reported in
#61186. That report additionally shows an `error: invalid option:
--merge-base` failure when the base branch does not exist locally, which
is a separate problem and is not addressed here.

### Tests

Three regression tests, one per affected surface, each building a
repository whose branch name matches a directory. All three fail on
`main` with the ambiguity error. A fourth test pins that every
revision-taking `LogSource` terminates its revision list, and that
`LogSource::Path`, which states its own separator, does not gain a
second one.

`cargo test -p git`: 76 passed. Clippy and `cargo fmt` clean.

### Before

<img width="542" height="950" alt="Screenshot From 2026-09-03 09-15-13"
src="https://github.com/user-attachments/assets/c54577c7-5066-4cdd-a03c-c67c6803ad33"
/>


### After

<img width="386" height="471" alt="Screenshot From 2026-09-03 10-08-42"
src="https://github.com/user-attachments/assets/b985bb16-60a2-4f50-ad2a-609c6a126bfb"
/>

Release Notes:

- Fixed the git panel's History tab, commit search, branch diff, and
opening a commit by ref failing when the branch name matches a path in
the working tree
````

## Parents

- [55c0cc36d18cf06c6c54f640a87ce83d09413ae4](https://git.cafe/gitcafe/zed/commit/55c0cc36d18cf06c6c54f640a87ce83d09413ae4?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zed/tree/801c087af22dd189dc1aa49e2f370b4f04190b19?format=markdown)
