git.md

  1---
  2description: Zed is a text editor that supports lots of Git features
  3title: Zed Editor Git integration documentation
  4---
  5
  6# Git
  7
  8Zed has built-in Git support that lets you manage version control without leaving the editor. The Git Panel shows your working tree state, staging area, and branch information. Changes you make on the command line are reflected immediately in Zed.
  9
 10For operations that Zed doesn't support natively, you can use the integrated terminal.
 11
 12## Git Panel
 13
 14The Git Panel shows the state of your working tree and Git's staging area.
 15
 16You can open the Git Panel using {#action git_panel::ToggleFocus}, or by clicking the Git icon in the status bar.
 17
 18In the panel you can see the state of your project at a glance: which repository and branch are active, what files have changed and the current staging state of each file.
 19
 20Zed monitors your repository so that changes you make on the command line are instantly reflected.
 21
 22### Configuration
 23
 24Open the Settings Editor (`Cmd+,` on macOS, `Ctrl+,` on Linux/Windows) to customize Git behavior. Settings are spread across two pages:
 25
 26- **Panels > Git Panel**: Panel position, tree vs flat view, status display style
 27- **Version Control**: Gutter indicators, inline blame, hunk styles
 28
 29#### Moving the Git Panel
 30
 31By default, the Git Panel docks on the left. Go to **Panels > Git Panel** and change **Git Panel Dock** to move it to the right or bottom.
 32
 33#### Switching to Tree View
 34
 35The Git Panel shows a flat list of changed files by default. To see files organized by folder hierarchy instead, toggle **Tree View** in the panel's context menu, or enable it in **Panels > Git Panel**.
 36
 37#### Inline Blame
 38
 39Zed shows Git blame information on the current line. To turn this off or add a delay before it appears, go to **Version Control > Inline Git Blame**.
 40
 41#### Hiding the Gutter Indicators
 42
 43The colored bars in the gutter that show added, modified, and deleted lines can be hidden. Go to **Version Control > Git Gutter** and set **Visibility** to "Hide".
 44
 45#### Commit Message Line Length
 46
 47Zed wraps commit messages at 72 characters (a Git convention). To change this, search for "Git Commit" in Settings and adjust **Preferred Line Length**.
 48
 49## Project Diff
 50
 51You can see all of the changes captured by Git in Zed by opening the Project Diff ({#kb git::Diff}), accessible via the {#action git::Diff} action in the Command Palette or the Git Panel.
 52
 53All of the changes displayed in the Project Diff behave exactly the same as any other multibuffer: they are all editable excerpts of files.
 54
 55You can stage or unstage each hunk as well as a whole file by hitting the buttons on the tab bar or their corresponding keybindings.
 56
 57### Word Diff Highlighting
 58
 59By default, Zed highlights changed words within modified lines to make it easier to spot exactly what changed. To disable this globally, open the Settings Editor and go to **Languages & Tools > Miscellaneous**, then turn off **Word Diff Enabled**.
 60
 61To disable word diff for specific languages only, add this to your settings.json:
 62
 63```json
 64{
 65  "languages": {
 66    "Markdown": {
 67      "word_diff_enabled": false
 68    }
 69  }
 70}
 71```
 72
 73### Diff View Styles
 74
 75> **Changed in Preview (v0.225).** See [release notes](/releases#0.225).
 76
 77Zed displays diffs in two modes: **split** (side-by-side comparison) or **unified** (inline changes). Split view is the default.
 78
 79#### Changing the diff view
 80
 81Open the Settings Editor ({#kb zed::OpenSettings}) and search for "diff view style". Select either **Split** or **Unified**.
 82
 83To change the default, add this to your `settings.json`:
 84
 85```json
 86{
 87  "diff_view_style": "unified"
 88}
 89```
 90
 91See [Configuring Zed](./configuring-zed.md) for more about the Settings Editor.
 92
 93#### Split vs unified
 94
 95- **Split**: Shows the original and modified versions side by side. Useful for comparing file structure or reviewing large changes.
 96- **Unified**: Shows changes inline with additions and deletions in a single view. Useful for focusing on specific line changes.
 97
 98You can switch between modes at any time. Your preference applies to [Project Diff](#project-diff), [File History](#file-history), and [Stash Diff View](#stash-diff-view). These diff views function as [multibuffers](./multibuffers.md), allowing you to edit multiple excerpts simultaneously.
 99
100## File History
101
102File History shows the commit history for an individual file. Each entry displays the commit's author, timestamp, and message. Selecting a commit opens a diff view filtered to show only the changes made to that file in that commit.
103
104To open File History:
105
106- Right-click on a file in the Project Panel and select "Open File History"
107- Right-click on a file in the Git Panel and select "Open File History"
108- Right-click on an editor tab and select "Open File History"
109- Use the Command Palette and search for "file history"
110
111## Fetch, Push, and Pull
112
113Fetch, push, or pull from your Git repository in Zed via the buttons available on the Git Panel or via the Command Palette by looking at the respective actions: {#action git::Fetch}, {#action git::Push}, and {#action git::Pull}.
114
115### Push Configuration
116
117Zed respects Git's push configuration. When pushing, Zed checks the following in order:
118
1191. `pushRemote` configured for the current branch
1202. `remote.pushDefault` in your Git config
1213. The branch's tracking remote
122
123This matches Git's standard behavior, so if you've configured `pushRemote` or `pushDefault` in your `.gitconfig` or via `git config`, Zed will use those settings.
124
125## Remotes
126
127When your repository has multiple remotes, Zed shows a remote selector in the Git Panel. Click the remote button next to push/pull to choose which remote to use for that operation.
128
129## Staging Workflow
130
131Zed has two primary staging workflows, using either the Project Diff or the panel directly.
132
133### Using the Project Diff
134
135In the Project Diff view, you can focus on each hunk and stage them individually by clicking on the tab bar buttons or via the keybindings {#action git::StageAndNext} ({#kb git::StageAndNext}).
136
137Similarly, stage all hunks at the same time with the {#action git::StageAll} ({#kb git::StageAll}) keybinding and then immediately commit with {#action git::Commit} ({#kb git::Commit}).
138
139### Using the Git Panel
140
141From the panel, you can simply type a commit message and hit the commit button, or {#action git::Commit}. This will automatically stage all tracked files (indicated by a `[·]` in the entry's checkbox) and commit them.
142
143<!-- Show a set of changes with default staged -->
144
145Entries can be staged using each individual entry's checkbox. All changes can be staged using the button at the top of the panel, or {#action git::StageAll}.
146
147<!-- Add media -->
148
149## Committing
150
151Zed offers two commit textareas:
152
1531. The first one is available right at the bottom of the Git Panel. Hitting {#kb git::Commit} immediately commits all of your staged changes.
1542. The second is available via the action {#action git::ExpandCommitEditor} or via hitting the {#kb git::ExpandCommitEditor} while focused in the Git Panel commit textarea.
155
156### Undoing a Commit
157
158As soon as you commit in Zed, in the Git Panel, you'll see a bar right under the commit textarea, which will show the recently submitted commit.
159In there, you can use the "Uncommit" button, which performs the `git reset HEADˆ--soft` command.
160
161### Configuring Commit Line Length
162
163By default, Zed sets the commit line length to `72` but it can be configured in your local `settings.json` file.
164
165Find more information about setting the `preferred-line-length` in the [Configuration](#configuration) section.
166
167## Branch Management
168
169### Creating and Switching Branches
170
171Create a new branch using {#action git::Branch} or switch to an existing branch using {#action git::Switch} or {#action git::CheckoutBranch}.
172
173### Deleting Branches
174
175To delete a branch, open the branch switcher with {#action git::Switch}, find the branch you want to delete, and use the delete option. Zed will confirm before deleting to prevent accidental data loss.
176
177> **Note:** You cannot delete the branch you currently have checked out. Switch to a different branch first.
178
179## Merge Conflicts
180
181When you encounter merge conflicts after a merge, rebase, or pull, Zed highlights the conflicting regions in your files and displays resolution buttons above each conflict.
182
183### Viewing Conflicts
184
185Conflicting files appear in the Git Panel with a warning icon. You can also see conflicts in the Project Diff view, where each conflict region is highlighted:
186
187- Changes from your current branch are highlighted in green
188- Changes from the incoming branch are highlighted in blue
189
190### Resolving Conflicts
191
192Each conflict shows three buttons:
193
194- **Use [branch-name]**: Keep the changes from one branch (shows the actual branch name, like "main")
195- **Use [other-branch]**: Keep the changes from the other branch (like "feature-branch")
196- **Use Both**: Keep both sets of changes, with your branch's changes first
197
198Click a button to resolve that conflict. The conflict markers are removed and replaced with your chosen content. After resolving all conflicts in a file, stage it and commit to complete the merge.
199
200> **Tip:** For complex conflicts that need manual editing, you can edit the file directly. Remove the conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) and keep the content you want.
201
202## Stashing
203
204Git stash allows you to temporarily save your uncommitted changes and revert your working directory to a clean state. This is particularly useful when you need to quickly switch branches or pull updates without committing incomplete work.
205
206### Creating Stashes
207
208To stash all your current changes, use the {#action git::StashAll} action. This will save both staged and unstaged changes to a new stash entry and clean your working directory.
209
210### Managing Stashes
211
212Zed provides a stash picker accessible via {#action git::ViewStash} or from the Git Panel's overflow menu. From the stash picker, you can:
213
214- **View stash list**: Browse all your saved stashes with their descriptions and timestamps
215- **Open diffs**: See exactly what changes are stored in each stash
216- **Apply stashes**: Apply stash changes to your working directory while keeping the stash entry
217- **Pop stashes**: Apply stash changes and remove the stash entry from the list
218- **Drop stashes**: Delete unwanted stash entries without applying them
219
220### Quick Stash Operations
221
222For faster workflows, Zed provides direct actions to work with the most recent stash:
223
224- **Apply latest stash**: Use {#action git::StashApply} to apply the most recent stash without removing it
225- **Pop latest stash**: Use {#action git::StashPop} to apply and remove the most recent stash
226
227### Stash Diff View
228
229To view a stash's contents, select it in the stash picker and press {#kb stash_picker::ShowStashItem}. From the diff view, you can use these keybindings:
230
231| Action                               | Keybinding                   |
232| ------------------------------------ | ---------------------------- |
233| Apply stash                          | {#kb git::ApplyCurrentStash} |
234| Pop stash (apply and remove)         | {#kb git::PopCurrentStash}   |
235| Drop stash (remove without applying) | {#kb git::DropCurrentStash}  |
236
237## AI Support in Git
238
239Zed currently supports LLM-powered commit message generation.
240You can ask AI to generate a commit message by focusing on the message editor within the Git Panel and either clicking on the pencil icon in the bottom left, or reaching for the {#action git::GenerateCommitMessage} ({#kb git::GenerateCommitMessage}) keybinding.
241
242> Note that you need to have an LLM provider configured either via your own API keys or through Zed's hosted AI models.
243> Visit [the AI configuration page](./ai/configuration.md) to learn how to do so.
244
245You can specify your preferred model to use by providing a `commit_message_model` agent setting.
246See [Feature-specific models](./ai/agent-settings.md#feature-specific-models) for more information.
247
248```json [settings]
249{
250  "agent": {
251    "commit_message_model": {
252      "provider": "anthropic",
253      "model": "claude-3-5-haiku"
254    }
255  }
256}
257```
258
259To customize the format of generated commit messages, run {#action agent::OpenRulesLibrary} and select the "Commit message" rule on the left side.
260From there, you can modify the prompt to match your desired format.
261
262<!-- Add media -->
263
264Any specific instructions for commit messages added to [Rules files](./ai/rules.md) are also picked up by the model tasked with writing your commit message.
265
266## Git Integrations
267
268Zed integrates with popular Git hosting services to ensure that Git commit hashes and references to Issues, Pull Requests, and Merge Requests become clickable links.
269
270Zed currently supports links to the hosted versions of
271[GitHub](https://github.com),
272[GitLab](https://gitlab.com),
273[Bitbucket](https://bitbucket.org),
274[SourceHut](https://sr.ht) and
275[Codeberg](https://codeberg.org).
276
277### Self-Hosted Instances
278
279Zed automatically identifies Git hosting providers by checking for keywords in your Git remote URL. For example, if your self-hosted URL contains `gitlab`, `gitea`, or other recognized provider names, Zed will automatically register that hosting provider without any configuration needed.
280
281However, if your self-hosted Git instance URL doesn't contain identifying keywords, you can manually configure Zed to create clickable links to your instance by adding a `git_hosting_providers` setting so commit hashes and permalinks resolve to your domain:
282
283```json [settings]
284{
285  "git_hosting_providers": [
286    {
287      "provider": "gitlab",
288      "name": "Corp GitLab",
289      "base_url": "https://git.example.corp"
290    }
291  ]
292}
293```
294
295The `provider` field specifies which type of hosting service you're using. Supported `provider` values are `github`, `gitlab`, `bitbucket`, `gitea`, `forgejo`, and `sourcehut`. The `name` is optional and used as a display name for your instance, and `base_url` is the root URL of your self-hosted server.
296
297You can configure multiple custom providers if you work with several self-hosted instances.
298
299### Permalinks
300
301Zed also has a Copy Permalink feature to create a permanent link to a code snippet on your Git hosting service.
302These links are useful for sharing a specific line or range of lines in a file at a specific commit.
303Trigger this action via the [Command Palette](./getting-started.md#command-palette) (search for `permalink`),
304by creating a [custom key bindings](key-bindings.md#custom-key-bindings) to the
305`editor::CopyPermalinkToLine` or `editor::OpenPermalinkToLine` actions
306or by simply right clicking and selecting `Copy Permalink` with line(s) selected in your editor.
307
308## Diff Hunk Keyboard Shortcuts
309
310When viewing files with changes, Zed displays diff hunks that can be expanded or collapsed for detailed review:
311
312- **Expand all diff hunks**: {#action editor::ExpandAllDiffHunks} ({#kb editor::ExpandAllDiffHunks})
313- **Collapse all diff hunks**: Press `Escape` (bound to {#action editor::Cancel})
314- **Toggle selected diff hunks**: {#action editor::ToggleSelectedDiffHunks} ({#kb editor::ToggleSelectedDiffHunks})
315- **Navigate between hunks**: {#action editor::GoToHunk} and {#action editor::GoToPreviousHunk}
316
317> **Tip:** The `Escape` key is the quickest way to collapse all expanded diff hunks and return to an overview of your changes.
318
319## Action Reference
320
321| Action                                    | Keybinding                            |
322| ----------------------------------------- | ------------------------------------- |
323| {#action git::Add}                        | {#kb git::Add}                        |
324| {#action git::StageAll}                   | {#kb git::StageAll}                   |
325| {#action git::UnstageAll}                 | {#kb git::UnstageAll}                 |
326| {#action git::ToggleStaged}               | {#kb git::ToggleStaged}               |
327| {#action git::StageAndNext}               | {#kb git::StageAndNext}               |
328| {#action git::UnstageAndNext}             | {#kb git::UnstageAndNext}             |
329| {#action git::Commit}                     | {#kb git::Commit}                     |
330| {#action git::ExpandCommitEditor}         | {#kb git::ExpandCommitEditor}         |
331| {#action git::Push}                       | {#kb git::Push}                       |
332| {#action git::ForcePush}                  | {#kb git::ForcePush}                  |
333| {#action git::Pull}                       | {#kb git::Pull}                       |
334| {#action git::PullRebase}                 | {#kb git::PullRebase}                 |
335| {#action git::Fetch}                      | {#kb git::Fetch}                      |
336| {#action git::Diff}                       | {#kb git::Diff}                       |
337| {#action git::Restore}                    | {#kb git::Restore}                    |
338| {#action git::RestoreFile}                | {#kb git::RestoreFile}                |
339| {#action git::Branch}                     | {#kb git::Branch}                     |
340| {#action git::Switch}                     | {#kb git::Switch}                     |
341| {#action git::CheckoutBranch}             | {#kb git::CheckoutBranch}             |
342| {#action git::Blame}                      | {#kb git::Blame}                      |
343| {#action git::StashAll}                   | {#kb git::StashAll}                   |
344| {#action git::StashPop}                   | {#kb git::StashPop}                   |
345| {#action git::StashApply}                 | {#kb git::StashApply}                 |
346| {#action git::ViewStash}                  | {#kb git::ViewStash}                  |
347| {#action editor::ToggleGitBlameInline}    | {#kb editor::ToggleGitBlameInline}    |
348| {#action editor::ExpandAllDiffHunks}      | {#kb editor::ExpandAllDiffHunks}      |
349| {#action editor::ToggleSelectedDiffHunks} | {#kb editor::ToggleSelectedDiffHunks} |
350
351> Not all actions have default keybindings, but can be bound by [customizing your keymap](./key-bindings.md#user-keymaps).
352
353## Git CLI Configuration
354
355If you would like to also use Zed for your [git commit message editor](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#_core_editor) when committing from the command line you can use `zed --wait`:
356
357```sh
358git config --global core.editor "zed --wait"
359```
360
361Or add the following to your shell environment (in `~/.zshrc`, `~/.bashrc`, etc):
362
363```sh
364export GIT_EDITOR="zed --wait"
365```