回顾
现在我们对git的认识就是git是一个状态流,类似这个:

master表示我所在的分支。
现在有个问题,要是我同一个文件想同时尝试不同方向的修改,也就是并行开发,这可咋办?在实际工作中我们常常遇到这种协作问题,同事甲要修改该仓库的A文件,我要修改该仓库的B文件,总不能提交的时候再商量好一起提交吧?
git branch #{分支名}
为了解决这个问题呢,我们的解决方案就是在该状态下,开出两条分支:

这样就能两个人的修改隔离开来,修改提交也是提交到我们自己创建的分支上来。
示例
我创建分支dev:同时我们把master这个版本信息叫做master和dev的共同祖先,简称共同祖先

然后把master分支切换到dev状态来:使用git checkout #{分支名}命令

可以看到提示我们已经切换分支到dev分支。
我们查看这个分支的初始状态:

可以看到,它和master的执行git branch时候的状态是一致的,也就是说,dev继承了master的当下状态。
我们在这个分支下直接在本地仓库创建文件:我.txt

然后查看dev分支的状态:

然后我们提交修改:

此时我们切换到master分支,查看状态:

会发现,master分支识别不到我们新建的我.txt文件,那么是不是也提交了呢?

答案是没有!所以虽然你好.txt、你.txt、好.txt、我.txt是在同一个目录下、一个本地仓库下,但是是归不同分支管的,前提是该修改已经被提交,任何修改被提交,该修改都不会再被其它分支识别。
那我们master分支,怎么把这个dev分支的内容同步更新到自己分支呢?
git merge #{分支名}
使用git merge dev这个命令就可以把dev的修改内容合并到master分支,原理是使用这个命令,git会自动识别master相对共同祖先的修改和dev相对共同祖先的修改,然后合并修改到一个新的版本:

从上往下看:
第 1 行: 86135@Mulerss MINGW64 /d/gitrepos (master)
含义: 这是终端的提示符(Prompt)。
86135@Mulerss:当前登录的用户名(86135)和计算机名(Mulerss)。
MINGW64:表示你正在使用 Git for Windows 自带的 MinGW 64位环境。
/d/gitrepos:当前所在的目录路径,对应 Windows 下的 D:\gitrepos。
(master):关键信息,表示你当前所在的 Git 分支是 master 分支。
第 2 行: $ git merge dev
含义: 这是你输入的命令。
$ 是命令提示符,表示等待输入。
git merge dev 的意思是:“把 dev 分支的修改合并到我当前所在的分支(也就是 master)中来”。
第 3 行: Updating 2accf93..cf7c41b
含义: Git 正在更新你的代码版本。
2accf93:合并前,master 分支指向的提交(Commit)哈希值的前7位。
cf7c41b:合并后,master 分支将要指向的提交(也就是 dev 分支最新的提交)哈希值的前7位。
这表示 master 分支的指针从 2accf93 移动到了 cf7c41b。
第 4 行: Fast-forward
含义: 这是本次合并的类型——“快进合并”。
它告诉你:这次合并非常简单,没有产生任何冲突,也没有产生新的“合并提交(Merge Commit)”。Git 只是简单地把 master 的指针往前“快进”了一下。
第 5 行: "\346\210\221.txt" | 0
含义: 显示本次合并涉及的文件统计。
\346\210\221.txt:这是文件名的八进制转义字符。\346\210\221 转换成 UTF-8 编码就是汉字 “我”。所以这个文件实际上叫 我.txt。(这是因为 Git Bash 默认对非 ASCII 字符进行转义显示,可以通过配置 git config --global core.quotepath false 来正常显示中文)。
| 0:表示这个文件有 0 行代码的变更(因为下一行说了是新建文件,或者是空文件)。
第 6 行: 1 file changed, 0 insertions(+), 0 deletions(-)
含义: 汇总统计。
共有 1 个文件被改动。
增加了 0 行代码(insertions(+))。
删除了 0 行代码(deletions(-))。
第 7 行: create mode 100644 "\346\210\221.txt"
含义: 具体的文件操作详情。
create mode 100644:表示新建了一个普通文件(权限模式为 100644,即标准的可读可写文件,非可执行脚本)。
再次确认新建的文件是 我.txt。
第 8 行: 86135@Mulerss MINGW64 /d/gitrepos (master)
含义: 命令执行完毕,终端再次出现提示符,等待你的下一条命令。注意括号里依然是 (master),说明你还在 master 分支上,但 master 分支的内容已经更新了
我们查看下此时master的状态:

可以看到我.txt文件也被master管理了。
我们再做些更复杂的合并操作:
1.master修改我.txt文件内容:


2.切换进之前创建的dev分支,也修改我.txt文件:

我们打开我.txt文件:

发现它自动复原了!说明本地仓库下展示的内容取决于你在哪个分支下!
然后我修改里面的内容:

再提交修改:

3.切换进master分支,合并dev:

从上往下看:
第 1 行: 86135@Mulerss MINGW64 /d/gitrepos (dev)
含义: 终端提示符。注意括号里是 (dev),说明你一开始是在 dev 分支上。
第 2 行: $ git checkout master
含义: 你输入的命令,意思是“切换到 master 分支”。
第 3 行: Switched to branch 'master'
含义: Git 的反馈,告诉你已经成功切换到了 master 分支。
第 4 行: 86135@Mulerss MINGW64 /d/gitrepos (master)
含义: 提示符更新,括号里变成了 (master),确认当前所在分支。
第 5 行: $ git merge dev
含义: 你输入的命令,尝试把 dev 分支的修改合并到当前的 master 分支。
第 6 行: Auto-merging 我.txt
含义: Git 正在尝试自动合并文件。
这里显示的文件名是 我.txt(不再是上一张图里的乱码 \346\210\221.txt,说明你可能已经配置了 git config --global core.quotepath false,或者 Git 版本/环境自动处理了中文显示)。
Git 发现 master 和 dev 分支都修改了 我.txt 这个文件,于是它尝试聪明地把两边的修改自动拼接到一起。
第 7 行: CONFLICT (content): Merge conflict in 我.txt
含义: 关键报错! 自动合并失败,产生了内容冲突。
Git 抱怨说:在 我.txt 这个文件里,master 改了一处,dev 也改了同一处(或者相邻的地方),我不知道该听谁的,不敢擅自决定,所以报错了。
第 8 行: Automatic merge failed; fix conflicts and then commit the result.
含义: Git 给出的下一步行动指南。
“自动合并失败了;请手动修复冲突,然后再提交(commit)结果。”
第 9 行: 86135@Mulerss MINGW64 /d/gitrepos (master|MERGING)
含义: 提示符发生了特殊的变化!
括号里变成了 (master|MERGING)。
MERGING 状态表示你的仓库现在处于 “合并进行中” 的特殊状态。在这个状态下,你不能随意切换分支,必须先解决完冲突并提交,或者放弃这次合并。
那我们怎么解决这次冲突呢?我知道你很急,但你先别急。此时你打开刚刚提示你产生冲突的文件:会变成这样:

<<<<<<< HEAD
我是master
=======
这块表示这是当前分支也就是master分支的修改内容。
=======
我是dev
>>>>>>> dev
这块表示这是dev分支的修改内容。
你只需要修改这两块内容,保证不出现<<<<<<< 这种标记符号就行了!

我直接只保留master的修改内容,然后直接提交修改即可!

此时切换进dev分支,查看我.txt内容:


不影响dev分支!

2818

被折叠的 条评论
为什么被折叠?



