假设冲突文件是 test/TestCase.php
下面分5种情况讨论。 1、本地不变。 然后远程别人有更新。 git pull 这种最简单,没有冲突,本地工作区直接更新 2、我本地修改,但是不add。 然后远程别人有更新,此时 : git pull, git会告诉你: error: Your local changes to the following files would be overwritten by merge: tests/TestCase.php 此时,我 git checkout -- tests/TestCase.php 千万注意,上条命令会导致你自己的修改丢失了!! 然后git pull.成功。 这种情况下,你自己的修改完全丢失。本地接受了远程的修改。 3、我本地修改,但是已经add了。 然后别人远程更新, git pull 这种情况,和上面几乎一样。 git reset HEAD test/TestCase.php 上面这条命令可以理解为add命令的逆命令。即,取消add操作。 然后继续 git checkout -- tests/TestCase.php 千万注意,上条命令会导致你自己的修改丢失了!! 然后git pull.成功。 这种情况下,你自己的修改完全丢失。 本地接受了远程的修改。 4、我本地修改,add 且 commit了 然后别人远程更新, git pull 注意:这种情况和第2,第3种情况不同。git会认为你的commit也很重要。同等重要。 突然发现,自动进入vi界面。 Merge branch 'master' of https://github.com/xxxx 这什么意思呢?就是git会主动再帮你添加一个commit。 先让你写点注释,并且它已经帮你写了几句话 那自己写点东西,然后保存退出vi 请注意,这个commit是在本地的,还没有发到远程。 这个commit会自动合并 你添加到代码,和 别人远程更新的代码, 所以,之后请自己检查一下这个代码有无问题。 如果都没有问题,则你现在 git push 这个命令可以把你的本地改动推送到远程。 push之后,远程得到你和他人的所有更新。push之前,仅本地得到你和他人的所有更新。 5、使用分支功能。 git的分支功能很强大,应该多使用。 上面几种情况都没有使用分支。使用分支会更好。 首先,我本地新建并切换分支branch_1,自己起有意义名字,并修改文件。 git checkout -b branch_1 vi test/TestCase.php git add tests/TestCase.php git commit -m "change test" 现在,别人已经更新了远程主分支代码(没更新就极其方便了,也不必说了,快速更新) 我想把分支合并到主分支。 我应该,先回到主分支,并更新。 git checkout master git pull 然后,在本地,把我的修改分支合并上去。 git merge branch_1 自动进入vi界面,让你写注释。 然后会合并好。 类似提示: tests/TestCase.php | 3 ++- 上面,两个加号表示文件增加了两行,一个减号表示文件减少了一行。 此时,注意,凡是进入vi界面后, 最好自己再检查一下程序,检查那些被提示修改过的文件,(这是一个好习惯,但我从来不遵守) 如果认为正确,最后, git push,推送到远程。 push之后,远程得到你和他人的所有更新。push之前,仅本地得到你和他人的所有更新。 总结,大部分情况下,都推荐使用第5种,使用分支的方法,来管理文件修改冲突。大致步骤:
1、在A分支,复制A到B分支(服务器已经存在) git checkout -b B
2、同步代码git pull -r origin B3、解决冲突4、提交代码 git add . git commit -m '合并A分支'5、本地与服务代码关联git branch --set-upstream-to origin/B B6、在B分支,合并A分支,git merge A
如何从一个分支合并特定的commits到另一个分支。有时候你需要这样做,只合并你需要的那些commits,不需要的commits就不合并进去了。
a、合并某个分支上的单个commit
首先,用git log或GitX工具查看一下你想选择哪些commits进行合并,例如:
dd2e86 - 946992 -9143a9 - a6fd86 - 5a6057 [master]
\
76cada - 62ecb3 - b886a0 [feature]
比如,feature 分支上的commit 62ecb3 非常重要,它含有一个bug的修改,或其他人想访问的内容。无论什么原因,你现在只需要将62ecb3 合并到master,而不合并feature上的其他commits,所以我们用git cherry-pick命令来做:
git checkout mastergit cherry-pick 62ecb3
这样就好啦。现在62ecb3 就被合并到master分支,并在master中添加了commit(作为一个新的commit)。cherry-pick 和merge比较类似,如果git不能合并代码改动(比如遇到合并冲突),git需要你自己来解决冲突并手动添加commit。
b、合并某个分支上的一系列commits
在一些特性情况下,合并单个commit并不够,你需要合并一系列相连的commits。这种情况下就不要选择cherry-pick了,rebase 更适合。还以上例为例,假设你需要合并feature分支的commit76cada ~62ecb3 到master分支。
首先需要基于feature创建一个新的分支,并指明新分支的最后一个commit:
git checkout -b newbranch 62ecb3
然后,rebase这个新分支的commit到master(--ontomaster)。76cada^ 指明你想从哪个特定的commit开始。
git rebase --onto master 76cada^
得到的结果就是feature分支的commit 76cada ~62ecb3 都被合并到了master分支。
引用原文链接:
写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!
如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!