Меню

git merge tool настройка

Git on Windows: Как настроить mergetool?

Я пробовал msysGit и Git на Cygwin. Оба работают просто отлично сами по себе, и оба отлично работают с gitk и Git-gui.

теперь как, черт возьми, я могу настроить mergetool? (Vimdiff работает на Cygwin, но предпочтительно я хотел бы что-то более удобное для некоторых из наших сотрудников, любящих Windows.)

18 ответов:

чтобы следить за ответом Чарльза Бейли, вот моя настройка git, которая использует p4merge (бесплатный кросс-платформенный инструмент слияния 3 исхода); испытания на префикса msys ЖКТ (для Windows) установите:

или из командлета windows.exe оболочка, вторая строка становится:

изменения (относительно Чарльза Бейли):

  • добавлен в глобальную конфигурацию git, т. е. действителен для всех проектов git, а не только для текущего
  • конфигурация пользовательского инструмента значение находится в «mergetool.[инструмент.]cmd», а не » слияние.[инструмент.]cmd «(глупый я, потратил час на устранение неполадок, почему git продолжал жаловаться на несуществующий инструмент)
  • добавлены двойные кавычки для всех имен файлов, чтобы файлы с пробелами все еще можно было найти с помощью инструмента слияния (я тестировал это в msys Git из Powershell)
  • обратите внимание, что по умолчанию Perforce добавит свой установочный dir в PATH, поэтому нет необходимости указывать полный путь к p4merge в команда

EDIT (февраль 2014)

как указал @Gregory Pakosz, последний msys git теперь «нативно» поддерживает p4merge (проверено на 1.8.5.2.msysgit.0).

вы можете отобразить список поддерживаемых инструментов с помощью работает:

вы должны увидеть p4merge либо скачать или действительный список. Если нет, пожалуйста, обновите свой git.

если p4merge значится как скачать, это в ваш путь и вам нужно только установить слияние.инструмент:

если он был указан как действительный, вы должны определить mergetool.p4merge.путь in дополнение к слияние.инструмент:

  • выше приведен пример пути, когда p4merge был установлен для текущего пользователя, а не для всей системы (не нужны права администратора или Повышение уровня UAC)
  • хотя

следует расширить до домашнего каталога текущего пользователя (так что теоретически путь должен быть

/AppData/Local/Perforce/p4merge.exe ), это не сработало для меня

  • еще лучше было бы воспользоваться переменной среды (например, $LOCALAPPDATA/Perforce/p4merge.exe ), git не кажется чтобы расширить переменные среды для путей (если вы знаете, как заставить это работать, пожалуйста, дайте мне знать или обновить этот ответ)
  • настройки mergetool.p4merge.cmd больше не будет работать, так как Git начал пытаться поддерживать p4merge, см. libexec/git-core / git-mergetool—lib. поэтому нам просто нужно указать путь mergetool для git,например p4merge:

    Я использую портативный Git на WinXP (работает удовольствие!), и нужно было решить конфликт, который возник в ветвлении. Из всех gui я проверил,KDiff3 оказался самым прозрачным в использовании.

    но я нашел инструкции, которые мне нужны, чтобы заставить его работать в Windows в этот блог, инструкции, которые немного отличаются от других подходов, перечисленных здесь. Это в основном сводилось к добавлению этих строк в мой .gitconfig файл:

    под Cygwin, the только вещь, которая работала для меня является следующее:

    кроме того, мне нравится отключать подсказку для difftool:

    git mergetool полностью настраивается, так что вы можете в значительной степени выбрать свой любимый инструмент.

    короче говоря, вы можете установить mergetool по умолчанию, установив переменную конфигурации пользователя merge.tool .

    если инструмент слияния является одним из тех, которые поддерживаются изначально им, вам просто нужно установить mergetool. .path к полному пути к инструменту (заменить by то, что вы настроили merge.tool быть.

    в противном случае, вы можете установить mergetool. .cmd немного оболочки, которая будет оценена во время выполнения с переменными оболочки $BASE, $LOCAL, $REMOTE, $MERGED установите соответствующие файлы. Вы должны быть немного осторожны с экранированием, если вы непосредственно редактируете файл конфигурации или устанавливаете переменную с помощью .

    что-то вроде этого должно дать аромат того, что вы можете сделать («mymerge» — это вымышленный инструмент).

    после установки ваш любимый инструмент слияния, это просто вопрос работает git mergetool когда у вас есть конфликты разрешать.

    инструмент p4merge от Perforce-это довольно хороший автономный инструмент слияния.

    Кажется, что новые версии git поддерживают p4merge напрямую, поэтому

    должно быть все, что вам нужно, если p4merge.ехе на вашем пути. Нет необходимости настраивать cmd или путь.

    источник

    karenyyng / Git_mergetool_tutorial.md

    Skip to the relevant sections if needed.

    Concepts for resolving Git conflicts

    For using mergetool in git , we need to understand the following terminology to understand what is being merged:

    • LOCAL — the head for the file(s) from the current branch on the machine that you are using.
    • REMOTE — the head for files(s) from a remote location that you are trying to merge into your LOCAL branch.
    • BASE — the common ancestor(s) of LOCAL and BASE .
    • MERGED — the tag / HEAD object after the merge — this is saved as a new commit.

    Common mergetool from editors will display both LOCAL and REMOTE so you can decide which changes to keep. Please read this tutorial explaining the HEAD objects if you do not know what it is. It will help your understanding of Git tremendously.

    Setting up different editors / tool for using git mergetool

    We have to change the git config to set a default mergetool. In this example, we will use vimdiff :

    We can also set the editor to display the common ancestor BASE while we examine what changes are in LOCAL and REMOTE with the following setting:

    Finding out what mergetool editors are supported

    And we list a few of them:

    Command line mergetool editors

    • gvimdiff — almost identical to vimdiff but uses the Linux GUI for Vim , please refer to vimdiff if you still use the keyboard commands for GVim .
    • kdiff3
    • meld
    • tortoisemerge

    Or consult the community of your favorite editor to see how to do the equivalent operations for your editor.

    Other useful mergetool settings

    Do not prompt before launching the merge resolution tool

    mergetool simple code example

    Add some galaxy types into astrophy_obj.txt then save the file.

    save then commit the file.

    Change bar to barred in the file.

    Then you will see some error messages:

    We can bring up the mergetool :

    Then it will bring up the different versions of the file in different Vim splits panels.

    The top left split panel is the LOCAL , top middle split is BASE and top right split is REMOTE . The bottom split refers to the MERGED version. You can find this info in the bottom bar of each split (I have put 3 yellow rectangles to highlight that info).

    As you can see form the below image, my Vim has highlighted the differences in red for me.

    Now if your terminal has any GUI capability and you have compiled Vim correctly with GUI support, you can use your mouse to click on the bottom split to edit it. Or if you are a Vim ninja, you can use the keyboard shortcut to move to different splits.

    You can either incorporate the changes by manually editing the MERGED split, or use Vim shortcuts pull from one of the LOCAL , BASE ad REMOTE versions.

    save the changes then quit with :wqa to close all the splits. Remember to commit the merge.

    Resolving conflict from a git pull

    If you were trying to do a git pull when you ran into merge conflicts, follow all steps in the previous section for using the mergetool , then do:

    Forward-port local commits to the updated upstream HEAD.

    according to the documentation, meaning your local commits will be pushed to the upstream remote branch as a new forward commit that doesn’t interfere with previous commits. Hooray now you can claim that you can collaborate with others with Git without messing up with your collaborators’ commits.

    источник

    Git on Windows: How do you set up a mergetool?

    I’ve tried msysGit and Git on Cygwin. Both work just fine in and of themselves and both run gitk and git-gui perfectly.

    Now how the heck do I configure a mergetool? (Vimdiff works on Cygwin, but preferably I would like something a little more user-friendly for some of our Windows-loving coworkers.)

    18 Answers 18

    To follow-up on Charles Bailey’s answer, here’s my git setup that’s using p4merge (free cross-platform 3way merge tool); tested on msys Git (Windows) install:

    or, from a windows cmd.exe shell, the second line becomes :

    The changes (relative to Charles Bailey):

    • added to global git config, i.e. valid for all git projects not just the current one
    • the custom tool config value resides in «mergetool.[tool].cmd», not «merge.[tool].cmd» (silly me, spent an hour troubleshooting why git kept complaining about non-existing tool)
    • added double quotes for all file names so that files with spaces can still be found by the merge tool (I tested this in msys Git from Powershell)
    • note that by default Perforce will add its installation dir to PATH, thus no need to specify full path to p4merge in the command

    EDIT (Feb 2014)

    As pointed out by @Gregory Pakosz, latest msys git now «natively» supports p4merge (tested on 1.8.5.2.msysgit.0).

    You can display list of supported tools by running:

    You should see p4merge in either available or valid list. If not, please update your git.

    If p4merge was listed as available, it is in your PATH and you only have to set merge.tool:

    If it was listed as valid, you have to define mergetool.p4merge.path in addition to merge.tool:

    • The above is an example path when p4merge was installed for the current user, not system-wide (does not need admin rights or UAC elevation)
    • Although

    should expand to current user’s home directory (so in theory the path should be

    источник

    8.1 Customizing Git — Git Configuration

    So far, we’ve covered the basics of how Git works and how to use it, and we’ve introduced a number of tools that Git provides to help you use it easily and efficiently. In this chapter, we’ll see how you can make Git operate in a more customized fashion, by introducing several important configuration settings and the hooks system. With these tools, it’s easy to get Git to work exactly the way you, your company, or your group needs it to.

    Git Configuration

    As you read briefly in Getting Started, you can specify Git configuration settings with the git config command. One of the first things you did was set up your name and email address:

    Now you’ll learn a few of the more interesting options that you can set in this manner to customize your Git usage.

    First, a quick review: Git uses a series of configuration files to determine non-default behavior that you may want. The first place Git looks for these values is in the system-wide /etc/gitconfig file, which contains settings that are applied to every user on the system and all of their repositories. If you pass the option —system to git config , it reads and writes from this file specifically.

    The next place Git looks is the

    /.config/git/config ) file, which is specific to each user. You can make Git read and write to this file by passing the —global option.

    Finally, Git looks for configuration values in the configuration file in the Git directory ( .git/config ) of whatever repository you’re currently using. These values are specific to that single repository, and represent passing the —local option to git config . (If you don’t specify which level you want to work with, this is the default.)

    Each of these “levels” (system, global, local) overwrites values in the previous level, so values in .git/config trump those in /etc/gitconfig , for instance.

    Git’s configuration files are plain-text, so you can also set these values by manually editing the file and inserting the correct syntax. It’s generally easier to run the git config command, though.

    Basic Client Configuration

    The configuration options recognized by Git fall into two categories: client-side and server-side. The majority of the options are client-side — configuring your personal working preferences. Many, many configuration options are supported, but a large fraction of them are useful only in certain edge cases; we’ll cover just the most common and useful options here. If you want to see a list of all the options your version of Git recognizes, you can run

    This command lists all the available options in quite a bit of detail. You can also find this reference material at https://git-scm.com/docs/git-config.

    core.editor

    By default, Git uses whatever you’ve set as your default text editor via one of the shell environment variables VISUAL or EDITOR , or else falls back to the vi editor to create and edit your commit and tag messages. To change that default to something else, you can use the core.editor setting:

    Now, no matter what is set as your default shell editor, Git will fire up Emacs to edit messages.

    commit.template

    If you set this to the path of a file on your system, Git will use that file as the default initial message when you commit. The value in creating a custom commit template is that you can use it to remind yourself (or others) of the proper format and style when creating a commit message.

    For instance, consider a template file at

    /.gitmessage.txt that looks like this:

    Note how this commit template reminds the committer to keep the subject line short (for the sake of git log —oneline output), to add further detail under that, and to refer to an issue or bug tracker ticket number if one exists.

    To tell Git to use it as the default message that appears in your editor when you run git commit , set the commit.template configuration value:

    Then, your editor will open to something like this for your placeholder commit message when you commit:

    If your team has a commit-message policy, then putting a template for that policy on your system and configuring Git to use it by default can help increase the chance of that policy being followed regularly.

    core.pager

    This setting determines which pager is used when Git pages output such as log and diff . You can set it to more or to your favorite pager (by default, it’s less ), or you can turn it off by setting it to a blank string:

    If you run that, Git will page the entire output of all commands, no matter how long they are.

    user.signingkey

    If you’re making signed annotated tags (as discussed in Signing Your Work), setting your GPG signing key as a configuration setting makes things easier. Set your key ID like so:

    Now, you can sign tags without having to specify your key every time with the git tag command:

    core.excludesfile

    You can put patterns in your project’s .gitignore file to have Git not see them as untracked files or try to stage them when you run git add on them, as discussed in Ignoring Files.

    But sometimes you want to ignore certain files for all repositories that you work with. If your computer is running macOS, you’re probably familiar with .DS_Store files. If your preferred editor is Emacs or Vim, you know about filenames that end with a

    This setting lets you write a kind of global .gitignore file. If you create a

    /.gitignore_global file with these contents:

    …and you run git config —global core.excludesfile

    /.gitignore_global , Git will never again bother you about those files.

    help.autocorrect

    If you mistype a command, it shows you something like this:

    Git helpfully tries to figure out what you meant, but it still refuses to do it. If you set help.autocorrect to 1, Git will actually run this command for you:

    Note that “0.1 seconds” business. help.autocorrect is actually an integer which represents tenths of a second. So if you set it to 50, Git will give you 5 seconds to change your mind before executing the autocorrected command.

    Colors in Git

    Git fully supports colored terminal output, which greatly aids in visually parsing command output quickly and easily. A number of options can help you set the coloring to your preference.

    color.ui

    Git automatically colors most of its output, but there’s a master switch if you don’t like this behavior. To turn off all Git’s colored terminal output, do this:

    The default setting is auto , which colors output when it’s going straight to a terminal, but omits the color-control codes when the output is redirected to a pipe or a file.

    You can also set it to always to ignore the difference between terminals and pipes. You’ll rarely want this; in most scenarios, if you want color codes in your redirected output, you can instead pass a —color flag to the Git command to force it to use color codes. The default setting is almost always what you’ll want.

    color.*

    If you want to be more specific about which commands are colored and how, Git provides verb-specific coloring settings. Each of these can be set to true , false , or always :

    In addition, each of these has subsettings you can use to set specific colors for parts of the output, if you want to override each color. For example, to set the meta information in your diff output to blue foreground, black background, and bold text, you can run

    You can set the color to any of the following values: normal , black , red , green , yellow , blue , magenta , cyan , or white . If you want an attribute like bold in the previous example, you can choose from bold , dim , ul (underline), blink , and reverse (swap foreground and background).

    External Merge and Diff Tools

    Although Git has an internal implementation of diff, which is what we’ve been showing in this book, you can set up an external tool instead. You can also set up a graphical merge-conflict-resolution tool instead of having to resolve conflicts manually. We’ll demonstrate setting up the Perforce Visual Merge Tool (P4Merge) to do your diffs and merge resolutions, because it’s a nice graphical tool and it’s free.

    If you want to try this out, P4Merge works on all major platforms, so you should be able to do so. We’ll use path names in the examples that work on macOS and Linux systems; for Windows, you’ll have to change /usr/local/bin to an executable path in your environment.

    To begin, download P4Merge from Perforce. Next, you’ll set up external wrapper scripts to run your commands. We’ll use the macOS path for the executable; in other systems, it will be where your p4merge binary is installed. Set up a merge wrapper script named extMerge that calls your binary with all the arguments provided:

    The diff wrapper checks to make sure seven arguments are provided and passes two of them to your merge script. By default, Git passes the following arguments to the diff program:

    Because you only want the old-file and new-file arguments, you use the wrapper script to pass the ones you need.

    You also need to make sure these tools are executable:

    Now you can set up your config file to use your custom merge resolution and diff tools. This takes a number of custom settings: merge.tool to tell Git what strategy to use, mergetool. .cmd to specify how to run the command, mergetool. .trustExitCode to tell Git if the exit code of that program indicates a successful merge resolution or not, and diff.external to tell Git what command to run for diffs. So, you can either run four config commands

    /.gitconfig file to add these lines:

    After all this is set, if you run diff commands such as this:

    Instead of getting the diff output on the command line, Git fires up P4Merge, which looks something like this:

    If you try to merge two branches and subsequently have merge conflicts, you can run the command git mergetool ; it starts P4Merge to let you resolve the conflicts through that GUI tool.

    The nice thing about this wrapper setup is that you can change your diff and merge tools easily. For example, to change your extDiff and extMerge tools to run the KDiff3 tool instead, all you have to do is edit your extMerge file:

    Now, Git will use the KDiff3 tool for diff viewing and merge conflict resolution.

    Git comes preset to use a number of other merge-resolution tools without your having to set up the cmd configuration. To see a list of the tools it supports, try this:

    If you’re not interested in using KDiff3 for diff but rather want to use it just for merge resolution, and the kdiff3 command is in your path, then you can run

    If you run this instead of setting up the extMerge and extDiff files, Git will use KDiff3 for merge resolution and the normal Git diff tool for diffs.

    Formatting and Whitespace

    Formatting and whitespace issues are some of the more frustrating and subtle problems that many developers encounter when collaborating, especially cross-platform. It’s very easy for patches or other collaborated work to introduce subtle whitespace changes because editors silently introduce them, and if your files ever touch a Windows system, their line endings might be replaced. Git has a few configuration options to help with these issues.

    core.autocrlf

    If you’re programming on Windows and working with people who are not (or vice-versa), you’ll probably run into line-ending issues at some point. This is because Windows uses both a carriage-return character and a linefeed character for newlines in its files, whereas macOS and Linux systems use only the linefeed character. This is a subtle but incredibly annoying fact of cross-platform work; many editors on Windows silently replace existing LF-style line endings with CRLF, or insert both line-ending characters when the user hits the enter key.

    Git can handle this by auto-converting CRLF line endings into LF when you add a file to the index, and vice versa when it checks out code onto your filesystem. You can turn on this functionality with the core.autocrlf setting. If you’re on a Windows machine, set it to true — this converts LF endings into CRLF when you check out code:

    If you’re on a Linux or macOS system that uses LF line endings, then you don’t want Git to automatically convert them when you check out files; however, if a file with CRLF endings accidentally gets introduced, then you may want Git to fix it. You can tell Git to convert CRLF to LF on commit but not the other way around by setting core.autocrlf to input:

    This setup should leave you with CRLF endings in Windows checkouts, but LF endings on macOS and Linux systems and in the repository.

    If you’re a Windows programmer doing a Windows-only project, then you can turn off this functionality, recording the carriage returns in the repository by setting the config value to false :

    core.whitespace

    Git comes preset to detect and fix some whitespace issues. It can look for six primary whitespace issues — three are enabled by default and can be turned off, and three are disabled by default but can be activated.

    The three that are turned on by default are blank-at-eol , which looks for spaces at the end of a line; blank-at-eof , which notices blank lines at the end of a file; and space-before-tab , which looks for spaces before tabs at the beginning of a line.

    The three that are disabled by default but can be turned on are indent-with-non-tab , which looks for lines that begin with spaces instead of tabs (and is controlled by the tabwidth option); tab-in-indent , which watches for tabs in the indentation portion of a line; and cr-at-eol , which tells Git that carriage returns at the end of lines are OK.

    You can tell Git which of these you want enabled by setting core.whitespace to the values you want on or off, separated by commas. You can disable an option by prepending a — in front of its name, or use the default value by leaving it out of the setting string entirely. For example, if you want all but space-before-tab to be set, you can do this (with trailing-space being a short-hand to cover both blank-at-eol and blank-at-eof ):

    Or you can specify the customizing part only:

    Git will detect these issues when you run a git diff command and try to color them so you can possibly fix them before you commit. It will also use these values to help you when you apply patches with git apply . When you’re applying patches, you can ask Git to warn you if it’s applying patches with the specified whitespace issues:

    Or you can have Git try to automatically fix the issue before applying the patch:

    These options apply to the git rebase command as well. If you’ve committed whitespace issues but haven’t yet pushed upstream, you can run git rebase —whitespace=fix to have Git automatically fix whitespace issues as it’s rewriting the patches.

    Server Configuration

    Not nearly as many configuration options are available for the server side of Git, but there are a few interesting ones you may want to take note of.

    receive.fsckObjects

    Git is capable of making sure every object received during a push still matches its SHA-1 checksum and points to valid objects. However, it doesn’t do this by default; it’s a fairly expensive operation, and might slow down the operation, especially on large repositories or pushes. If you want Git to check object consistency on every push, you can force it to do so by setting receive.fsckObjects to true:

    Now, Git will check the integrity of your repository before each push is accepted to make sure faulty (or malicious) clients aren’t introducing corrupt data.

    receive.denyNonFastForwards

    If you rebase commits that you’ve already pushed and then try to push again, or otherwise try to push a commit to a remote branch that doesn’t contain the commit that the remote branch currently points to, you’ll be denied. This is generally good policy; but in the case of the rebase, you may determine that you know what you’re doing and can force-update the remote branch with a -f flag to your push command.

    To tell Git to refuse force-pushes, set receive.denyNonFastForwards :

    The other way you can do this is via server-side receive hooks, which we’ll cover in a bit. That approach lets you do more complex things like deny non-fast-forwards to a certain subset of users.

    receive.denyDeletes

    One of the workarounds to the denyNonFastForwards policy is for the user to delete the branch and then push it back up with the new reference. To avoid this, set receive.denyDeletes to true:

    This denies any deletion of branches or tags — no user can do it. To remove remote branches, you must remove the ref files from the server manually. There are also more interesting ways to do this on a per-user basis via ACLs, as you’ll learn in An Example Git-Enforced Policy.

    источник

    Читайте также:  освещение vray мои настройки

    Добавить комментарий

    Adblock
    detector