精华内容
下载资源
问答
  • ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

    万次阅读 多人点赞 2016-10-26 22:32:31
    ViewPager,ScrollView 嵌套ViewPager滑动冲突解决这篇博客主要讲解一下几个问题 - 粗略地介绍一下View的事件分发机制 - 解决事件滑动冲突的思路及方法 - ScrollView 里面嵌套ViewPager导致的滑动冲突 - ...

    我的公众号程序员徐公,四年中大厂工作经验,回复黑马,领取 Android 学习视频一份,回复徐公 666,可以获得我精心整理的简历,带你走近大厂。

    这篇博客主要讲解一下几个问题

    • 粗略地介绍一下View的事件分发机制
    • 解决事件滑动冲突的思路及方法
    • ScrollView 里面嵌套ViewPager导致的滑动冲突
    • ViewPager里面嵌套ViewPager 导致的滑动冲突
    • 轮播图的几种实现方式

    文章首发地址CSDN:http://blog.csdn.net/gdutxiaoxu/article/details/52939127

    先看一下效果图

    ScrollView里面嵌套ViewPager

    在这里插入图片描述

    ViewPager里面嵌套ViewPager

    在这里插入图片描述


    View的 事件分发机制

    这篇博客不打算详细讲解View的事件分发机制,因为网上已经出现了一系列的好 文章,我自己的水平也有限,目前肯定写得不咋的。

    先啰嗦一下,View 的事件分发机制主要涉及到一下三个 方法

    • dispatchTouchEvent ,这个方法主要是用来分发事件的
    • onInterceptTouchEvent,这个方法主要是用来拦截事件的(需要注意的是ViewGroup才有这个方法,View没有onInterceptTouchEvent这个方法
    • onTouchEvent 这个方法主要是用来处理事件的
    • requestDisallowInterceptTouchEvent(true),这个方法能够影响父View是否拦截事件,true 表示父 View 不拦截事件,false 表示父 View 拦截事件

    下面引用图解 Android 事件分发机制这一篇博客的内容

    在这里插入图片描述

    • 仔细看的话,图分为3层,从上往下依次是Activity、ViewGroup、View
    • 事件从左上角那个白色箭头开始,由Activity的dispatchTouchEvent做分发
    • 箭头的上面字代表方法返回值,(return true、return false、return super.xxxxx(),super 的意思是调用父类实现。
    • dispatchTouchEvent和 onTouchEvent的框里有个【true---->消费】的字,表示的意思是如果方法返回true,那么代表事件就此消费,不会继续往别的地方传了,事件终止。
    • 目前所有的图的事件是针对ACTION_DOWN的,对于ACTION_MOVE和ACTION_UP我们最后做分析。
    • 之前图中的Activity 的dispatchTouchEvent 有误(图已修复),只有return super.dispatchTouchEvent(ev) 才是往下走,返回true 或者 false 事件就被消费了(终止传递)。

    总结

    当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View,TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,

    • 如果dispatchTouchEvent返回true 消费事件,事件终结。

    • 如果dispatchTouchEvent返回 false ,则回传给父View的onTouchEvent事件处理;

      onTouchEvent事件返回true,事件终结,返回false,交给父View的OnTouchEvent方法处理

    • 如果dispatchTouchEvent返回super的话,默认会调用自己的onInterceptTouchEvent方法

      默认的情况下interceptTouchEvent回调用super方法,super方法默认返回false,所以会交给子View的onDispatchTouchEvent方法处理

      如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,

      如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。

    关于更多详细分析,请查看原博客图解 Android 事件分发机制,真心推荐,写得很好。


    解决事件滑动冲突的思路及方法

    常见的三种情况

    第一种情况,滑动方向不同

    第二种情况,滑动方向相同

    第三种情况,上述两种情况的嵌套

    在这里插入图片描述

    解决思路

    看了上面三种情况,我们知道他们的共同特点是父View 和子View都想争着响应我们的触摸事件,但遗憾的是我们的触摸事件 同一时刻只能被某一个View或者ViewGroup拦截消费,所以就产生了滑动冲突?那既然同一时刻只能由某一个View或者ViewGroup消费拦截,那我们就只需要 决定在某个时刻由这个 View 或者 ViewGroup 拦截事件,另外的 某个时刻由 另外一个 View 或者 ViewGroup 拦截事件,不就OK了吗?综上,正如 在 《Android开发艺术》 一书提出的,总共 有两种解决方案

    以下解决思路来自于 《Android开发艺术》 书籍

    下面的两种方法针对第一种情况(滑动方向不同),父View是上下滑动,子View是左右滑动的情况。

    外部解决法

    从父View着手,重写onInterceptTouchEvent方法,在父View需要拦截的时候拦截,不要的时候返回false,为代码大概 如下

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final float x = ev.getX();
        final float y = ev.getY();
    
        final int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                mDownPosX = x;
                mDownPosY = y;
    
                break;
            case MotionEvent.ACTION_MOVE:
                final float deltaX = Math.abs(x - mDownPosX);
                final float deltaY = Math.abs(y - mDownPosY);
                // 这里是够拦截的判断依据是左右滑动,读者可根据自己的逻辑进行是否拦截
                if (deltaX > deltaY) {
                    return false;
                }
        }
    
        return super.onInterceptTouchEvent(ev);
    }
    
    
    

    内部解决法

    从子View着手,父View先不要拦截任何事件,所有的事件传递给 子View,如果子View需要此事件就消费掉,不需要此事件的话就交给 父View处理。

    实现思路 如下,重写子 View的dispatchTouchEvent方法,在Action_down 动作中通过方法 requestDisallowInterceptTouchEvent(true) 先请求 父 View不要拦截事件,这样保证子 View 能够接受到 Action_move 事件,再在 Action_move 动作中根据自己的逻辑是否要拦截事件,不需要拦截事件的话再交给 父 View 处理。

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int x = (int) ev.getRawX();
        int y = (int) ev.getRawY();
        int dealtX = 0;
        int dealtY = 0;
        
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                dealtX = 0;
                dealtY = 0;
                // 保证子View能够接收到Action_move事件
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_MOVE:
                dealtX += Math.abs(x - lastX);
                dealtY += Math.abs(y - lastY);
                Log.i(TAG, "dealtX:=" + dealtX);
                Log.i(TAG, "dealtY:=" + dealtY);
                // 这里是够拦截的判断依据是左右滑动,读者可根据自己的逻辑进行是否拦截
                if (dealtX >= dealtY) {
                    getParent().requestDisallowInterceptTouchEvent(true);
                } else {
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                lastX = x;
                lastY = y;
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
            case MotionEvent.ACTION_UP:
                break;
    
        }
        return super.dispatchTouchEvent(ev);
    }
    
    
    
    

    ScrollView 里面嵌套ViewPager导致的滑动冲突

    外部解决法

    如上面所述,从 父View ScrollView着手,重写 OnInterceptTouchEvent方法,在上下滑动的时候拦截事件,在左右滑动的时候不拦截事件,返回 false,这样确保子View 的dispatchTouchEvent方法会被调用,代码 如下

    /**
     * @ explain:这个ScrlloView不拦截水平滑动事件,
     * 是用来解决 ScrollView里面嵌套ViewPager使用的
     * @ author:xujun on 2016/10/25 15:28
     * @ email:gdutxiaoxu@163.com
     */
    public class VerticalScrollView extends ScrollView {
    
        public VerticalScrollView(Context context) {
            super(context);
        }
    
        public VerticalScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public VerticalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @TargetApi(21)
        public VerticalScrollView(Context context, AttributeSet attrs, int defStyleAttr, int
                defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
        }
    
        private float mDownPosX = 0;
        private float mDownPosY = 0;
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            final float x = ev.getX();
            final float y = ev.getY();
    
            final int action = ev.getAction();
            switch (action) {
                case MotionEvent.ACTION_DOWN:
                    mDownPosX = x;
                    mDownPosY = y;
    
                    break;
                case MotionEvent.ACTION_MOVE:
                    final float deltaX = Math.abs(x - mDownPosX);
                    final float deltaY = Math.abs(y - mDownPosY);
                    // 这里是否拦截的判断依据是左右滑动,读者可根据自己的逻辑进行是否拦截
    			
                    if (deltaX > deltaY) {// 左右滑动不拦截
                        return false;
                    }
            }
    
            return super.onInterceptTouchEvent(ev);
        }
    }
    

    内部解决法

    如上面上述,通过requestDisallowInterceptTouchEvent(true)方法来影响父View是否拦截事件,我们通过重写ViewPager的 dispatchTouchEvent()方法,在左右滑动的时候请求父View ScrollView不要拦截事件,其他的时候由子View 拦截事件

    /**
     * @ explain:这个 ViewPager是用来解决ScrollView里面嵌套ViewPager的 内部解决法的
     * @ author:xujun on 2016/10/25 16:38
     * @ email:gdutxiaoxu@163.com
     */
    public class MyViewPager extends ViewPager {
    
        private static final String TAG = "xujun";
    
        int lastX = -1;
        int lastY = -1;
    
        public MyViewPager(Context context) {
            super(context);
        }
    
        public MyViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            int x = (int) ev.getRawX();
            int y = (int) ev.getRawY();
            int dealtX = 0;
            int dealtY = 0;
    
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    dealtX = 0;
                    dealtY = 0;
                    // 保证子View能够接收到Action_move事件
                    getParent().requestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEvent.ACTION_MOVE:
                    dealtX += Math.abs(x - lastX);
                    dealtY += Math.abs(y - lastY);
                    Log.i(TAG, "dealtX:=" + dealtX);
                    Log.i(TAG, "dealtY:=" + dealtY);
                    // 这里是否拦截的判断依据是左右滑动,读者可根据自己的逻辑进行是否拦截
                    if (dealtX >= dealtY) { // 左右滑动请求父 View 不要拦截
                        getParent().requestDisallowInterceptTouchEvent(true);
                    } else {
                        getParent().requestDisallowInterceptTouchEvent(false);
                    }
                    lastX = x;
                    lastY = y;
                    break;
                case MotionEvent.ACTION_CANCEL:
                    break;
                case MotionEvent.ACTION_UP:
                    break;
    
            }
            return super.dispatchTouchEvent(ev);
        }
    }
    
    

    注意事项(坑)

    当我们 ScrollView 的最上层的 Layout 里面多多个孩子的时候,当下面一个孩子是 RecyclerView 或者ListView 的时候,往往会自动滑动到 ListView 或者 RecyclerView 的第一个 item,导致进入界面的时候会导致 RecyclerView 上面的 View 被滑动到界面之外,看不见,这时候的用户体验是比较差的

    即结构如下面的时候

    在这里插入图片描述

    在Activity中的相关解决方法

    于是我查找了相关的资料,在Activity中完美解决,主要要一下两种方法

    第一种方法,重写Activity的onWindowFocusChanged()方法,在里面调用mNoHorizontalScrollView.scrollTo(0,0);方法,滑动到顶部,因为onWindowFocusChanged是在所有View绘制完毕的时候才会回调的,不熟悉的话建议先回去看一下Activity的生命周期的相关介绍

    
    private void scroll() {
        mNoHorizontalScrollView.scrollTo(0,0);
    }
    
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(hasFocus  && first){
            first=false;
            scroll();
        }
    }
    
    
    
    

    第二种解决方法,调用RecyclerView上面的View的一下方法,让其获取焦点

    view.setFocusable(true);  
    view.setFocusableInTouchMode(true);  
    view.requestFocus();
    

    这段代码在初始化的时候就让该界面的顶部的某一个控件获得焦点,滚动条自然就显示到顶部了。

    在Fragment中的相关解决方法

    同样是调用第二种方法,调用RecyclerView上面的View的一下方法,让其获取焦点

    view.setFocusable(true);  
    view.setFocusableInTouchMode(true);  
    view.requestFocus();
    

    这段代码在初始化的时候就让该界面的顶部的某一个控件获得焦点,滚动条自然就显示到顶部了。但是该方法存在缺点,就是当我们上面的view如果滑动到一半的时候,切换到下一个Fragment,在切换回来的时候,RecyclerView的第一个item会自动滑动到顶部。目前我还没有找到相对比较好的解决这个问题的方法,大家知道相关解决方法的话也欢迎联系我,可以加我 微信或者在留言区评论,谢谢。

    网友提供的解决方案

    关于 ViewPagerActivity 在Fragment页面切换的时候,RecyclerView抢占焦点的问题已经解决,特别 感谢Jianqiu,他的博客地址:http://niorgai.github.io/

    在 ViewPagerActivity 里面的 Fragment的 代码中加入以下代码,可以阻止 RecyclerView 的子 View 获得焦点,从而阻止 RecyclerView 抢占位置。

    // 是为了确保mNoHorizontalScrollView他的子孙不能获得焦点
    mNoHorizontalScrollView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
    

    详细代码见项目中的ListFragement

    个人疑点

    借鉴于解决Activity的方法,目前我还没有找到一个方法是在Fragemnt界面完全绘制完毕以后回调的方法,如果大家知道怎样处理的 话,欢迎大家提出来


    ViewPager里面嵌套ViewPager导致的滑动冲突

    内部解决法

    从子View ViewPager着手,重写 子View的 dispatchTouchEvent方法,在子 View需要拦截的时候进行拦截,否则交给父View处理,代码如下

    public class ChildViewPager extends ViewPager {
    
        private static final String TAG = "xujun";
        public ChildViewPager(Context context) {
            super(context);
        }
    
        public ChildViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            int curPosition;
    
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    getParent().requestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEvent.ACTION_MOVE:
                    curPosition = this.getCurrentItem();
                    int count = this.getAdapter().getCount();
                    Log.i(TAG, "curPosition:=" +curPosition);
                    // 当当前页面在最后一页和第0页的时候,由父亲拦截触摸事件
                    if (curPosition == count - 1|| curPosition==0) {
                        getParent().requestDisallowInterceptTouchEvent(false);
                    } else {//其他情况,由孩子拦截触摸事件
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
    
            }
            return super.dispatchTouchEvent(ev);
        }
    }
    

    外部解决法

    这个如果要采用外部解决法来解决的话想,相对很麻烦,我提一下自己的个人思路,我们可以先测量子View在哪个区域,然后我们在根据我们按下的点是否在区域以内,如果是的话,在根据子View时候需要拦截进行处理


    讨论

    在这里插入图片描述

    对于这种效果,上面是轮播图的,下面是RecyclerView或者ListView的,一般有一下几种实现方式

    • 使用我们上述提高的ScrollView里面嵌套ViewPager和RecyclerView,这种实现方式需要自己解决View滑动事件的冲突,同时还有我在上述提高的在Fragment中存在的问题
    • 使用listView的addHeaderView来实现,或者是通过多种不同的item来实现
    • 使用RecyclerView添加headerView来实现,或者复用多种不同的item来实现。关于RecyclerView如何添加headerView可以参考鸿洋大神的这一篇博客 Android 优雅的为RecyclerView添加HeaderView和FooterView
    • 使用SupportLibrary中的CoordinatorLayout等控件

    其布局文件如下,Activity代码见项目中的SixActivity

    <?xml version="1.0" encoding="utf-8"?>
    
    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/background_light"
        android:fitsSystemWindows="true"
    >
    
        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:fitsSystemWindows="true"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    
        >
    
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_scrollFlags="scroll|snap">
    
    
                <android.support.v4.view.ViewPager
                    android:id="@+id/viewPager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
    
                >
    
                </android.support.v4.view.ViewPager>
    
                <TextView
                    android:id="@+id/tv_page"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:gravity="right"
                    android:text="1/10"
                    android:textColor="#000"/>
    
            </android.support.design.widget.CollapsingToolbarLayout>
    
        </android.support.design.widget.AppBarLayout>
    
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        </android.support.v7.widget.RecyclerView>
    
    
    </android.support.design.widget.CoordinatorLayout>
    
    

    关于CoordinatorLayout的更多用法,可以参考我的这一篇博客使用CoordinatorLayout打造各种炫酷的效果


    总结

    • 当我们滑动方向不同的时候,采用外部解决法和内部解决法,复杂度差不多。
    • 当我们滑动的方向相同的话,建议采用内部解决法来解决,因为采用外部解决法复杂度比较高。而且有时候我们是采用别人的开源控件,这时候去修改别人的源码可能会发生一些意想不到的bug。

    题外话

    • 在这篇博客的最后提高的实现轮播图+list列表的几种实现形式,刚开始是不想写的,后面因为ScrollView里面嵌套ViewPager和RecyclerView在fragment中RecyclerView抢占焦点,在某些情况下用户体验不好,才写出来的,跟这篇博客要讲解的View滑动事件冲突没有多大关系,只是给读者提供多种思路而已
    • 至于CoordinatorLayout,是google IO 2015中提出来的,功能很强大,可以说是专门为了解决嵌套导滑动而产生的,极大地方便了开发者,对于初学者,可以暂时不必掌握它,先把其他的基础学好就好
    • 同时卖一下广告,欢迎大家到我的github上面star或者fork,谢谢

    参考文章:图解 Android 事件分发机制

    文章首发地址CSDN:http://blog.csdn.net/gdutxiaoxu/article/details/52939127

    源码下载地址:https://github.com/gdutxiaoxu/TouchDemo.git

    大家如果觉得不错的话,可以关注我的微信公众号程序员徐公

    1. 公众号程序员徐公回复黑马,获取 Android 学习视频
    2. 公众号程序员徐公回复徐公666,获取简历模板,教你如何优化简历,走进大厂
    3. 公众号程序员徐公回复面试,可以获得面试常见算法,剑指 offer 题解
    4. 公众号程序员徐公回复马士兵,可以获得马士兵学习视频一份

    展开全文
  • git提交冲突解决

    千次阅读 2018-10-17 11:59:12
    Git冲突解决方案 在程序开发的时候,我们使用Git的时候,不得不面临着一个文件被多个人修改和提交,这样就会产生冲突,如果处理不好,不仅冲突解决不了,还会造成回滚代码,或者代码覆盖,损失利益,所以我通过实践...

    Git冲突解决方案

    在程序开发的时候,我们使用Git的时候,不得不面临着一个文件被多个人修改和提交,这样就会产生冲突,如果处理不好,不仅冲突解决不了,还会造成回滚代码,或者代码覆盖,损失利益,所以我通过实践模拟,写了此规范操作,希望同事们遇到冲突无法解决时,可以帮助大家解决问题。一共十个步骤,每一步都不能简化省略。

    第一步:pull一下,更新程序

    方法:右键项目->Team->pull

    此时会出现冲突,如上图,红框内就是冲突的文件,一份是来自本地,一份是来自服务器端。项目名称的右边有个向下的箭头,表示没有pull成功,数字代表冲突的文件数,现在先点击OK,不用管它。

    第二步:同步,查看冲突代码

    方法:右键项目->Team->SynchronizeWorkspace

    可以看到左侧的一行目录中,红方块表示有代码冲突的文件,右箭头代表没有冲突,但是服务器端要更新的文件。没有冲突的文件可以先不管它,双击红方块,可以看到本地和服务器端的代码对比图,可以清楚看到,左侧是本地的,右侧是服务器端的。

    第三步:人工修改,保持本地最新版

    方法:可以直接对照服务器端进行修改。

     假如,我们人工修改了前三行,前三行要服务器端的代码,剩下的两行要我们本地的代码,这样让本地组成最新版的代码。Crtl+S保存,我们可以看到原来冲突的五行,变成了两行。

    第四步:Add to Git Index,提交修改

    方法:冲突文件右键->Add to Git Index

    此时,红方块文件上出现了一个黑色的*,此步骤表示已经修改完了,准备好提交了。

    第五步:Commit提交

    方法:项目右键->Team->Commit或者使用Git Staging,我用的是Git Staging

    此方法目的是要把修改好的文件提交到本地仓库,一定要记住,修改了什么文件就提交什么,不要全部提交,如果使用Git Staging,则拖到Staged Changes中,然后写好Commit Message,最后选择Commit。【不要选择Commit and Push,你是push不上去的,因为现在还属于冲突状态,而Commit是提交到本地仓库】。

    因为还没push,所以此时可以看到项目右边的箭头出现了一个上箭头,可以理解为push到服务器端不成功,

    第六步:再次pull一下,更新程序

    方法:项目右键->Team->pull

    此时,我们可以看到项目出现了合并项,文本框内出现的两个版本就是要合并的对象,不用管它,点击OK。

    我们可以看到,红方块又出现了。这次是提示你要进行人工合并,步骤和第三步有所不同。

    第七步:人工合并,更新到最新版

    我们点开程序后,发现,出现了很多非程序的东西,甚至造成了文件报错,这是因为把两个版本的文件进行了合并,并且保留所有版本,于是要人工对不想要的版本进行删除。HEAD包含的是本地的版本,而====下面的是服务器端的版本。假如我们修改后,得到如下版本:

    此时本地版本为最新版本。

    第八步:Add to Git Index,确认修改

    方法:冲突文件右键->Team->Add to Git Index

    我们可以看到文件又变成了我们熟悉的黑色*。

    第九步:Commit提交

    方法:Git Staging或者项目右键->Team->Commit

    此时,我们发现冲突文件已经放入Staged Changes,而Message中写的是冲突文件和合并的对象,不过不用管它,照样删除,重新写上自己想写的文字,例如“OK,测试Git提交”。

    设置好后,点击Commit进行提交,此时,依然是提交到本地仓库。此时发现下箭头不见了,只剩下了上箭头,说明pull已经成功了。

     

    第十步:push

    方法:项目右键->Team->push branch

    此步骤是本地仓库向远程仓库进行提交,选择push branch是要提交到指定的分支,这样做就不会造成分支选择错误。选择好提交路径,点击Next。

     

    此时,没有了冲突,点击Finish就可以提交了,然后点击OK,大功告成,此时项目名称右侧的箭头也全部消失了。恭喜你,你已经把本地最新版的代码提交到Git上了。

    展开全文
  • Idea 版本控制冲突解决

    万次阅读 2018-05-18 16:44:40
    更新代码时 , 版本库文件和本地冲突 , 会弹出文件冲突显示窗 , 里面罗列了本次更新冲突的文件列表及冲突解决方案2 . 双击冲突的文件或点击合并按钮 , 进入合并模式 , 内容如下3 . 合并文件 , 冲突解决4 . 另一种&...
    1 . 更新代码时 , 版本库文件和本地冲突 , 会弹出文件冲突显示窗 , 里面罗列了本次更新冲突的文件列表及冲突解决方案
    

    2 . 双击冲突的文件或点击合并按钮 , 进入合并模式 , 内容如下

    3 . 合并文件 , 冲突解决

    4 . 另一种"Eclipse"式的冲突解决方案

    5 . 按照Eclipse中的解决方式 , 处理冲突内容

    6 . 如果在"冲突文件处理窗口"误关了之后 , 文件就会变成45的形式 , 这时还可以点击菜单 -> subversion ->resolve Text Confict , 重新进入合并模式
    展开全文
  • git am 冲突解决技巧

    千次阅读 2018-03-24 11:47:36
    git am 冲突解决技巧 -v0.1 2018.3.21 Sherlock init i Westford 使用git am合patch的时候可能有冲突出现,这个时候,手动解决的办法是看看冲突在哪里, 然后手动的把那个patch和入。手动合入需要的时间太长. ...

    git am 冲突解决技巧

    -v0.1 2018.3.21 Sherlock init i Westford

    使用git am合patch的时候可能有冲突出现,这个时候,手动解决的办法是看看冲突在哪里,
    然后手动的把那个patch和入。手动合入需要的时间太长.

    我们可以用git apply –reject patch的方式合入。这里需要注意几个问题。

    git apply只会看到文件,它把patch里的一个个diff段拆出来, 然后合入相应的文件里,
    而且git apply只会合入当前目录下的diff段,所以上面的命令要到所有diff段的最大的
    一个目录里去执行,一般为了方便就在代码的根目录里执行。git apply后相当于修改了
    原文见,所以要git add,git commit下。–reject的这个参数会把有冲突的段保存在一个
    .rej的文件里。

    所以,一般git am合patch的步骤可以是这样的:

    1. git am patch –> 没有conflict,over!

    2. 有冲突的时候: cd code_root/
      git apply –reject patch

    3. 在.rej文件里找见冲突的diff段,手动修改对应的代码

    4. git add related_files

    5. git am –resolved

    注意最后一个操作, 我们现在已经把git am的冲突解决,用git am –resovled可以继续git
    am的操作把commit log也自动的打上!

    展开全文
  • SVN版本冲突解决方法

    千次阅读 2016-01-21 09:36:29
    SVN版本冲突解决详解 解决版本冲突的命令。在冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新。冲突发生时,subversion会在WorkCopy中保存所有的目标文件版本(上次更新...
  • git cherry-pick冲突解决

    万次阅读 2019-02-20 15:21:48
    1.git cherry-pick应用场景 当团队合作开发的过程中,线上环境master可能要合成dev中的部分功能,也可以...2.冲突解决方案 ①切换到dev环境 git checkout dev ②查看提交日志 git log 挑拣出自己需要的pick...
  • Git冲突解决方案

    万次阅读 2017-06-09 17:24:03
    Git冲突解决方案 在程序开发的时候,我们使用Git的时候,不得不面临着一个文件被多个人修改和提交,这样就会产生冲突,如果处理不好,不仅冲突解决不了,还会造成回滚代码,或者代码覆盖,损失利益,所以我通过实践...
  • eclipse git 解决冲突 解决 mergetool 不能使用问题 本地代码 远程代码 第一步 --> 同步远程资源库,检查是否存在冲突 这里有冲突出现 第二步 --> 如果存在冲突,将本地代码提交到本地仓库 **注意:...
  • svn 冲突解决

    千次阅读 2014-11-18 11:49:06
    第一种,利用update的选项进行冲突解决,也就是说不管当前拷贝副本是否是最新版本,都使用—accept参数作为冲突处理方式  --accept ARG : specify automatic conflict resolution action  ('postpone', 'base...
  • JAVA中的坑写在前面HtmlUnit,利用java获取完整的HTML(包含css,js加载完成之后的效果)commons-io版本冲突解决方案 写在前面 项目中遇到需要爬虫,但是目标网址存在着动态js加载数据,通过普通的http请求获取下来...
  • TortoiseGit冲突解决方案

    千次阅读 2019-04-16 10:33:27
    解决办法一 -> stash save(把自己的代码隐藏存起来) -> 重新pull -> stash pop(把存起来的隐藏的代码取回来 -弹出页面直接ok就可以) -> 代码文件会显示冲突 -> 右键选择edit conficts,...
  • TortoiseSVN 冲突解决详细步骤

    千次阅读 2015-12-07 19:59:02
    记得VSS在Visual Studio里边解决冲突就非常完美,冲突自动报告,自动弹出冲突解决窗口,让你处理该怎么合并两份版本。合并后自动签入commit。 小乌龟在这里就欠缺点了~~~ 1.发现冲突。大家不要惊慌~~~~ ...
  • Flutter中2个库的类名冲突解决方法

    万次阅读 热门讨论 2020-12-28 18:02:28
    Flutter中2个库的类名冲突解决方法 例如,我们在使用国际化时,会给组件(如,日历组件),设置一个本地属性来显示当地语言: locale: Locale("zh") 上例中,显示中文。 当我们引用第三方库 date_format 来格式化...
  • eclipse中svn冲突解决

    千次阅读 多人点赞 2015-10-23 11:03:53
    最近在和同事做项目的时候出现了冲突,冲突解决方法是这样的:   右键项目 -> Team -> 与资源库同步    2.在同步视图中选择Conflicts Mode,以便首先查看解决冲突    3.双击需要解决的冲突文件...
  • 1.安装maven helper file -> setting -> plugins -> maven helper 下载插件并安装。...2.选中冲突的,会有冲突细节 3.在冲突的依赖上右键,会提示排除,点击即可,会自动添加依赖排除 ...
  • [svn]svn conflict 冲突解决

    千次阅读 2019-02-19 10:27:08
    [svn]svn conflict 冲突解决 转自:http://www.gezila.com/tutorials/17290.html  目录: 1. 同一处修改文件冲突  1.1. 解决方式一  1.2. 解决方式二  1.3. 解决总结 2. 手动解决冲突  2.1. 冲突背景1 ...
  • idea中push代码git冲突解决

    千次阅读 2019-02-19 17:39:04
    1.冲突出现情景 ...2.冲突解决方案 ①冲突出现后,一直merge 最左边的方框表示自己本地的版本,最右边方框表示远程服务器的版本,中间的则是更改后合成的版本,确定好中间的版本内容后,点击app...
  • 代码冲突解决

    千次阅读 2017-09-28 12:13:15
    冲突代码在git的使用过程中在所难免,团队中每个人负责的代码块或多或少的多有交叉,所以我们有必要学习有关于代码冲突解决方案。 遇见冲突代码 Acceppt Yours :你接受 Acceppt Theirs:他们接受 Merge:手动...
  • 冲突解决之后,需要使用svnresolved来告诉subversion冲突解决,这样才能提交更新。冲突发生时,subversion会在WorkCopy中保存所有的目标文件版本(上次更新版本、当前获取的版本,即别人提交的版本、自己更新的...
  • MySQL冲突解决

    千次阅读 2018-12-25 20:15:54
    原因: 电脑本地已经安装过一个mysql, 两个mysql会冲突 杀死mysql 删除mysql服务 邮件使用管理员启动xampp 点击启动 如果mysql还是启动失败 点击左侧的X按钮 安装MySQL服务 然后启动 ...
  • git 冲突解决

    千次阅读 2016-03-15 21:37:23
    在git的使用过程中难免会碰到一些冲突,那么该怎么解决呢? 冲突会出现在什么地方呢?git pull 的时候,提示有冲突文件error: Your local changes to the following files would be overwritten by merge: ...
  • java中hash冲突解决方法有 冲突池方法 吗? 如果有,在什么情形用比较好? 本人认为用 冲突池 不如用 分离链方法 更好,不知道理解对不对 网上关于冲突池的材料很少,我是在一本数据结构书里看到的
  • 项目管理过程中六种冲突解决方法

    千次阅读 2020-05-10 01:17:39
    集合多方的观点和意见,得出一个多数人接受和承诺的冲突解决方案。 合作:两人一商量,今晚吃面条,明晚吃包子。 面对/解决问题 (Problem Solving/Confrontation) 通过审查备选方案,把冲突当作需要解决的问题来...
  • IntelliJ IDEA Git版本冲突解决方法

    千次阅读 2019-05-30 15:32:53
    IntelliJ IDEA Git版本冲突解决方法 在一个大项目开发,经常多个人一起开发会改到同一个文件,这个时候第一个pull的可以正常,但是后面的pull就会有问题了。 1、查看pull的错误信息 左下角Console出现错误信息,...
  • git 配置文件冲突解决办法

    千次阅读 2016-12-28 22:02:28
    git 配置文件冲突解决办法
  • git学习(七) Git合并冲突解决办法

    千次阅读 2018-10-27 20:48:06
    git命令解决冲突 比如在dev1上合并master分支 git merge master 出现冲突 解决办法如下: git status 查看冲突文件 手动解决冲突文件内冲突 git add. git commit -m &quot;xxxx&quot; git push -u ...
  • git的冲突解决--git rebase之abort、continue、skip

    万次阅读 多人点赞 2019-03-26 09:53:57
    git的冲突解决–git rebase之abort、continue、skip 原文转自:http://www.cnblogs.com/chenjunjie12321/p/6876220.html (1)应用实例描述 假设在github或者gitoschina上建立了一个项目,默认分支为master分支,...
  • idea上git冲突解决

    万次阅读 2017-07-29 16:21:08
    Idea中Git的使用和两种类型的冲突解决 发表于2017/6/16 17:35:03 203人阅读 分类: 程序开发 在idea开发工具中使用Git时,主要用到的快捷按钮如下五个: 这五个按钮的使用说明及在idea中如何配置和使用git...
  • numpy1.19.4与python3.9版本冲突解决

    千次阅读 2020-12-04 21:50:24
    numpy1.19.4与python3.9版本冲突解决 一、问题分析 runtimeError: package fails to pass a sanity check解决方法如下: 解决一:使用python3.9和numpy1.19.4时会发生此错误,卸载numpy1.19.4并安装1.19.3, 即可解决...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 603,295
精华内容 241,318
关键字:

冲突的解决