Git 【git merge】

来源:互联网 发布:七层网络和四层模型 编辑:程序博客网 时间:2024/06/05 04:44

Merge 情景:

Ken 和 Vayne 两个 iOS 工程师共同开发一个项目,现有 Ken 和 Vayne 两个分支,Ken 为同事开发的分支并且已经提交到了远端。而 Vayne 是自己的本地分支。现需要合并 Ken 分支的完整代码到 Vayne 分支下。然后将 Vayne 分支下得最终版本提交到远端服务器上。


操作步骤:

(1)可能之前已经 merge 过很多次了,所以检查在你的电脑上是否有 Ken 的本地分支。如果存在旧的 Ken 分支,又因为远端的 Ken 分支已经是最新的了,所以为了避免不必要的冲突,我们可以先将本地旧的 Ken 分支进行删除。

git branch -D Ken

或者

git branch -d Ken

这里说一下 -d 和 -D 的区别,二者的区别就在于 -D 会强制删除本地仓库,一般用于 -d 删除不掉一些顽固文件时执行,此处我们直接强制删除就好了。


(2)基于 Vayne 分支新建一个 Ken 分支。(由于我们在合并的过程中可能会产生一些无法挽回的错误,所以说最好拿备份的分支与远端进行合并)

查看是否在当前 Vayne 本地分支下并基于 Vayne 进行创建 Ken 分支的操作:

git branch -a 

git checkout -b Ken

这样我们得到的 Ken 本地分支就已经拿到了 Vayne 分支下所有最新的源码。


(3)拉下来远端的 Ken 分支并与本地的 Ken 分支进行合并。

git pull origin Ken

或者

git fetch origin Ken // 拉取远端git merge origin Ken // 合并远端


采用下面的两行代码更加的安全,因为可以在合并前对比两份代码。由于我们直接拉到本地的同名分支下,所以选择直接拉取并立即合并。


如果本地没有 Vayne 分支,但是又要拉取远端的 Vayne 分支或者 Ken 分支,那么可以:

git checkout -b Vayne origin/Vayne
git checkout -b Vayne origin/Ken

一般来说如果 Ken 分支下的就是最新的代码,那么可以直接删除本地的 Vayne 分支,然后再进行上面的命令行进行拉取就好了。(避免繁琐的 merge 的有效办法)


(4)冲突的处理

然后终端会显示冲突,如下图所示:

我们可以执行 git status 进行一个状态的打印(可以更明显的查看当前合并的情况)

git status

绿色部分的已解决冲突的后面紧跟着的是未解决的冲突,这些红色的冲突必须解决完毕之后才能正常的运行项目。



我们可以执行下面语句调出 File Merge 插件来帮助我们解决冲突:

git mergetool


可以发现该插件智能的提示出我们需要解决的冲突,并且提示我们一个一个的去解决。

有必要注意的是:.xib / .storyboard 文件修改起来十分的麻烦,如果这两类文件遭到了修改,最好的方式是将修改好的文件直接拖到项目所在的 Finder 下进行替换。这样不会将原 xib 与项目中的关联删除(比如说一些 IBOutlet 关联、IBAction 关联 和 关联的类)。再强调一次,直接在项目所在的 Finder 下进行替换,而不是删了原项目中的文件再拖到 Finder 里面,也不是直接拖到项目(Xcode)中。其中的区别大家要理解。


那么,如何使用 File Merge 呢?下图一目了然:



拿 .gitignore 文件来说明。蓝色部分表示有修改过的部分左右是会有对比的,我们可以选择每一部分应该采取左边还是右边,File Merge 已经为我们标注了有几部分发生了冲突,并且右下角也有如何选择的菜单。分别为:

Choose left   选择左边                      

Choose right   选择右边

Choose both (left first)   全选,左边在上,右边在下

Choose both (right first)   全选,左边在下,右边在上

Choose neither   全不选择

调整完毕后,下方的框内就是我们修改好的文件预览,再有需要调试的就在下方的预览框内修改即可。

修改完毕后保存、关闭。File Merge 会提示继续进行下一个冲突的修改。修改完一个会询问是否修改成功,此时输入 y,回车进入下一个冲突的修复。(上图中可以找到对应的命令行)

碰到 .xib / .storyboard 时直接打开接着关闭,然后输入 y,过掉然后需要我们手动去修改这些冲突。(上面已经说过拿到修改好的重新拖一次即可)

xib 如果修改不成功是打不开的,一般来说替换原来完整的 xib 是没有问题的,但是如果你不是采用的这种方式,那么会如下图所示打不开该 xib。(只能拿一个正常的过来替换,或是右键对应的 xib 文件,然后文本编辑模式修改代码)



如果文本修改代码,也不算困难,如下图:(下面是在 Xcode 中修改常规的代码文件,而修改 xib 的话就必须在文本编辑器中进行编辑)


我们可以尝试着来读一下上面的标注,这是我们在合并的时候产生的。共三句:


<<<<<<< HEAD

这里是自己部分的代码

=======

这里是合并过来的那部分代码

>>>>>>> 乱码


修改过后,把标注也删除了。就可以尝试打开或是运行程序,直到可以运行。


(5)收尾工作

所有工作做好之后,进行一个收尾的工作。检查一下运行后的程序各模块是否正确。

有些 xib 连线失效,要手动的设置一下。

冲突解决之后,系统会生成 .base .remote .backup .local 等冲突附件文件 和一些 .orig 文件,这些文件在冲突解决之后删除就好了。


(6)提交本地 Ken 分支的最新代码然后合并到自己的本地 Vayne 分支

注意,我们上述的种种操作都是在我们本地的 Ken 分支上操作的,Ken 分支解决完冲突之后我们将最新的代码提交保存到本地的 Ken 分支。

git add .git commit -m "这里写提交信息"

add . 是提交所有代码到本地分支(注意 add 后面的 . ),commit 是确认这次提交信息,-m 后面跟本次提交的具体描述。

然后再将 Ken 本地分支合并到我们自己本地的 Vayne 上。

git checkout Vaynegit merge Ken

先 checkout 切换到本地 Vayne 分支,然后将本地最新的 Ken 分支 merge 合并到本地 Vayne 分支上。由于我们本地的 Ken 分支是基于本地的 Vayne 分支建立的,所以一般来说到了这一步是不会出现冲突的。因为远端 Ken 分支 merge 到本地 Ken 分支时就已经解决完毕了。


(7)提交本地 Vayne 分支的最新代码并且上传到远端。

git add .git commit -m "提交本地合并后的 Vayne 分支"git push origin Vayne

这样远端 Vayne 分支下和我们本地的 Vayne 分支的代码保持一致了。


(8)如果远端仓库已经存在,那么可以先删除远端仓库,再添加新的远端链接即可。

git remote remove origin
git remote add origin 仓库URL

(仓库URL 用 SSH 或者 HTTPS 都可以)


2 0