Verwendung von Visual Studio Code als Standardeditor für Git MergeTool


120

Heute habe ich versucht, git mergetooldie Windows-Eingabeaufforderung zu verwenden, und festgestellt, dass standardmäßig Vim verwendet wird , was cool ist, aber ich würde VS-Code bevorzugen .

Wie kann ich Visual Studio Code als GUI für die Behandlung von Zusammenführungskonflikten (oder sogar als unterschiedliches Tool) für Git verwenden?

Antworten:


237

Ab Visual Studio Code 1.13 wurde Better Merge in den Kern von Visual Studio Code integriert.

Die Möglichkeit, sie miteinander zu verbinden, besteht darin, Ihre zu ändern, .gitconfigund Sie haben zwei Möglichkeiten .

  1. Geben Sie dazu bei Befehlszeileneinträgen Folgendes ein : (Hinweis: Ersetzen Sie diese "unter 'Windows Git Bash, MacOS und Linux, wie von Iztok Delfin und e4rache erläutert.)

    1. git config --global merge.tool vscode
    2. git config --global mergetool.vscode.cmd "code --wait $MERGED"
    3. git config --global diff.tool vscode
    4. git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
  2. Fügen Sie dazu eine Zeile .gitconfig mit Visual Studio Code ein .

    • Führen Sie git config --global core.editor "code --wait"über die Befehlszeile aus.
    • Von hier aus können Sie den Befehl eingeben git config --global -e. Sie möchten den Code im "Extra Block" unten einfügen.

      [user]
          name = EricDJohnson
          email = cool-email@neat.org
      [gui]
          recentrepo = E:/src/gitlab/App-Custom/Some-App
      # Comment: You just added this via 'git config --global core.editor "code --wait"'
      [core]
          editor = code --wait
      # Comment: Start of "Extra Block"
      # Comment: This is to unlock Visual Studio Code as your Git diff and Git merge tool
      [merge]
          tool = vscode
      [mergetool "vscode"]
          cmd = code --wait $MERGED
      [diff]
          tool = vscode
      [difftool "vscode"]
          cmd = code --wait --diff $LOCAL $REMOTE
      # Comment: End of "Extra Block"
      

Jetzt aus Ihrem Git-Verzeichnis mit einem Konfliktlauf git mergetoolund, tada, haben Sie Visual Studio Code, der Ihnen hilft, den Zusammenführungskonflikt zu behandeln! (Stellen Sie einfach sicher, dass Sie Ihre Datei speichern, bevor Sie Visual Studio Code schließen.)

Eingehende Änderungen akzeptieren?

Weitere Informationen zum Starten codeüber die Befehlszeile finden Sie in dieser Dokumentation .

Weitere Informationen in git mergetoolCheck - out diese Dokumentation .


3
Über <<<< Head wird eine Zeile eingefügt, in der die folgenden Optionen aufgeführt sind: "Aktuelle Änderung akzeptieren | Eingehende Änderung akzeptieren | Beide Änderungen akzeptieren | Änderungen vergleichen", und ich glaube, dass dies in jeden Abschnitt der erkannten Änderungen in der Datei eingefügt wird . Aber innerhalb eines Abschnitts, wenn Sie ein bisschen davon und ein bisschen von Hand manuell zusammenführen möchten, würden Sie diese Änderung meiner Meinung nach in Ihrem lokalen Bereich vornehmen und dann mit der Option "Aktuelle Änderung akzeptieren" fortfahren. Der Arbeitsablauf lässt Sie also einen Schritt zurücktreten, um einen Schritt vorwärts zu machen. Wenn andere dies auf andere Weise lösen, posten Sie bitte hier, um uns zu unterrichten
Eric D. Johnson

3
Ich erhalte die Fehlermeldung unknown tool: vscode... Ich bin mir ziemlich sicher, dass ich VsCode über die Befehlszeile aufrufe, die Sie codeanstelle vonvscode
Kolob Canyon

19
Auch das funktioniert bei mir nicht. Es öffnet nur VsCode und es werden nie Dateien aufgerufen
Kolob Canyon

1
Was ich tun möchte, ist "giff difftool mybranch master" und VS-Code mit dem Unterschied aller geänderten Dateien geöffnet haben. Im Moment würde es nur eines öffnen und darauf warten, dass Sie es schließen.
Pluc

1
Oh ja, das weiß ich, aber es hat nicht die Flexibilität, die ich suche, um einen Unterschied zwischen zwei Commits oder zwei Zweigen zu bekommen. Und wenn doch, ist es meiner Meinung nach ziemlich schrecklich, durch Git in vs Code zu navigieren. Ich mag nur ihre Diff und Merge UI. Ich ging und sah das git difftool -dfür ein Verzeichnis diff. Ich werde morgen überprüfen, wie das funktioniert.
Pluc

23

Ich musste die doppelten Anführungszeichen durch einfache Anführungszeichen ersetzen:

  git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

Damit es richtig funktioniert (bei doppelten Anführungszeichen werden $ LOCAL und $ REMOTE durch ihre Werte ersetzt).

Dies ist erforderlich, wenn Sie Git Bash für Windows anstelle der Windows-Eingabeaufforderung verwenden.


1
Nicht für mich. Ich habe dies gerade unter Windows mit der Eingabeaufforderung gemacht. Vielleicht verwenden Sie etwas anderes? Wenn ja, schlage ich vor, hinzuzufügen, welche Umgebung Sie verwenden, damit andere mit derselben Umgebung wissen, dass sie diese Änderung vornehmen müssen.
Todesengel

1
@ e4rache und @ Iztok-Delfin, was Sie hier aufgelistet haben, ist hilfreicher Inhalt, aber Sie haben es versehentlich zu einer Antwort gemacht, wenn es wirklich ein Kommentar ist. Ich bin mir sicher, dass Sie in Schwierigkeiten geraten sind, weil Sie nicht die 50 Punkte auf SO hatten, um Kommentare abzugeben. Dies ist eine Art Problem mit dem Site-Workflow, das möglicherweise untersucht werden sollte. Wie auch immer, danke für Ihren Beitrag und ich habe Ihren Tipp in meine Antwort oben aufgenommen. Vielen Dank für Ihre Hilfe für diejenigen, die später kommen und Git Bash verwenden:^)
Eric D. Johnson

@ Eric-D-Johnson Ich wollte unbedingt einen Kommentar anstelle einer Antwort machen. (Entschuldigung, ich bin neu auf dieser Seite) und übrigens habe ich Bash unter Linux verwendet. Gibt es eine Möglichkeit, diese Antwort in einen Kommentar umzuwandeln?
e4rache

@ e4rache Ich weiß nicht, wie ich es zu einem Kommentar machen kann, aber vielleicht wird ein Moderator dies sehen und uns einige Tipps geben (Hinweis, Hinweis). Wenn Sie die 50 Punkte hätten, könnten Sie einen Kommentar zu der akzeptierten Antwort abgeben und diese löschen. Wenn Sie also ein SO-Rockstar mit Tonnen von Punkten werden, können Sie hierher zurückkehren und alles tun, was Sie glücklich macht und zurückbringt gute Erinnerungen daran, wie alles begann.
Eric D. Johnson

1
@mohamedghonemi Gutes Feedback. Ich habe die Erklärung oben für macOS und Linux jetzt aktualisiert, um daran zu denken, einfache Anführungszeichen zu verwenden '.
Eric D. Johnson

2

Falls jemand es in Visual Studio lösen möchte, kann dies auch über Visual Studio erfolgen: Team Explorer -> Klicken Sie auf das Startsymbol => Schaltfläche Einstellungen => Git-Bereich erweitern => Klicken Sie auf Globale Einstellungen

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein


Visual Studio entspricht nicht Visual Studio Code. Die Art und Weise, wie Einstellungen wie diese vorgenommen werden, ist sehr unterschiedlich. Siehe stackoverflow.com/a/33798601 für die Unterschiede
jwd630

1
@ jwd630 Ich weiß, dass VS-Code anders ist als VS. Ich hatte dieses Problem in VS, konnte aber keine Lösung dafür finden. Daher wäre es besser, es zu veröffentlichen, falls jemand dieses Problem hat. Keine Notwendigkeit, abzustimmen.
Daniel B

2

Zusätzlich zu der hervorragenden vorhandenen Antwort sollten Sie VS-Code in einem neuen Fenster öffnen, indem Sie ihn -nzur Befehlszeile hinzufügen .

Du siehst also git config --global --editungefähr so ​​aus.

[merge]
        tool = vscode
[mergetool "vscode"]
        cmd = code -n --wait $MERGED
[diff]
        tool = vscode
[difftool "vscode"]
        cmd = code -n --wait --diff $LOCAL $REMOTE                                                    

1

Mit dem Handbuch können Sie ein interessantes Argument finden:

git difftool --help 
-x <command>, --extcmd=<command>
       Specify a custom command for viewing diffs.  git-difftool ignores the configured defaults and runs $command $LOCAL $REMOTE when this option is specified.
       Additionally, $BASE is set in the environment.

Mit diesen Informationen können Sie einfach den folgenden Befehl verwenden, ohne die Git-Konfiguration zu berühren:

git difftool -x "code --wait --diff" 

Ähnliche Frage hier

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.