git diff 以及解决代码冲突
git diff 格式解读-》http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html
我是使用一台电脑测试, 然后在本地电脑创建了两个工作目录。专门用来模拟两个人提交代码。假设a、b两个人。只使用一个master分支做测试, 没有建立其他的分支。 主要就是为了研究冲突的解决方式。感觉git pull总是强制覆盖。
- a修改了代码并且提交master分支。
1) 测试一: 远程master分支已改变,然后b现在也修改了代码。不过b还没有提交,直接git pull ,不能拉取代码。报错提示:
error: Your local changes to the following files would be overwritten by merge:
readme.txt
Please commit your changes or stash them before you merge.
2) 先测试 b 选择commit的情况:b 修改代码后,commit 提交了代码。然后git pull,此时提示信息:
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
3)现在来使用 git diff查看有哪些冲突:(截图在PHP文档里)
$ git diff
diff --cc readme.txt
index dc06fcb,e552df5..
--- a/readme.txt //修改前文件
+++ b/readme.txt //修改后文件
@@@ -, -, +, @@@ //正常情况下,修改的代码前后都各显示出三行用来作为上下文,除非不够三行.(@@@表示的就是上下文) -1,5 `-`表示修改前的 `+`表示修改后的 `-1,5` 表示修改前从第一行开始 连续的5行 `+1,9`表示修改后的第一行连续的9行
<?php
-
+echo ;
echo ;
++<<<<<<< HEAD //<<<<<<<head 是指你本地的分支的
+echo <D5><E2><CA><C7><D0>??<C4>?<D0>У<BB>
++=======
+ echo <D5><E2><CA><C7><D0>????<FE><D0>У<BB> //git pull 拉下来的内容
++>>>>>>> 3776c60466b1e18c76018940d4a57d68b7d94353
?>
4)git merge :会报错并提示:
error: Merging is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>' //work tree 就是工作目录的那个要合并的文件,
hint: as appropriate to mark resolution and make a commit. //需要你去文件里修改冲突。此时打开b修改的文件
fatal: Exiting because of an unresolved conflict. //就会看到哪里有冲突
Your branch and 'origin/master' have diverged,
and have and different commits each, respectively.
(use "git pull" to merge the remote branch into yours) You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge) Unmerged paths:
(use "git add <file>..." to mark resolution) both modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a")
对以上翻译:
你的分支和“起源/主人”有分歧, 分别有1个和1个不同的提交。 (使用“git pull”将远程分支合并到您的分支中) 您有未合并
的路径。 (修复冲突并运行“git commit”) (使用“git merge--abort”中止合并) 未合并的路径: (使用“git add<file>…”
标记分辨率) 两者都已修改:readme.txt 没有添加要提交的更改(请使用“git add”和/或“git commit-a”)。
6)git merge --abort 终止合并
7)当解决了冲突之后,直接使用git push 是不行的, 需要git add 然后 git commit的,在git push 就能提交到远程仓库了。建议不要使用git commit -a。
- 新的问题: a修改文件提交远程,此时b也修改了文件,解决冲突后也提交到远程, 这个时候 a 拉取远程代码,就会直接覆盖。不会提示你需要解决冲突啊什么的。(我的理解,这已经是一个新的版本了,如果本地的已经提交过,那线上的版本变动,本地拉取的时候也不会有冲突。)
- 测试二: a修改了文件,并且提交到远程,b也修改文件,并且已经commit。此时冲突的解决:和先pull再commit,感觉一样。都是解决冲突,然后add、commit。
- 测试:如果我只删除掉<<<<head ==== >>>>dfsegd3243(冲突的我不删除会怎么样?)不管你怎么修改的,反正只要你修改了冲突(哪怕只是删除了上面的提示,别的没动),然后add 、 commit,git就会认为你解决了冲突。git不管你怎么改的。
- 如果a修改了第5行,提交,而b修改了第7行,此时如果b直接提交 ,会不会有冲突?如果b拉取代码,会不会直接覆盖?(感觉会直接覆盖掉b的文件里之前第5行内容,那第7行的会不会受到影响,会不会也被覆盖?)
会abort, 提示b 需要先commit 或者 stash。会显示有冲突,但是b commit之后,弹出一个提示框(里面只有注释,没有冲突内容,我想应该是因为本地分支修改的地方和远程分支修改的不是同一行,远程修改的那一行会直接覆盖本地的同一行) - 又想到一个问题: 本地拉取线上一个分支,然后修改了一直没提交,而线上经历了好几个版本了。这个会有冲突(对的吧)本地拉取线上分支,修改之后提交了,线上更新了好几个版本,本地在拉取,就会直接拉取没冲突。
- git diff 是查看工作区和暂存区的快照相比较有哪些修改的地方。(因为commit提交的是add的内容如果说你修改了,但是没有add到暂存区,commit是不会提交的,所以和暂存区比较是有意义的)
- git diff --cached 和 git diff --staged 查看暂存区和本地版本库之间的差异。就是这一次修改后add到暂存区,和上一次提交的进行比较。
- git diff head 工作区和本地版本库进行比较。
- git diff test.c 用来查看工作区和暂存区中test.c文件的区别。
- git diff HEAD -- test.c 用来查看工作区和本地版本库中test.c文件的区别。
https://cloud.tencent.com/developer/ask/77395
12. https://www.cnblogs.com/lsgxeva/p/8540485.html 看最后面的和下一篇文章
13. 如果发生这种情况怎么办? a 修改了1.0版本的第5行, b 向在1.0版本基础上改第7行, 但是a 已经先提交了。b提交之前好像必须得拉取最新的代码吧?!那b不要a的改动,怎么办?
git diff 以及解决代码冲突的更多相关文章
- git解决代码冲突
1.当项目开发是几个人的时候,难免会出现代码冲突,使用git命令行解决冲突的方法如下: git checkout develop git pullgit checkout feature/新建会员功能 ...
- 服务器用 git 进行部署出现代码冲突的处理
服务器用 git 进行部署出现代码冲突的处理 起因: 由于项目是之前很久之前上传的,且并没上线.使用 git pull 进行代码更新时出现很多冲突. 因为服务器上的代码有移动过位置,不知道为什么就冲突 ...
- git上解决代码冲突
1.切换到master: git co master 2.拉最新代码:git pull origin master 3.删掉多余符号 4.切换到提交的分支:git br Txxxx 5.合并:git ...
- git上解决代码冲突(merge版)
1.切换到master: git checkout master 2.拉最新代码:git pull origin master 3.切换到提交的分支:git checkout Txxxx 4.合并:g ...
- git .gitignore 文件 解决二进制文件冲突问题
.gitignore 主要是添加 忽略文件 .最近团队开发经常出现 UserInterfaceState.xcuserstate 冲突,打开发现是二进制文件 ,没法解决冲突. 只好 rm -rf 之 ...
- 版本管理--svn解决代码冲突
高级的svn解决冲突的方法: 选择正在冲突的文件,右键,选择Edit confilicts,这时候出现一个弹框, 看你实际的需要用自己的代码,还是用同事的代码,或者合并起来.最后点击Mark as r ...
- git命令——git status、git diff
前言 当对项目做了更改时,我们通常需要知道具体改了哪些文件,哪些文件更改了没有暂存,哪些文件改了并且已加入到暂存区等待下次commit.上述任务使用git status都可以帮我们解决.但是想要知道文 ...
- Git:代码冲突常见解决方法
摘自: http://blog.csdn.net/iefreer/article/details/7679631 如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, ...
- git 本地与远程仓库出现代码冲突解决方法
提交过程中报错: [python@heaven-00 Selesystem]$ git push -u origin masterUsername for 'https://github.com': ...
随机推荐
- C++ MinGW 配合 Sublime Text 搭建
本文主旨 使用MinGW 和 文本编辑器 Sublime Text,来搭建c++编译的平台. Sublime Text 安装 和 解除限制 http://rainss.cn/essay/1124.ht ...
- Thinkphp5 自定义上传文件名
这几天在做tp5的上传文件模块,项目需求是要把文件名在上传之后修改为 用户名+原文件名的组合形式,在网上找了一会儿发现好像没有类似的文章...只好自己去研究研究了. 之前查看过看云上面的官方手册,文件 ...
- Linux磁盘挂载、分区、扩容操作
本文最早发布于 Rootrl's blog 注:以下操作系统环境为CentOS7 基本概念 在操作前,首先要了解一些基本概念 磁盘 在Linux系统中所有的设备都会以文件的形式存储.设备一般保存在/d ...
- lsof---列出当前系统打开的文件信息
lsof---list open file,一个列出当前系统打开文件的工具 1.lsof查找原理 在Linux系统中,系统为了方便管理进程,会在/proc下为每一个运行中的进程创建一个目录,目录名就是 ...
- JDBC24homework
编写程序: 创建一个类DBTools,在DBTools中创建一个方法find,find方法用于对数据库进行查询操作,现在要求将结果集封装成数组线性表嵌套数组的形式: ArrayList<Stri ...
- PowerBI 实现不同角色看到内容不同支持动态权限管理
首先,在PowerBIDesktop中进行设计,先设计一个权限表: 具体权限如下: 也就是说,这些用户账号在PowerBIService登录时,会分别代表这些用户,接下来会使用一个很重要的动态函数:U ...
- gridview单元格编辑添加数据
行号 private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIn ...
- springboot2.0集成webSocket
WebSocket和http的区别? http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能发送信息. http链接分为短链接,长链接,短链接是每次请求都要三 ...
- ubuntu系统新用户添加
大概是4个步骤吧,是用脚本实现的,这里我列一下关键点 sudo useradd -m userYouWantAdd sudo passwd userYouWantAdd sudo usermod -a ...
- Struts配置文件
本章节将带你学习Struts2 应用程序所需的基本配置.在这里可以看到哪些将被配置到一些重要的配置文件中:web.xml.struts.xml.struts-config.xml以及struts.pr ...