更新日志:

  • 2016.06.04 晚
    添加 git push --force (用于删除高版本的commit)

  • 2015.11.29 晚
    添加冲突处理工具Meld的教程
    添加在GitHub上Revert一个Pull Request的介绍

  • 2015.11.18 下午
    重构初版博客

在我的另一篇博客 GitHub团队项目合作流程 中,描述了一个团队如何使用GitHub来管理团队项目。但是操作中,可能会遇到一些问题,于是把那些问题放在这里说明。
关于Git使用过程中出现的问题的处理也会更新在这里。

目录:


一、 解决merge时出现的冲突

当你和其他团队成员对同一个文件进行修改后,merge的时候有可能会出现冲突。你可以打开每个冲突的文件,手工解决冲突;也可以借助冲突处理工具来解决冲突。这里分别介绍这两种方式:

  1. 手工解决冲突
    冲突提示如下图所示:

    CONFLICT表示有冲突,在这一行的末尾,显示冲突文件。这里有两个文件冲突,分别是README.md和app.iml
    这里以README.md为例,解决冲突:
    ----------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------
    被红框框住的符号 ======= 是冲突的分割线。
    <<<<<<< HEAD 和分割线之间的是本地的文本
    分割线和 >>>>>>> upstream/dev 之间的是远程分支的文本
    你可以选择保留其中一个版本的文本,然后将三个冲突符号都删除。这样表示已解决冲突。
    如果你想同时保留两个版本,那么只需将冲突符号删除。
    解决冲突后如下图所示:
    ---------------------------------------------------------------------------------------

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

  2. 借助冲突处理工具
    个人认为Meld这个工具比较好用,Android Studio自带的冲突处理工具和它很相似。我用过tortoisegit的工具,感觉没有Meld好用,这里就不介绍了。
    (1) 首先去Meld的官网下载安装文件并安装。->点此进入Meld官网
    (2) 安装完后,打开你的git工具,比如msysgit。执行 git config --edit --global ,此时会打开一个配置文件。在文件最后添加以下四行:
    [merge]
    tool = meld
    [mergetool "meld"]
    path = e:/software/MeldMergeTool/Meld.exe
    提示:path是根据你安装Meld的路径来决定的,同时要把路径中的 \ 改成 / 。从上面可以看出我的安装路径为 e:\software\MeldMergeTool\
    (3) 在merge的时候,如果出现冲突,运行命令 git mergetool 这时就会打开Meld。
    (4) Meld的界面如下:

    冲突的地方会显示红色,如果你想保留本地的代码,则点击左边的 箭头。
    把所有红色(冲突)区域解决后,可以根据实际情况去解决绿色(添加)和灰色(更改)。
    一般保存中间的修改就行。如上图红框处。


二、 回退一个merge

  1. 如果是merge一个GitHub的Pull Request,可以进入要回退的那个Pull Request,在下面有一个revert按钮,可以用来revert一个Pull Request。如下图红框处:
  2. 在命令行里revert
    (1)用 git log 看commit记录
    ----------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------
    现在我们要回退 commit 561dab (也就是图中第一个commit),该commit将Pull Request #113 merge到项目中。
    (2)使用 git revert HEAD -m 1 命令回退
    ----------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------
    如果是非merge的回退,用 git revert 版本号 就行了。但是这里是对merge操作进行revert,需要加上参数 -m 。命令最后加个 1
    为什么要加上 1 呢?看上面(1)的图中的第二个红框,这个 1 对应红框中的 6a3c30c 版本。而如果填 2 ,则对应 b7831df
    继续看log,会发现 6a3c30c 是merge这个Pull Request之前的状态。而 b7831df 则是当前版本之前的一个merge。
    输入命令回车后,会跳出一个文本。
    ----------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------
    目前无视它就行。关闭文本,回到shell,回车。
    ----------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------
    回退成功!这个回退不会删除掉中间的commit记录,而是将这次revert作为一个commit加到commit记录上面。

三、 获取某一commit的修改

假设有commit a b c ,从左到右,c 为最新版。
这时你发现 b 的一个修改有问题,想回退到 a 。但是如果回退到 ac 的commit也会被取消。
这时可以用 git cherry-pick 版本号 这个命令获取 c 的commit。

下图是示例的log记录,从①可以看出,这里从②回退到⑤。



现在我想获取④的commit。使用 git cherry-pick 版本号 将选定版本的提交合并到当前版本。



四、 将低版本push到Github(删掉高版本Commit)

有时候会因为各种原因,想要回退版本。如果没有关联Github或者没有push上去,那问题不大。但是如果你已经push到Github上了,这时候就比较尴尬了,因为普通的push是会被Github拒绝的。虽然Github提供了Revert功能,但是这并不能完全消去一个commit。

先看看reset后被拒绝的样子:

解决方法就是:

  1. 先用 git reset --hard 版本号 回到你想要的版本
  2. 执行 git push --force

    再看看Github:

    当然,一般是推荐用 git push origin HEAD --force 的,能防止因为其他没配置好而产生错误。对我来说差别并不大……

使用Git时一些问题的处理的更多相关文章

  1. 使用git时出现Please make sure you have the correct access rights and the repository exists.问题已解决。

    使用git时,出现Please make sure you have the correct access rights and the repository exists.问题已解决. 今天我在使用 ...

  2. 初次运行git时的配置

    初次运行git时的配置 # 参考文档 https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%88%9D%E6%AC%A1%E8%BF%90%E8% ...

  3. windows使用git时出现:warning: LF will be replaced by CRLF

    windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现提示: 执行以下代码 $ rm -rf .git // 删除.git $ git config -- ...

  4. 以域管理账户连接到TFS或git时,设置IE允许Cookies

    在 Windows 域环境中,每个项目组会创建一个项目管理账户,在和其他项目组进行数据交互时,只需要授予该项目管理账户相应的权限,方便了权限的管理.对于项目组管理账户:domain\admin,该域账 ...

  5. windows使用git时出现:warning: LF will be replaced by CRLF的解决办法

    在Windows环境下使用git进行add的时候,会提示如下warning: “warning:LF will be replacee by CRLF”. 这是因为在Windows中的换行符为CRLF ...

  6. Jenkins连接git时出现“Failed to connect to repository : Command ... HEAD" returned status code 128:”的问题解决

    网上说的解决方法如下: 其实生成ssh时不应该使用当前用户去生成ssh,而是使用jenkins这个用户去生成ssh,然后再去git服务器上配置你生成key,最后再jenkins上配置返回给你的key. ...

  7. 关于VS2019使用Git时遇到的Bug

    最近在运行vs2017时老是卡死,神烦!迫于无奈我从微软官网下载了vs2019,安装后打开项目,发现从git上拉取代码时报错如下: Please make sure you have the corr ...

  8. git 时 出现 Permission denied (publickey).

    https://blog.csdn.net/awp0011/article/details/73368481 第一次使用github.com在本地 执行 git clone git@github.co ...

  9. windows下使用git时生成sshkey和配置

    在windows下如何安装git就不介绍了,我这里主要使用的TortoiseGit,主要记录下在windows上如何通过sshkey链接git 在开始菜单中找到git bash,git bash是gi ...

随机推荐

  1. 跨应用程序域(AppDomain)的单例(Singleton)实现

    转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...

  2. IIS中查看W3P.exe进程对应的应用程序池的方法

    对于IIS6可以运行 iisapp -a来显示应用程序池的性能列表. iisapp.vbs它是一个脚本程序,在安装2003时需要SP1才有 而IIS7可以直接用它的外壳命令 C:"Windo ...

  3. #include <NOIP2010 Junior> 三国游戏 ——using namespace wxl;

    题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之 ...

  4. 使用xpath时出现noDefClass的错误(找不到某个类)

    今天继续封装下jdom 发现jdom引用了个jaxen的jar 如果不导入这个库,使用xpath时出现noDefClass的错误(找不到某个类) 到csdn上 下了个 ok 同时研究了下List的to ...

  5. [No000049]狗日的中年——姜文

    文件名 大小 [No000049]狗日的中年——姜文.7z 228KB

  6. iOS 中 const static extern 关键字总结

    在看一些高手所写的代码时,总是可以看到我们小白平常不用的关键字,一次,两次,三次,不能总是不明不白,现在总结一下日常开发中常用的关键字的作用: 关键字const/static/extern的释义和用法 ...

  7. window.execScript的兼容性写法

    把探嗅浏览器的操作提前到代码加载的时候,在代码加载的时候就立刻进行一次判断,以便让globalEval返回一个包裹了正确逻辑的函数 var globalEval = (function(){ var ...

  8. javascript中String的fromCharCode()方法

    前几天遇到一个bug,后端的模板引擎在输出形如: <div title="111 aaa">内容</div> 这样的内容时,无法输出' '空格,所以只能用' ...

  9. HTML5+jquery整屏页面切换效果

    压缩包下载 演示地址 http://www.yyyweb.com/demo/page-transitions/

  10. C语言--指向多维数组的指针和指针数组

    #include <stdio.h> //void show(char *p[]); ]); int main(){ ][]={","abc","x ...