zoukankan      html  css  js  c++  java
  • Git应用—05Git文件冲突合并的几种情况(转载)

    git文件冲突合并的几种情况

    https://xieye.iteye.com/blog/2433229

    本文描述了git冲突的几种常见情况和解决方案,老鸟请直接忽略本文。
    假设冲突文件是 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的分支功能很强大,应该多使用。
      上面几种情况都没有使用分支。使用分支会更好。
      1)首先,我本地新建并切换分支branch_1,自己起有意义名字,并修改文件。
      git checkout -b branch_1
      vi test/TestCase.php
      git add tests/TestCase.php
      git commit -m "change test"


      2)现在,别人已经更新了远程主分支代码(没更新就极其方便了,也不必说了,快速更新)
      我想把分支合并到主分支。
      我应该,先回到主分支,并更新。
      git  checkout master
      git pull


      3)然后,在本地,把我的修改分支合并上去。
      git merge branch_1
      自动进入vi界面,让你写注释。
      然后会合并好。


      4)类似提示:
      tests/TestCase.php | 3 ++-
      上面,两个加号表示文件增加了两行,一个减号表示文件减少了一行。
      此时,注意,凡是进入vi界面后,
      最好自己再检查一下程序,检查那些被提示修改过的文件,(这是一个好习惯,但我从来不遵守)
      如果认为正确,最后,


    5) git push,推送到远程。
      push之后,远程得到你和他人的所有更新。push之前,仅本地得到你和他人的所有更新。
    ==========
    总结,大部分情况下,都推荐使用第5种,使用分支的方法,来管理文件修改冲突。

    -----------------------------------------------------------------------------------------------------------------------------------

    Git fetch和git pull的区别:

    都可以从远程获取最新版本到本地

    1.Git fetch:只是从远程获取最新版本到本地,不会merge(合并)

    $:git fetch origin master   //从远程的origin的master主分支上获取最新版本到origin/master分支上
    $:git log -p master..origin/master //比较本地的master分支和origin/master分支的区别
    $:git merge origin/master          //合并

    2.Git fetch:从远程获取最新版本并merge(合并)到本地

    $:git pull origin master  //相当于进行了 git fetch 和 git merge两部操作

    实际工作中,可能git fetch更好一些, 因为在merge前,可以根据实际情况决定是否merge


    再说导致报错:error: You have not concluded your merge (MERGE_HEAD exists).的原因可能是在以前pull下来的代码自动合并失败

    解决办法一:保留本地的更改,中止合并->重新合并->重新拉取

    $:git merge --abort
    $:git reset --merge
    $:git pull

    解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)

    $:git fetch --all
    $:git reset --hard origin/master
    $:git fetch



  • 相关阅读:
    linux IO调度算法
    Programming Languages: Application and Interpretation
    zz 跟风小结一下孕期~
    UML和模式应用学习笔记-1(面向对象分析和设计)
    ASP.NET交互Rest服务接口(Jquery的Get与Post方式)
    Linq To Xml操作XML增删改查
    MSSQL数据库迁移到Oracle(二)
    MSSQL数据库迁移到Oracle
    学习EF之CodeFirst二(数据库对应映射)
    学习EF之CodeFirst一
  • 原文地址:https://www.cnblogs.com/gispathfinder/p/10359910.html
Copyright © 2011-2022 走看看