如何解决EGit中的冲突

时间:2014-02-04 17:19:40

标签: eclipse git egit

我在Eclipse v4.3(开普勒)上使用EGit。我想承诺并推动我的改变。我先拉,一个文件冲突。在手动解决冲突之后(本地和远程现在一样),我仍然遇到问题。

以下是每项操作的错误消息:

推送到上游

  

master:master [拒绝 - 非快进]

拉​​

  

无法使用州:MERGING_RESOLVED

进入存储库

标记为合并

  

无法向索引添加资源无法将资源添加到索引执行add命令期间捕获的异常

硬重置

  

在“重置为refs / heads / master”期间发生内部错误。   执行reset命令时捕获异常。 {0}

如何删除冲突并推送我的更改?我做错了什么?

10 个答案:

答案 0 :(得分:74)

您使用的是团队同步视图吗?如果是这样的话就是问题所在。团队同步视图中的冲突解决方案不适用于EGit。相反,您需要使用Git Repository视图。

打开Git视角。在Git Repository视图中,转到 Branches Local master ,然后右键单击→ Merge ...

应自动选择远程跟踪origin/master。按合并

应显示result:conflict

打开冲突的文件。他们应该有一个旧的sk000l>>>> =====<<<<样式合并文件中的冲突。编辑文件以解决冲突,然后保存。

现在进入Git Staging'在视图中,它应该在“未分级更改”中显示已更改的文件。右键点击' 添加到索引'

Enter image description here

重复任何剩余的文件。

现在来自' git staging'查看,提交和推送。由于Git / Eclipse现在知道您已将远程原点更改合并到主服务器中,因此应避免出现非快进错误。

答案 1 :(得分:23)

我也发现解决EGit中的合并冲突很困惑。当我准备好对共享存储库进行一些更改时,我学到的步骤如下:

  1. 右键单击项目并选择Team:Commit ....
  2. 检查我的更改以检查我是否未提交任何我意外发生的更改或我忘记的无关更改。在我查看更改时写下提交消息。
  3. 我很乐观,所以我先点击“提交”和“推送”按钮。如果没有其他人推动任何改变,我已经完成了。如果有人,则提交成功,推送被拒绝。
  4. 右键单击该项目,然后选择Team:Pull。如果没有冲突,那么选择Team:Push to Upstream,我已经完成了。
  5. 如果存在冲突,请查看软件包资源管理器以查看哪些文件存在冲突。右键单击每个冲突的文件,然后选择Team:Merge Tool。它将显示文件的两个版本中的所有更改,任何冲突都显示为红色。单击按钮以合并所有非冲突更改,然后手动编辑任何红色部分。还有一个显示三向合并的按钮,包括共同的祖先。
  6. 将更改保存到文件中。如果您愿意,可以将其与HEAD进行比较,看看您刚刚提取的更改所做的更改。
  7. 右键单击该文件并选择Team:Add to Index告诉EGit您已完成合并该文件。对我来说,这是最不直观的一步,但git命令行也使用add命令来显示合并已完成。
  8. 对任何其他冲突的文件重复。
  9. 合并所有文件后,右键单击项目并选择Team:Rebase:Continue Rebase。如果有更多冲突的提交,请回到处理冲突。
  10. 当rebase完成后,运行测试以查看rebase没有破坏任何内容。
  11. 右键单击该项目,然后选择Team:Push to Upstream。

答案 2 :(得分:6)

本指南对我有帮助 http://wiki.eclipse.org/EGit/User_Guide#Resolving_a_merge_conflict

已更新 关于我的程序只是一个注释,这就是我的进展:

  1. 提交我的更改
  2. 获取(Syncrhonize工作区)
  3. 使用合并工具管理冲突(Team->合并工具)并保存
  4. 将每个文件添加到舞台(团队 - >添加到索引)
  5. 现在,舞台窗口中的“提交消息”预先填充了“合并XXX”。您可以保持原样或更改提交消息
  6. 提交并推送
  7. 在某些情况下这很危险,但避免使用Git Extension或Source Tree等外部工具非常有用

答案 3 :(得分:3)

我知道这是一篇较旧的帖子,但我遇到了类似的问题,并且能够解决它,所以我想我会分享。

更新:如下面的评论中所述,此答案是在将#34; git stash"功能纳入eGit之前。)

我做的是:

  1. 复制出冲突文件的本地副本,该副本可能与上游版本有任何相同的变化。
  2. 在Eclipse中,"还原"冲突前的版本文件。
  3. 运行"拉"从远程存储库,允许所有更改同步到本地工作目录。这应该清除文档系统中的更新,只剩下你要推送的内容。
  4. 使用您复制的副本检查工作目录中冲突文件的当前版本。如果存在任何差异,请正确合并文件并在工作目录中提交该文件的版本。
  5. 现在"推"你的改变了。
  6. 希望有所帮助。

答案 4 :(得分:1)

只需右键点击冲突的文件,然后在解决冲突后将其添加到索引中。

答案 5 :(得分:0)

要解决冲突,请使用Git stash保存未提交的更改;然后下拉远程存储库更改集;然后弹出您的本地存储以重新应用您未提交的更改。

在Eclipse v4.5(Mars)中存储更改(一个相对较新的添加,不在之前的EGit中)我这样做:右键单击Git控件中的顶级Eclipse项目,选择团队,选择 Stashes ,选择 Stash Changes ; 将打开一个对话框以请求存储提交消息。

您必须使用顶级项目的上下文菜单!如果我右键单击Git控制的项目中的目录或文件,我没有得到适当的上下文菜单。

答案 6 :(得分:0)

这种方法类似于" stash"解决方案,但我认为可能会更清楚:

  1. 您当前的本地分支是" master"你有当地的变化。
  2. 同步后,有传入的更改,需要合并一些文件。
  3. 所以,第一步是切换到一个新的本地分支(比如" my_changes"):
    • 团队 - >切换到 - >新分行
      • 分支名称:my_changes(例如)
  4. 切换到新分支后,仍然存在未提交的本地更改。因此,将所有本地未提交的更改提交到新分支" my_changes":
  5. 切换回本地"主人"科:
    • 团队 - >切换到 - >主
  6. 现在,当您选择团队时 - >同步工作区,没有"合并"文件应该出现。
  7. 选择团队 - >拉
    • 现在是本地"主人"分支是关于远程" master"的最新信息。分支。
  8. 现在,有两种选择:
    • 选项1:
      • 选择团队 - &gt;合并以合并来自&#34; my_changes&#34;的原始本地更改;本地分支进入&#34; master&#34;当地分公司。<​​/ li>
      • 现在将上一步的传入更改提交到本地&#34; master&#34;分支并将它们推送到遥控器&#34; master&#34;分支。
    • 选项2:
      • 再次切换到&#34; my_changes&#34;当地分公司。<​​/ li>
      • 合并来自本地&#34; master&#34;的更新分支到&#34; my_changes&#34;分支。
      • 在&#34; my_changes&#34;中继续执行当前任务。分支。
      • 完成任务后,使用上面的选项1更新本地&#34; master&#34;分支机构以及远程分支机构。

答案 7 :(得分:0)

由于这是我们经常遇到的问题,下面是解决问题的步骤。

  1. 打开Git视角。在Git Repository视图中,转到 在分支本地上,右键单击→合并 ...

  2. 应自动选择远程跟踪→* origin / master。按合并

  3. 在Eclipse中启动阶段视图。

  4. 双击最初显示冲突的文件

  5. 在冲突合并视图中,通过从左到右选择所有非冲突+冲突更改的左箭头,您可以解决所有冲突。

  6. 保存合并文件。

  7. 做一个团队→再次从Eclipse中撤出。

  8. 你们都准备好了:)

答案 8 :(得分:0)

几年前,在Eclipse中(通过暂存视图)解决冲突的较早过程似乎更加直观,因此该工具不再像以前那样起作用,或者我记得解决合并的过程 SVN 存储库中发生冲突。无论如何,在有冲突的文件上单击鼠标右键时,都有一个漂亮的“标记为合并”菜单选项。

快进到2019年,我正在Eclipse(v4.11)中使用“ Git Staging ”视图。实际上,我正在使用 STS (Spring Tool Suite 3.9.8),但我认为Git Staging视图是用于处理基于Java / Spring的项目的标准Eclipse插件。我会分享以下方法,以防其他人感到不适,并且因为我变得疲倦或从GIT命令行解决合并冲突。 ;-)

因为我记得的功能现在已经不存在(或者可能与当前版本的GIT和Eclipse有所不同),所以下面是我现在要使用GIT存储库通过Eclipse解决合并冲突的当前步骤。对我来说,这似乎是最直观的。显然,从这里的响应数量可以明显看出,有许多种方法可以解决合并冲突。也许我只需要使用其三向合并工具切换到JetBrains IntelliJ

  1. 双击有问题的文件
  2. 出现一个“文本比较”界面,并带有冲突提交的并排视图。
  3. 确定哪个视图是文件的本地状态或最新提交。
  4. 对本地窗口进行更改,从有问题的提交中添加或删除更改。
  5. 在查看并更新了所需的更改集后,右键单击未暂存的文件。
  6. 单击“添加到索引”选项,您的文件将被添加到分阶段的更改中。
  7. 这还会从未暂存的列表中删除有冲突的文件,从而表明该文件已被“标记为合并”。
  8. 在每个其他文件有冲突的情况下继续此过程。
  9. 撤消所有冲突文件后,请确认已暂存所有所需文件(包括其他更改)。
  10. 添加适当的提交消息。
  11. 提交“合并的”文件并将其推送到原始存储库,这正式将您的文件标记为已合并。

注意:由于菜单选项不直观,因此许多事情可能会引起误解。例如,如果您已在本地保存任何更新,并尝试重新打开冲突的文件以确认并且所做的更改已保留,则由于打开了原始冲突状态而不是您的更改,可能导致混乱。

但是将文件添加到索引后,您将在那里看到更改。

我还建议当您引入导致合并冲突的更改时,请先“存储”本地更改,然后再将其存储。至少作为保护,至少在使用GIT时,不允许您进行外部更改,除非您还原或存储更改。如果更改不重要,则放弃并恢复为HEAD状态,否则将其隐藏。

最后,如果仅更改一个或两个文件,则考虑将它们拉入单独的文本文件作为参考,然后还原到HEAD,然后在进行更改时手动更新文件。

答案 9 :(得分:-1)

GIT具有解决冲突的最恼人的方式(与svn不同,在svn中,您可以简单地比较并进行更改)。我强烈认为git具有复杂的冲突解决过程。如果要解决,我只需要从GIT中获取另一个代码作为新代码,添加我的更改并提交即可。它简单而不是面向过程的。