git如何解决冲突?

Posted Wis57

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了git如何解决冲突?相关的知识,希望对你有一定的参考价值。

git如何解决冲突?

一、什么情况下会产生冲突?

当多个开发者同时使用或者操作 git 中的同一个文件时:

  • 多个分支代码合并到一个分支;
  • 多个分支向同一个远端分支推送代码;

push操作的本质就是将本地代码merge到远端分支;同理,pull操作的本质就是将远程分支merge到本地分支。所以在进行这两种操作时,也有可能存在冲突。

有的时候解决了冲突并不意味着万事大吉,因为在某种情况下还会存在逻辑冲突。

例如:用户A修改了函数返回值,用户B依旧使用旧的返回值,虽然成功合并冲突但是却存在着逻辑冲突。

二、冲突的解决

产生冲突后,文件系统中冲突的文件里面的内容会变成类似这样:

a123
<<<<<<< HEAD
b789
=======
b45678910
>>>>>>> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc
c
1234567

其中:冲突标记<<<<<<< 与 ======= 之间的内容是我的修改 ======= 与 >>>>>>> 之间的内容是别人的修改。

可以根据情况保留修改:

保留自己的:
删除======= 与 >>>>>>> 之间的内容,然后删除<<<<<<<

保留别人的:
删除<<<<<<< 与 ======= 之间的内容,然后删除>>>>>>>

都保留:
删除<<<<<<< 、 =======、>>>>>>>

修改完之后,执行:

git add 冲突文件名
git commit -m "xxx"
git push  //直接push就可以了,因为刚刚已经执行过相关merge操作了
123

1.前提条件:不能在 master 分支上修改任何文件。master 分支的变更只能通过 git pull 和 git merge 获得。
2.我们自己有一个分支用来修改代码,例如我的分支叫做dev分支。我把代码修改完成了,现在不知道有没有冲突。
3.在 dev 分支里面,执行命令git merge origin/master,把远程的master分支合并到当前dev分支中。
4.如果没有任何报错,那么直接转到第5步。 如果有冲突,根据提示,把冲突解决,保存文件。然后执行命令git add xxx把你修改的文件添加到缓存区。然后执行命令git commit -m "xxx"添加 commit 信息。
5.执行如下命令,切换到 master 分支:git checkout master。
6.执行命令git pull确保当前 master 分支是最新代码。
7.把dev分支的代码合并回 master 分支:git merge dev。
8.提交代码:git push。

三、撤销合并

若冲突处理不到位,或者不想合并等等其他因素想要撤销合并,可以在控制台输入‘git reset --hard‘命令,合并操作就会被安全的撤销,并返回到你开始合并之前的状态。

如何解决 yarn.lock 中的 git 冲突

【中文标题】如何解决 yarn.lock 中的 git 冲突【英文标题】:How do you resolve git conflicts in yarn.lock 【发布时间】:2017-08-13 19:51:24 【问题描述】:

当多个git分支在一个使用Yarn的项目中修改依赖时,很可能会在yarn.lock文件中引入冲突。删除并重新生成 yarn.lock 文件不是一个好主意,因为这可能会导致多个包被无意升级。快速解决此文件中的冲突的最佳方法是什么?

【问题讨论】:

【参考方案1】:

Since Yarn 1.0 这很简单,因为它内置了对这种场景的支持。

首先手动解决package.json中的冲突,然后运行这个:

$ yarn install

yarn install v1.0.1
info Merge conflict detected in yarn.lock and successfully merged.
[1/4] Resolving packages...

然后冲突将得到解决,您可以提交该问题,或者如果您正在这样做,则继续重新设置基准。

【讨论】:

如果您的 yarn.lock 中包含 ============&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 等代码行存在冲突,我认为这不起作用。您仍然需要按照 Christine Schlensker 的回答所说的去做。 @theGreenCabbage 不信,试试看 你需要先解决 package.json 中的冲突,然后运行 ​​yarn,它应该会处理它 它为我打印出“成功合并”的消息,但 yarn.lock 仍然包含合并冲突。 这可行,但 webstorm 仍然显示冲突,如何将其标记为已解决?【参考方案2】:

this github discussion 中详细介绍了有关该问题的好方法。

git rebase origin/master

当第一个冲突出现时,我结帐 yarn.lock 然后重新执行安装

git checkout origin/master -- yarn.lock 
yarn install

这会生成一个 新的yarn.lock 基于 yarn.lock 的原始/主版本,但是 包括我对package.json 所做的更改。那么这只是一个问题:

git add yarn.lock
git rebase --continue

【讨论】:

对于这个和公认的答案,我必须多次重复命令,git 会得到以下结果:No changes - did you forget to use 'git add'? If there is nothing left to stage, chances are that something else already introduced the same changes; you might want to skip this patch. 我的修复以常规合并中的这些步骤结束 - 它从未在我的 rebase 上工作过。【参考方案3】:

我使用 可执行交互式 bash 脚本而不是 rebase,它只获取 Pipfile.lock Pipfile

#!/usr/bin/env bash
export GIT_TRACE=1
git checkout origin/master -- Pipfile.lock Pipfile
git commit -m "fetch to branch Pipfile.lock, Pipfile from origin/master" -- Pipfile.lock Pipfile
read  -n 1 -p "Do your changes in Pipfile and press Enter ..."
pipenv lock --clear
git commit -m "re-apply changes to Pipfile.lock, Pipfile" -- Pipfile.lock Pipfile
echo "Done"

【讨论】:

【参考方案4】:

这个文件太长了,所以如果你需要在没有终端的情况下检查 vscode 中的冲突,也许你可以尝试在这个文件中搜索以下术语:&gt;&gt;&gt;&gt;&gt;&gt;&gt;=======&lt;&lt;&lt;&lt;&lt;&lt;&lt;HEAD

【讨论】:

以上是关于git如何解决冲突?的主要内容,如果未能解决你的问题,请参考以下文章

[git] github 推送以及冲突的解决

git之github解决冲突

怎样解决Ubuntu系统中git每次提交都要输入密码

git服务器创建,冲突解决

git 本地与远程仓库出现代码冲突解决方法

git 如何去解决冲突