Git教程第10篇-冲突的产生和解决冲突

2019-10-24 09:53:11   Git

人生不如意十之八九,分支合并不可能每次都能 fast forward,而且不仅如此,还有可能遇到挫折:冲突。所以学会如何合理的解决冲突就是一件很重要的事情了。

冲突的产生和解决冲突

我们假设要新开一个分支修复昨天努力写出来的bug,就叫他bug分支好了

git checkout -b bug
# 或者(新版本Git可用switch)
git switch -c bug
Switched to branch 'bug'

然后我们在 README.md 文件最后添加一行 fix a bug from bug branch,然后提交

vim README.md
git add .
git commit -m 'fix a bug'

我们再切换回master分支,也修改 README.md ,当然,master分支上的 README.md不可能有刚刚在bug分支上添加的文字。这时我们依然在最后添加add a new feature from master branch,同样也提交

git checkout bug
# 或者
git switch bug
vim README.md
git add .
git commit -m 'add a new feature'

masterbug各自有了新的提交之后,就是这样了

file

好了,这时候我们将修改好的bug的bug分支合并到master分支上

git merge bug

yi~ 介四森莫~ 怎么肥四!!!

Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

然后用我蹩脚的英文读了一下,哦~,原来是冲突了,我们来看看现在的 README.md 什么样子:

write something
back
reset
branch dev modify
<<<<<<< HEAD
add a new feature from master branch
=======
fix a bug from bug branch
>>>>>>> bug

WTF!!! 是谁给我乱写乱画的?拖出去枪毙五分钟!没错,就是Git干的。那算了,还得用呢,先不枪毙了。

这个<<<<<<< HEAD>>>>>>> bug 之间的部分就是出冲突的内容,而 ======= 是华丽丽的分割线,上面是你当前分支的内容,下面是要合并进来的分支的内容,这两部分内容有冲突需要你解决一下。

write something
back
reset
branch dev modify
add a new feature from master branch & fix a bug from bug branch

emmm...这样貌似就好了,可以重新提交了。

git add .
git commit -m 'fix conflict'
[master 5f403eb] fix conflict

我们看一下log

git log --graph --oneline
*   5f403eb (HEAD -> master) fix conflict
|\
| * b2267c3 (bug) fix a bug
* | 4f61b16 add a new feature
|/
* 082fb4d (dev) modify file
* 7558812 (origin/master) add reset
* b86547a back
* 0e75233 first release
* f870cc5 我的第一次提交
(END)

file

最后,bug 分支使命完成了,就可以卸磨杀驴了。

git branch -d bug
Deleted branch bug (was b2267c3).

远程分支冲突

刚刚介绍了本地分支的骚操作,那么我们在从远程分支pull或者push到远程分支的时候又是什么情况呢。

其实远程分支和本地分支说白了他都是分支,没啥区别。但首先要明确一点:远程的master分支和本地的master分支属于两个分支。就好比你在GitHub上fork一样,你有一个master分支,作者也有一个master分支,但是你的提交却不在作者的分支上,当然你可以跪求作者把你写的bug合并到他的master分支上,然后让更多的人受害,哈哈。

还有就是我们平常可能接触的大多都是pullpush,那么之前讲的merge去哪了,不是要合并分支吗?这就要明确另一个点了:git pull = git fetch + git merge,也就是说其实 git pull做了两个操作,当然你也可以分开一步一步来做,所以这样就很明确了,远程分支跟本地分支的合并只是多了一步获取远程分支代码的操作。

顺便提一下“三连招”:git add && git commit && git pull,这是在 git push 之前要做的事情,顺序不能错(也不是不能,错了其实问题也不大,只是Git会告诉你,你错了,然后不答应你的请求,然后你还得乖乖的按照顺序来,因为它要保证你不会覆盖别人的代码,尽量保证不与远程分支产生冲突),其中,因为刚提到了git pull 包含了 git merge,所以在 git pull 之后可能会有冲突的问题,根据上面的文章,解决冲突,然后重新“三连招”即可。

vien.tech版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/233
欢迎小伙伴们在下方评论区留言 ~ O(∩_∩)O
文章对我有帮助, 点此请博主吃包辣条 ~ O(∩_∩)O

猜你喜欢


评论

There are no comments yet.
未登录

登录后即可发表评论

登录或注册

标签

AdSense Anaconda Android API Auth AWS B-tree Bandwagon Blog bower brew bytes Caffe Catalina cloudcone Composer conda crontab CSS Cuda cv2 datetime Digitalocean DNS Docker Docker-Compose export Flask GET Git GitHub Gmail GoDaddy Google GTM hash Homebrew Homestead HTML http HTTPS IDEA image imagemagick imagick imgick import InnoDB ISO8601 iTerm2 Java JPG Keras Laravel Laravel-Admin lazyload Linux list lnmp load logs Lravel Mac Markdown matplotlib md5 mix Mojave mongo MongoDB MySQL Namesilo Nginx npm numpy Nvidia Nvidia-Docker onevps OpenCV Openpose Outline parse PayPal PHP php-fpm PhpStorm PHP扩展 PIL Pillow pip PNG POST Protobuf PyCharm pyenv pymongo Python Queue Redis requests save selenium SEO Shadowsock Shadowsocks ShadowsocksR simplemde Spring Boot SQLServer SSH SSL证书 SSR str Sublime sudo swap Tensorflow Terminal Terminator Ubuntu urllib UTC v2ray Valet Validation Validator VienBlog virtualenvs VPN VPS Vultr Web Windows Xcode zip zmq zsh 下载图片 云主机 云服务器 人工智能 优化 优惠码 伪原创 作弊与反作弊 免费ss账号 免费提现 切片 前端 加密 协议 博客 友链 后台运行 命令 图片操作 图片转换 域名 大小写转换 安卓模拟器 定时任务 定时执行 延迟加载 懒加载 提现 搜索引擎 搬瓦工 搭梯子 教程 数据库 文件上传 日志 时区 时间戳 服务器 机器学习 梯子 港版支付宝 生活服务 科学上网 系统升级 索引 编辑器 自动付款 英文伪原创 计划任务 语法 远程连接 重定向 错误异常 错误提示 队列 阿里云 香港 香港手机号
亲情非友情链接