[实践OK]Git:代码冲突常见解决方法研究学习,特别是git commit -m和git commit -am对三个区的一个解读是解决冲突的核心。

jackxiang 2017-6-27 22:16 | |
git commit -am"" #提交除开没有Add的文件外的所有修改,如:git rm ,git mv,git add....
-----------
背景:一般是自己领先master几个版本,二是自己落后master几个版本,三是自己无论落后还是先进都和Master对齐(比如:分支,git checkout -b feature,修改index.html,再转到git checkout master,再合并分支到master,git merge feature...,最后,解决冲突并git add index.html,当然也可以commit -am....,提交并无误的情况下,删除git的特征分支:git branch -d  feature ),如何解决上面三种冲突并能正常提交呢?
零、关于从暂存区回退方面的文章见:https://justwinit.cn/post/9253/
一、Git服务端版本领先问题参考:https://justwinit.cn/post/9300/
二、Git服务端版本落后问题本文解决:
#git push
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
! [rejected]        master -> master (fetch first)
error: 无法推送一些引用到 'git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git'
提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交。这通常是因为另外
提示:一个仓库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更
提示:(如 'git pull ...')。
提示:详见 'git push --help' 中的 'Note about fast-forwards' 小节。

[root@levoo-php-memcached-reids-zookeeper_bj_sjs_10_51_77_34:/tmp/gitstudy/conflict/spec.boosh.com.cn]
#git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
展开对象中: 100% (3/3), 完成.
来自 git.boosh.com.cn:irdcops/spec.boosh.com.cn
   c333506..47f275b  master     -> origin/master
自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。

====================git status 提示双方修改:README.md====================
#git status
位于分支 master
您的分支和 'origin/master' 出现了偏离,
并且分别有 1 和 1 处不同的提交。
  (使用 "git pull" 来合并远程分支)
您有尚未合并的路径。
  (解决冲突并运行 "git commit")

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

        双方修改:   README.md

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

=====================查看文件=================================
#cat README.md  
<<<<<<< HEAD
conflict  9:57 modify
=======
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59
>>>>>>> 47f275befbc4fcd306eb4978fb75dde0545b040b

==================解决README.md文件===============
cat README.md
conflict  9:57 modify
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59

================再查看该文件并pull一下查看状态================
git pull
error: Pull is not possible because you have unmerged files.
提示:请在工作区改正文件,然后酌情使用 'git add/rm <文件>' 命令标记
提示:解决方案并提交。
fatal: Exiting because of an unresolved conflict.

===理解修改尚未加入提交(使用 "git add" 和/或 "git commit -a")=====
git commit-m与-am的区别:https://segmentfault.com/q/1010000005900988
标识:也就是说得理解那几个区,这个-a 是指虽然跟踪了,但是没有git add纳入暂存区(自己已经纳入了,但是因为冲突了,别人修改了,它并没有在自己这边的暂存区里的意思。还得通过git add一次纳入自己本地的暂存区,或直接-a就能把本地合并冲突的文件直接纳入到暂存区,有点绕,应该就是这个意思,就可以git push解决这个冲突了。)
[注意]git commit -am可以写成git commit -a -m,但不能写成git commit -m -a,如果里面有一些草稿文件也就是并不需要提交的其它的文件本就在里面,会被一并提交上暂存区,这个一定要注意用-am时要把它们都删除掉,只留下需要入暂存区的文件,否则,会把所有的没有用的文件纳入后,再git push一下就会出现把很多没有用的文件提交上git服务器上去了。

==========实践上面的理解=============================================
git commit -am"解决冲突后,纳入自己的暂存区里 commit -am中的a就是这个意思,代替了git add 。"
[master 0006642] 解决冲突后,纳入自己的暂存区里 commit -am中的a就是这个意思,代替了git add 。

============解决冲突后放到暂存区后,再Git push也就成功能======================================
git push
对象计数中: 6, 完成.
压缩对象中: 100% (5/5), 完成.
写入对象中: 100% (6/6), 873 bytes | 0 bytes/s, 完成.
Total 6 (delta 0), reused 0 (delta 0)
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
   47f275b..0006642  master -> master


最后,果然提交成功,在那个老王的git目录下,再 git pull无问题,查看内容也就下来了:
git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
展开对象中: 100% (6/6), 完成.
来自 git.boosh.com.cn:irdcops/spec.boosh.com.cn
   47f275b..0006642  master     -> origin/master
更新 47f275b..0006642
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)

cat README.md
conflict  9:57 modify
老王在这儿提交了一个并给提交到线上去了。-addTime:20170410 9:59



三、git reset revert 回退回滚取消提交返回上一版本,最常用的是合并feature 分支的冲突解决:
一般没有别人开发出现冲突,是因自己回退引起的,
git reset revert 回退回滚取消提交返回上一版本:http://justwinit.cn/post/9253/
解决冲突合并分支:
http://m.toutiao.org/group/6407171134127472898/?iid=8936996522&app=news_article&tt_from=weixin&utm_source=weixin&utm_medium=toutiao_ios&utm_campaign=client_share&wxshare_count=1
实践成功如下步骤,注意,这种合并都是基于那个暂存库:

显示本地分支:
git branch
* master

新建分支
准备新的feature1分支,继续我们的新分支开发:
#git checkout -b feature  #它是建立并进入到刚进入的分支。
切换到一个新分支 'feature'
再次建立的提示:
git checkout -b feature
fatal: 一个分支名 'feature' 已经存在。

查看分支的建立情况,有了:
git branch
* feature
  master

修改文件 修改index.html:
#echo conflict >> index.html
vi index.html
hello jack ,write by feature...

在feature分支上提交:
git add index.html
git commit -m"提交到分支" ./index.html
===================================================================================================
切换回master分支:
git checkout master
A       index.html
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。


master分支修改:
在master分支上修改index.html:
echo master_conflict >> index.html
vi index.html
add by jack from master...
提交到暂存库:
git commit -am"写两个字试一试吧~"

分支合并
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
git merge feature
自动合并 index.html
冲突(内容):合并冲突于 index.html
自动合并失败,修正冲突然后提交修正的结果。

#cat index.html
create confilict with feature branch
master_conflict
<<<<<<< HEAD
add by jack from master...
=======
jackX

hello jack ,write by feature...
>>>>>>> feature

#git status  #这儿注意了:用git commit -am"" 还是用git add index再git commit -m"" index.html的区别,前面有讲到。
位于分支 master
您的分支领先 'origin/master' 共 1 个提交。
  (使用 "git push" 来发布您的本地提交)
您有尚未合并的路径。
  (解决冲突并运行 "git commit")

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

        双方修改:   index.html

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
#git commit -am"直接am实现不用git add 就提交到master的暂存库里"  
[master 386a151] 直接am实现不用git add 就提交到master的暂存库里
#git push
对象计数中: 12, 完成.
压缩对象中: 100% (11/11), 完成.
写入对象中: 100% (12/12), 1.20 KiB | 0 bytes/s, 完成.
Total 12 (delta 5), reused 0 (delta 0)
To git@git.boosh.com.cn:irdcops/spec.boosh.com.cn.git
   e171ea5..386a151  master -> master


最后,删除feature分支:
# git branch -d feature
已删除分支 feature(曾为 4bcdf8e)。



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
想从线上获取并覆盖本地:
git reset --hard
git pull
实践如下:
git reset --hard
HEAD 现在位于 a7e4eed rollo back
git log
commit a7e4eed0755b8b8c28de63ecc735565169466f8d
Author: 詹金斯 <17080156868@163.com>
Date:   Mon Mar 27 20:55:07 2017 +0800
    rollo back

再想回退是不行的:
git revert 0b82ab0dd0c898e0b7c18714a8b81b417f80a7bb zookeeper-3.4.9.el6.x86_64.spec
fatal: bad revision 'zookeeper-3.4.9.el6.x86_64.spec'

查看状态:
git status
位于分支 master
您的分支和 'origin/master' 出现了偏离,
并且分别有 2 和 2 处不同的提交。
  (使用 "git pull" 来合并远程分支)
未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

再从Git服务器上拉取:
git pull
自动合并 centos7/zookeeper-3.4.9.el6.x86_64.spec
冲突(内容):合并冲突于 centos7/zookeeper-3.4.9.el6.x86_64.spec
自动合并失败,修正冲突然后提交修正的结果。

=======================================================
如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候,

在发布这个配置文件的时候,会发生代码冲突:

error: Your local changes to the following files would be overwritten by merge:
        protected/config/main.php
Please, commit your changes or stash them before you can merge.

如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:

git stash
git pull
git stash pop
然后可以使用Git diff -w +文件名 来确认代码自动合并的情况.



反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:

git reset --hard
git pull
其中git reset是针对版本,如果想针对文件回退本地修改,使用

在CODE上查看代码片派生到我的代码片
git checkout HEAD file/to/restore  


参考自:http://blog.chinaunix.net/uid-10415985-id-4142896.html
http://blog.csdn.net/iefreer/article/details/7679631

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/9290/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2017-6-27 23:12
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]