Change:
It does not currently appear possible to merge local git branches in VS Code. Quite a common workflow is to have a "development" branch to develop new features on (or alternatively have feature specific branches). When the development is finished, the development branch is then merged into the "master" branch before release. This can be done via the integrated terminal, but as VS Code's git implementation is so wizzy, it would be great to be able to replicate this workflow using the GUI.
I can't believe there aren't more for this... what are the current alternatives? An extension, or have you guys set up a task for this?
+1, I think that feature might be considered priority for the git extension, it's a really nice implementation and with merging, would be perfect. No news?
It'd be lovely to be able to trigger a merge from the command palette, e.g. cmd + shift + p Select a branch to merge from via search-dropdown Any opportunity to avoid having to dip back into the command line is lovely. Thanks in advance!
Weird it is still not implemented and even weirder since we can create and change branch. It spoils the git integration in Code as if the feature was unfinished. We can still rely on built-in terminal or extension but it is not a consistent Code workflow Same for git stash
I also would like to see a Git Merge implemented eventually without going in the console. you might be interested to know that there's an open PR to which will hopefully land soon. There's actually also a PR for but changes were asked over a month ago and it wasn't done yet, so it might not land.
Fixed in

Discussion:
"category": "Git" }, { <ins> "command": "git.merge", "title": "%command.merge%", "category": "Git" }, { </ins> "command": "git.pull", "title": "%command.pull%", "category": "Git"

"command.undoCommit": "Undo Last Commit", "command.checkout": "Checkout to...", "command.branch": "Create Branch...", <ins> "command.merge": "Merge Branch...", </ins> "command.pull": "Pull", "command.pullRebase": "Pull (Rebase)", "command.push": "Push",

} } <ins> class MergeItem implements QuickPickItem { get label(): string { return this.ref.name || ''; } get description(): string { return this.ref.name || ''; } constructor(protected ref: Ref) { } } </ins> interface Command { commandId: string; key: string;

.map(ref => new CheckoutRemoteHeadItem(ref)); const picks = [...heads, ...tags, ...remoteHeads]; <del> const placeHolder = 'Select a ref to checkout'; </del> <ins> const placeHolder = localize('select a ref to checkout', 'Select a ref to checkout'); </ins> const choice = await window.showQuickPick<CheckoutItem>(picks, { placeHolder }); if (!choice) {

await this.model.branch(name); } <ins> @command('git.merge') async merge(): Promise<void> { const config = workspace.getConfiguration('git'); const checkoutType = config.get<string>('checkoutType') || 'all'; const includeRemotes = checkoutType === 'all' || checkoutType === 'remote'; const heads = this.model.refs.filter(ref => ref.type === RefType.Head) .map(ref => new MergeItem(ref)); const remoteHeads = (includeRemotes ? this.model.refs.filter(ref => ref.type === RefType.RemoteHead) : []) .map(ref => new MergeItem(ref)); const picks = [...heads, ...remoteHeads]; const placeHolder = localize('select a branch to merge from', 'Select a branch to merge from'); const choice = await window.showQuickPick<MergeItem>(picks, { placeHolder }); if (!choice) { return; } await this.model.merge(choice.label); } </ins> @command('git.pull') async pull(): Promise<void> { const remotes = this.model.remotes;

await this.run(args); } <ins> async merge(name: string): Promise<void> { const args = ['merge', name]; await this.run(args); } </ins> async clean(paths: string[]): Promise<void> { const pathsByGroup = groupBy(paths, p => path.dirname(p)); const groups = Object.keys(pathsByGroup).map(k => pathsByGroup[k]);

Init = 1 << 12, Show = 1 << 13, Stage = 1 << 14, <del> GetCommitTemplate = 1 << 15 </del> <ins> GetCommitTemplate = 1 << 15, Merge = 1 << 16 </ins> } // function getOperationName(operation: Operation): string {

await this.run(Operation.Branch, () => this.repository.branch(name, true)); } <ins> async merge(name: string): Promise<void> { await this.run(Operation.Merge, () => this.repository.merge(name)); } </ins> async checkout(treeish: string): Promise<void> { await this.run(Operation.Checkout, () => this.repository.checkout(treeish, [])); }