Git 合并与超越

问题描述 投票:0回答:3

我最近购买了 Beyond Compare Pro 来合并与

git
共享的代码(我对其了解非常有限)。 我现在有两个分支,一个
master
和一个
feature
。我最近从远程拉出了
master
,所以现在
master
master
feature
之间的共同祖先提前了一些提交。

由于我的分支

feature
大部分有删除,我想将
master
合并到
feature
中,而不是相反(这有意义吗?)。所以我基本上做到了

git checkout master
git pull origin master
git push origin master

因此,此时我的

feature
落后于一些提交,并且领先于
master
一些提交。要将
master
的提交合并到
feature
中,我做了:

git checkout feature
git merge master
git mergetool

现在系统会提示我一系列消息,例如

Deleted merge conflict for 'ED/build/make/rules.mk':
  {local}: deleted
  {remote}: modified file
Use (m)odified or (d)eleted file, or (a)bort? m

Normal merge conflict for 'ED/src/driver/ed_model.F90':
  {local}: modified file
  {remote}: modified file
merge of ED/src/driver/ed_model.F90 failed
Continue merging other unresolved paths [y/n]? y

所有其他文件都会给出失败的合并错误,甚至没有打开 BeyondCompare 合并工具来进行合并。

  • 第一个提示是
    (m)odified or (d)eleted
    ,这是否意味着合并后我必须在本地和远程之间选择哪个文件?
  • 第二个提示告诉我合并失败,为什么会出现这种情况?

编辑

我的 .gitconfig 的相关部分是

[diff]
    tool = bc3
[difftool]
        prompt = false
[difftool "bc3"]
    trustExitCode = true
[core]
    fileMode = false
    symlink = false
    ignorecase = true
[merge]
    tool = bc3
[mergetool "bc3"]
    trustExitCode = true
[alias]
    difftool = difftool --dir-dif --no-symlinks
git github merge beyondcompare beyondcompare4
3个回答
4
投票

第一个提示显示 (m)odified 或 (d)eleted,这是否意味着合并后我必须在本地和远程之间选择哪个文件?

是的。也许您想选择 (d) 删除状态,假设您希望这些文件在您的

feature
分支中保持删除状态,并且不关心自您最初删除它们以来它们如何被更改。

通常您的

master
旨在始终与遥控器同步。本地更改(例如删除文件)可以像您一样在
feature
分支中正确完成,所以这很好。如果您的更改纯粹是本地的,从未打算成为主项目的永久部分,那么它们将永远保留在
feature
分支中,并且每当您从远程提取新更新时,您偶尔会从
master
合并到
feature
,正如你正在做的那样。您唯一想要从
feature
合并回
master
然后
push
的唯一时间就是为使用该项目的每个人更改一些内容。

第二个提示告诉我合并失败,为什么会出现这种情况?

  • 您是否解决了 Beyond Compare 中指出的所有冲突(在页边空白处标有“!”)?
  • 对于每一个差异,你的中间栏看起来都是你想要的吗?
  • 您保存合并的文件了吗?

如果其中任何一个的答案是“否”,那么您将返回 git,合并标记仍在文件中,这意味着“我没有完成”。换句话说,合并“失败”,意味着它没有完全成功完成。

我不会担心文件地址看起来错误。当 git 尝试解决合并时,它将三个不同的版本(远程、本地、合并)复制到三个临时文件中。当您完成编辑和合并后,它会将“合并”的文件复制回您的本地文件中。

所有其他文件都会给出失败的合并错误,甚至没有打开 BeyondCompare 合并工具来进行合并。

这看起来很奇怪。通常git会一一继续。抱歉,我无法在这里提供更多帮助。


1
投票

如果您想查看 Beyond Compare 中未解决的冲突,您可以运行

git mergetool
,这将打开与默认合并工具的冲突。如果您还没有安装 git,则必须先设置 git 才能使用 Beyond Compare。

配置说明可在此处找到。


0
投票

很抱歉几年前我没有看到这个。 我现在已经成功使用 Beyond Compare 4 Pro 进行

git difftool
git mergetool
多年了。 以下是如何在 .gitconfig 中进行设置。 如果您仍在使用 BC3,请将“bc3”替换为“bc4”,这样就可以正常工作了。 BC3 和现在的 BC4 都进行非常直观的三向合并,并且可以与 git for Windows 完美配合。

您可以使用以下命令进行设置。

$ git config --global diff.tool bc4
$ git config --global diff.guitool bc4
$ git config --global merge.tool bc4
$ git config --global merge.guitool bc4
$ git config --global difftool.prompt true
$ git config --global mergetool.prompt true
$ git config --global mergetool.keepBackup true
etc.

但我更喜欢只编辑 .gitconfig 文件。 如果这样做,请确保“子”项目(位于部分标记下方)恰好有 1 个前导制表符,并且部分标记从第 1 列开始。

-----我在 BC4 上的 .gitconfig 部分----------

[diff]
    tool = bc4
    guitool = bc4
[merge]
    tool = bc4
    guitool = bc4
[difftool]
    prompt = true
[difftool "bc4"]
    trustExitCode = true
    path = C:/Program Files/Beyond Compare 4/BComp.exe
    cmd = "C:/Program Files/Beyond Compare 4/BComp.exe" "$LOCAL" "$REMOTE"
[mergetool]
    prompt = true
    keepBackup = true
[mergetool "bc4"]
    trustExitCode = true
    path = C:/Program Files/Beyond Compare 4/BComp.exe
    cmd = "C:/Program Files/Beyond Compare 4/BComp.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"

------结束.gitconfig----------------------

trustExitCode
项告诉 Git 在合并时注意 bc4 退出代码。 如果在合并步骤期间在 GUI 中退出 bc4 而不保存合并的代码,那么它将以非零退出代码退出,并且 Git 将不会使用生成的合并代码。 另一方面,如果您保存了合并代码并解决了所有合并,则 bc4 将以零退出代码退出,指示 Git 接受生成的合并代码,并将其合并到即将进行的合并提交中。

我使用的是Windows系统。 如果您使用的是 Linux 系统,您可能需要进行路径调整。

这个网页帮助我发现了所有这些并进行了设置:

https://www.scootersoftware.com/kb/vcs

© www.soinside.com 2019 - 2024. All rights reserved.