草庐IT

关于GIT解决冲突

刺客码 2023-05-27 原文

一. 认识Git冲突

变更与冲突

Git控制下的文件变更,有三种:新加,修改,删除

Git控制下的文件内容变更,也有三种:新加,修改,删除

多个人同时操作同一个文件的不同区域时,Git可以自动合并(Auto-Merge)。大多数情况下的冲突,Git都可以通过自动合并帮我们解决了,但遇到多个人同时操作同一个文件的相同区域时,Git自动合并就显得束手无策了,毕竟该保留哪些变更,只有靠我们自己了,Git决策不了。

冲突在哪些操作下会出现

pull/merge/push操作本地仓与远程仓的分支的时候,也就是说当本地仓与远程仓的分支之间进行变更同步的时候会出现冲突,如果只是个人的暂存区与本地仓交互,是不会发生冲突的,除非我们手动改了本地仓的文件......

冲突在文件里面怎么辨别

首先我们看一下冲突的符号,长相如下

<<<<<<<

=======

>>>>>>>

上半部分,是本地仓的变更内容;下半部分,是远程仓的变更内容。通过文本编辑器打开一个已经发生了冲突的文件,会包含这些信息,当然只会比这复杂......

二. 解决Git冲突

默认保留本地仓变更(如果不保留本地仓,直接reset hard,然后拉取远端仓代码,0烦恼,参考上一篇 Git常用命令

不通过Git可视化工具

在我们认识了冲突的结构之后,我们可以通过文本编辑器打开有冲突的问题,然后将 <<<<<<< 和 >>>>>>>之间的冲突编辑掉,比如上面那个已经发生了冲突的地方,我们就要判断一下,于是有四个选择:

  • 保留 hello world master
  • 保留 hello world alternate
  • 全保留
  • 解决完冲突的部分后保留

如果无法决策,那就找到这个文件的变更历史,找到变更提交人,然后沟通一下,毕竟同时修改一处,有时可能是信息不对称导致了修改了同一处。git blame 或许能帮上忙。

解决完冲突后,再次commit,push即可。

通过Git可视化工具

由于Git可视化工具比较多,Git GUI / IDEA 自带 / SourceTree 等等,这些可视化工具将Git的命令封装成可视化界面操作,大大提高了我们的工作效率,下面就简单说下如何通过IDEA自带的Git可视化能力解决冲突吧。

IDEA自带的Git可视化能力

我们通过IDEA pull/merge/push 操作本地仓和远程仓分支的时候,遇到Git无法自动合并的冲突时,就会弹出这样的一个解决,这时候,我们有三个选择:

Accept Yours(接受本地仓的,丢弃远端仓变更)

Accept Theirs(接受远端仓的,丢弃本地仓变更)

Merge...(手动处理变更),这块需要解决合并的人自己识别了

  • 明确知道本地仓的变更是可以直接覆盖远端仓的,那就选Accept Yours
  • 明确知道远端仓的变更是可以直接覆盖本地仓的,那就选Accept Theirs
  • 看一下冲突再说,那就选Merge...

点了Merge...,后面就会弹出一个更大的操作界面,是为了方便开发人员进行界面化操作的。 

  • 左侧是本地仓,中间是合并后的,右侧是远端仓的
  • 红色框起来的部分,是表示有冲突的
  • 绿色框起来的部分,是表示新添加的
  • 蓝色框起来的部分,是表示修改的
  • 每个被框起来的部分, 都有两个选择,">>" 表示接受,"x" 表示不接受;如果我们给红色区域都点击了接受,就相当于没解决冲突...我们要解决的通常就是红色区域的冲突,解决策略同上面,需要判断一下到底该如何保留
  • 下方的几个按钮,左边的两个不说了,右边的"Apply"表示确认冲突解决完毕,"Abort"表示中止解决冲突(慎点)

三. 遇到代码pull不下来,push不上去

将本地的变更,先暂存,或者提交到本地仓,然后再进行pull/push/merge操作

总结

Git操作就是一些命令的组合,以及经验的合理运用,熟能生巧,多练练基本就没啥问题了。

后记

更多内容参考Git官方文档

Git官方文档https://git-scm.com/book/zh/v2

有关关于GIT解决冲突的更多相关文章

  1. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  2. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  3. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  4. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  5. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  6. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  7. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  8. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

  9. ruby - 如何更快地解决 project euler #21? - 2

    原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,

  10. ruby-on-rails - 安装 active admin 时 activeadmin.git (at master) is not yet checked out 错误 - 2

    Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文

随机推荐