项目开发过程中常见的git问题以及解决方式

项目开发过程中常见的git问题以及解决方式,例如两笔修改之间的差异 撤销本地修改 更新别人的临时修改到本地 然后重新提交到服务器 解决冲突 git pull下载远程仓库失败等等

1】、查看历史日志
        $git log                            #详细的包括提交用户、日期、提交内容        
        $git log --oneline                    #日志太多时,可使用单行方式查看2】、查看‘已修改的、但未通过add命令添加到index索引区的文件’与本地git仓库的差异
        $git diff                            #当查看内容太多时,随时可以按‘q’键退出
        或者
        $git diff > ./out/gitdiff.txt        #变更较大时,查看gitdiff.txt文件。发补丁可以用这种方式
        该命令显示工作目录和上次提交间的差异;这些内容在运行 "git add <file...>"命令时就会被暂存到index区。
    【3】查看任何两个提交(commit)记录之间单个文件的差别
        $git log --oneline
            493079a 提高xxxx功能
            73cfbc5 解决xxxx异常问题,xxxxx选项
            920f644 更新所xxxx接口适应android4.0系统,包括ak4183,cdtctp1010,ft5406,pixcir等
            f7a3b5f 创建xxxxxx内核工程
        $git diff 73cfbc5 493079a xxx/include/xxxxx_env.h    #比较73cfbc5和493079a两个commit之间单个文件        4】、查看‘已经通过add命令添加到index索引区的文件(commit将要提交的文件)’与本地git创库的差异
        $git diff --cached
        该命令显示当前的索引和上次提交间的差异;这些内容在运行 "git commit -m"命令时就会被提交。
    【5】、更新已经修改测试OK的驱动文件到index跟踪索引
        $git add <files...>                    #<files...>为已经修改测试OK的驱动文件列表,可以有多个
        $git status
    【6】、发现刚才通过add命令更新的文件还需要进一步修改,想取消刚才的‘add’动作(即取消index索引暂存)
        $git reset HEAD <files...>
        $git status
    【7】、发现工作目录中的编辑修改的文件不理想,想恢复到修改前的状态(即本地仓库里文件状态)
        $git checkout -- <files...>
        $git status
    【8】、将index跟踪索引内容提交到本地git仓库
        $git status
        $git commit -m "你的版本更新信息(可以使用中文)"
        $git status
    【9】、比较任何两个提交(commit)记录之间的差别
        $git log    #先git log查看更新记录
            commit 89cdc80a98e8ae80c0911c3d12e3aeb3123684dc
            Author: xxxxxxx <xxxxx@xxx.com.cn>
            Date:   Thu Feb 2 17:48:20 2012 +0800

                解决xxx录音声音小的问题
                
            commit ea75b2c891c8eb47455c5ec88147f45d8dd8fcc7
            Author: xxxxx <xxxx@xxxx.com.cn>
            Date:   Thu Feb 2 17:35:20 2012 +0800

                解决xxxx相机为录像时,前置摄像头切换到后置摄像头时,会出现花屏

            commit 430806251ccd178e79c102508b68828a0cbaced6
            Author: xxxx <xxxx@xxxx.com.cn>
            Date:   Thu Feb 2 14:56:41 2012 +0800

                Create for rk29 android4 sdkv210 kernel
        $git diff ea75b2c 4308062 #选择要对比的两个版本,对应commit栏前7位字符即可,这里选最早的两个版本为例
            diff --git a/xxxx/camera/xxxxx.c b/xxxx/camera/xxxxx.c
            index fc7e219..437f109 100755
            --- a/xxxx/camera/xxxxx.c
            +++ b/xxxx/camera/xxxxx.c
            @@ -48,11 +48,11 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
             #define SENSOR_ID 0x92
             #define SENSOR_MIN_WIDTH    176
             #define SENSOR_MIN_HEIGHT   144
            -#define SENSOR_MAX_WIDTH    1280//1600
            -#define SENSOR_MAX_HEIGHT   720//1200
            -#define SENSOR_INIT_WIDTH      1280//1600   /* Sensor pixel size for sensor_init_data array */
            -#define SENSOR_INIT_HEIGHT  720//1200
            -#define SENSOR_INIT_WINSEQADR sensor_sxga//sensor_uxga
            +#define SENSOR_MAX_WIDTH    1600
            +#define SENSOR_MAX_HEIGHT   1200
            +#define SENSOR_INIT_WIDTH      1600         /* Sensor pixel size for sensor_init_data array */
            +#define SENSOR_INIT_HEIGHT  1200
            +#define SENSOR_INIT_WINSEQADR sensor_uxga
             #define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8
        $git log10】、同步服务器git仓库到本地仓库时,遇到冲突的解决办法
        $git pull
        zhangsan@192.168.1.1's password: sos123
            ... 如有CONFLICT冲突提示:Automatic merge failed; fix conflicts and then commit the result.....
            ...手动解决版本合并问题 ...
        $git add <files...>                        #修改完冲突文件后重新更新冲突的文件,*没有冲突时不需要该步骤*
        $git commit -m “使用张三的修改方法”        #重新提交引起冲突的文件,*没有冲突时不需要该步骤*
        $git status                                #查看状态
        $git log11】、git-pull下载远程仓库失败,是由于本地仓库有修改未提交、或者冲突造成,比如:
        $git pull
        $git status
            # On branch master
            # Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
            #
            # Changes not staged for commit:
            #   (use "git add <file>..." to update what will be committed)
            #   (use "git checkout -- <file>..." to discard changes in working directory)
            #
            #       modified:   xxx/include/xxxx.h
            #
            no changes added to commit (use "git add" and/or "git commit -a")
        >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        以上错误时由于本地工作目录修改了wisky/include/wisky_env.h文件而未提交造成,有两种解决办法:
        a、wisky_env.h的修改是有用修改且通过测试验证OK,则先提交该文件
            $git add xxx/include/xxx.h
            $git commit -m "请填写修改信息"
        b、xxxx.h的修改是无用修改,则可以先恢复该文件到未修改状态(本地仓库状态)。
            $git checkout -- xxx/include/xxxx.h
            $git status
        在以上步骤后,这时候可以再次使用git-pull正常同步代码了:
            $git pull
            $git status

        
    【12】、列出两个提交之间不同的文件路径名:
        $git log db82fae...aa929a5 --stat
        或者
        git diff db82fae..aa929a5 --stat
    【13】、修改最后一次提交
        有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,
        可以使用 --amend 选项重新提交:
        $git commit --amend
        此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,
        相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。启动文本编辑器后,会
        看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。
        
        如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:
        $git commit -m 'initial commit'
        $git add forgotten_file
        $git commit --amend
        上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
    【14】、储藏当前的工作状态到stash储藏区
        当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你这时候想
        通过git pull命令更新远程服务器上的一些重要更新到本地,发现无法通过,这是由于服务
        器上有些文件与你的工作目录中修改文件不一致造成的。解决这个问题的办法就是先通过git stash命令
        储藏你的当前工作,将修改过的被追踪文件和暂存变更保存到stash堆栈中,git-pull完成后随时
        可以恢复先前状态继续工作。

        操作示例如下:
        1、暂存当前工作状态
        $git status            #查看工作目录中文件修改状态
            # Changes not staged for commit:
            #       modified:   init/main.c
            #       modified:   usr/gen_init_cpio.c
        $git pull            #想更新远程仓库合并时Git发现某个文件与工作目录不相同会提示,并放弃合并
            error: Your local changes to the following files would be overwritten by merge:
                    init/main.c

        这时候如果不想放弃你工作目录中的修改,可以通过git stash储藏你的当前状态到堆栈中:
        $git stash
        或者
        $git stash save "message信息备注"    #message信息可以添加备注
        $git status            #储藏后再查看你的工作目录就干净了

        2、在储藏完成后就可以再次git pull进行更新了
        $git pull
        $git log --oneline

        3、更新完后,需要恢复你之前储藏到堆栈中的工作状态
        先要查看现有的储藏,你可以使用git stash list命令:
        $git stash list
            stash@{0}: WIP on master: 049d078 user1 changed main.c
            stash@{1}: WIP on master: c264051 add touch screen driver
            stash@{2}: WIP on master: 21d80a5 create git test project
        在这个示例中,之前已经进行了两次储藏,所以你可以看到三个不同的储藏。
        如果你想应用更早的储藏,你可以通过名字指定它,像这样:git stash apply --index stash@{2}。
        如果你不指明,Git 默认使用最近的储藏并尝试应用它:
        $git stash apply --index
            Auto-merging init/main.c
            # On branch master
            # Changes not staged for commit:
            #   (use "git add <file>..." to update what will be committed)
            #   (use "git checkout -- <file>..." to discard changes in working directory)
            #
            #       modified:   init/main.c
            #       modified:   usr/gen_init_cpio.c
        选项apply只尝试应用储藏的工作——储藏的内容仍然在栈上。要移除它,
        你可以运行 git stash drop,加上你希望移除的储藏的名字:
        $git stash list
            stash@{0}: WIP on master: 049d078 user1 changed main.c
            stash@{1}: WIP on master: c264051 add touch screen driver
            stash@{2}: WIP on master: 21d80a5 create git test project
        $git stash drop stash@{0}
            Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
        除了git stash apply命令,你也可以运行git stash pop来重新应用储藏,并同时立刻将其从堆栈中移走。
        
        之后你就可以继续进行原先的调试修改工作了。
        总结起来就是三个命令组合: git stash + git pull + git stash apply --index

给你个网址自己学,https://www.liaoxuefeng.com/wiki/896043488029600

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^