更新日志:

  • 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. WcfDataService with EntityFramework 6 的若干问题

    1.Microsoft.Data.Edm等NuGet包需要升级到5.6版本 2.SVC不要使用DataService基类 class WcfDataService1 : DataService< ...

  2. 退役了退役了-AJAX

    hi 昨晚打球悲剧的把脚崴了. 要知道,上一次崴脚是四年前:那一次伤的是左脚,也是我这么多年打篮球的生涯中,这么多次崴脚中,最严重的一次受伤.休息了整整一个月,受寝室兄弟们的无微不至的照顾,最后也买了 ...

  3. win10 右键菜单添加使用gvim打开方式

    ①打开注册表编辑器,开始-->运行-->regedit ②定位到:HKEY_CLASSSES_ROOT---> * --->Shell,在Shell 上右击,新建---> ...

  4. TC(Total Commander)文件管理神器

    TC文件管理神器 Total Commander是一个会显著提高文件操作效率的工具,而文件操作是应用计算机最基本的功夫,也是伴随一生的操作.因此花一点时间学习,而会受益一世. Total Comman ...

  5. 《你不常用的c#之二》:略谈GCHandle

    我们在使用c#托管代码时,内存地址和GC回收那不是我们关心的,CLR已经给我们暗箱操作.但是如果我们在c#中调用了一个非托管代码,比如vc的DLL,而且他有个回调函数,需要引用c#中的某个对象并操作, ...

  6. Windows 2008 R2 64位上安装wamp失败的原因

    Exception Exception in module wampmanager.exe at 000F15A0... 因测试PHP程序需要,需要在windows系统上布署WAMP环境测试程序,对性 ...

  7. FMDB处理动态插入语句

    昨天做一个需求,参数的数量不确定,所以无法使用这个API: - (BOOL)executeUpdate:(NSString*)sql, ... 但是用 - (BOOL)executeUpdate:(N ...

  8. (原创)解决Excel 互操作错误"检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005"

    最近在.net中处理Excel文件数据导入时报出以下错误: 检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下 ...

  9. .NET Core)的ZooKeeper异步客户端

    支持断线重连.永久watcher.递归操作并且能跨平台(.NET Core)的ZooKeeper异步客户端   阅读目录 什么是ZooKeeper? 项目介绍 提供的功能 使用说明 FAQ 在公司内部 ...

  10. Android开发之旅: Intents和Intent Filters(理论部分)

    引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...