使用Git时一些问题的处理
更新日志:
2016.06.04 晚
添加git push --force(用于删除高版本的commit)2015.11.29 晚
添加冲突处理工具Meld的教程
添加在GitHub上Revert一个Pull Request的介绍2015.11.18 下午
重构初版博客
在我的另一篇博客 GitHub团队项目合作流程 中,描述了一个团队如何使用GitHub来管理团队项目。但是操作中,可能会遇到一些问题,于是把那些问题放在这里说明。
关于Git使用过程中出现的问题的处理也会更新在这里。
目录:
一、 解决merge时出现的冲突
当你和其他团队成员对同一个文件进行修改后,merge的时候有可能会出现冲突。你可以打开每个冲突的文件,手工解决冲突;也可以借助冲突处理工具来解决冲突。这里分别介绍这两种方式:
手工解决冲突
冲突提示如下图所示:

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

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

---------------------------------------------------------------------------------------借助冲突处理工具
个人认为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
- 如果是merge一个GitHub的Pull Request,可以进入要回退的那个Pull Request,在下面有一个revert按钮,可以用来revert一个Pull Request。如下图红框处:

- 在命令行里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 。但是如果回退到 a , c 的commit也会被取消。
这时可以用 git cherry-pick 版本号 这个命令获取 c 的commit。
下图是示例的log记录,从①可以看出,这里从②回退到⑤。

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

四、 将低版本push到Github(删掉高版本Commit)
有时候会因为各种原因,想要回退版本。如果没有关联Github或者没有push上去,那问题不大。但是如果你已经push到Github上了,这时候就比较尴尬了,因为普通的push是会被Github拒绝的。虽然Github提供了Revert功能,但是这并不能完全消去一个commit。
先看看reset后被拒绝的样子:

解决方法就是:
- 先用
git reset --hard 版本号回到你想要的版本 执行
git push --force

再看看Github:

当然,一般是推荐用
git push origin HEAD --force的,能防止因为其他没配置好而产生错误。对我来说差别并不大……
使用Git时一些问题的处理的更多相关文章
- 使用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.问题已解决. 今天我在使用 ...
- 初次运行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% ...
- windows使用git时出现:warning: LF will be replaced by CRLF
windows中的换行符为 CRLF, 而在linux下的换行符为LF,所以在执行add . 时出现提示: 执行以下代码 $ rm -rf .git // 删除.git $ git config -- ...
- 以域管理账户连接到TFS或git时,设置IE允许Cookies
在 Windows 域环境中,每个项目组会创建一个项目管理账户,在和其他项目组进行数据交互时,只需要授予该项目管理账户相应的权限,方便了权限的管理.对于项目组管理账户:domain\admin,该域账 ...
- windows使用git时出现:warning: LF will be replaced by CRLF的解决办法
在Windows环境下使用git进行add的时候,会提示如下warning: “warning:LF will be replacee by CRLF”. 这是因为在Windows中的换行符为CRLF ...
- Jenkins连接git时出现“Failed to connect to repository : Command ... HEAD" returned status code 128:”的问题解决
网上说的解决方法如下: 其实生成ssh时不应该使用当前用户去生成ssh,而是使用jenkins这个用户去生成ssh,然后再去git服务器上配置你生成key,最后再jenkins上配置返回给你的key. ...
- 关于VS2019使用Git时遇到的Bug
最近在运行vs2017时老是卡死,神烦!迫于无奈我从微软官网下载了vs2019,安装后打开项目,发现从git上拉取代码时报错如下: Please make sure you have the corr ...
- git 时 出现 Permission denied (publickey).
https://blog.csdn.net/awp0011/article/details/73368481 第一次使用github.com在本地 执行 git clone git@github.co ...
- windows下使用git时生成sshkey和配置
在windows下如何安装git就不介绍了,我这里主要使用的TortoiseGit,主要记录下在windows上如何通过sshkey链接git 在开始菜单中找到git bash,git bash是gi ...
随机推荐
- system generator 卷积编码器快速设计
卷积码 卷积码是一种特殊的编码方式,不仅与当前的输入有关,还与之前的输入有关.可以用一个多项式来表示一个卷积编码,多项式表示有多少个移位寄存器以及他们怎么与模2加法器相连.比如,下图中的无反馈的卷积编 ...
- WinCE下GPRS自动拨号软件(GPRS AutoDial)
之前在WinCE下调试USB的3G Modem时,写过一个拨号助手RASManager,基本能用.后来车机卖到俄罗斯去,客户老M提供了一个更好的GPRS自动拨号软件GPRS AutoDial,功能完善 ...
- HOLOLENS的空间管理
http://blog.csdn.net/sun_t89/article/details/52460272
- date时间函数
时间函数: date();和time();的相互转换 time(); 在PHP中单位是秒,在js中是毫秒. microtime(); 毫秒 date('Y-m-d H:i:s',time()); ...
- JavaScript打开窗口与关闭页面操作大全
JavaScript新开窗口 onClick="javascript:window.location='http://www.sowsoy.com'" JavaScript新开一个 ...
- Maven 常用命令, 备忘
Maven在现在的Java项目中有非常重要的地位, Maven已经不是Ant这样仅仅用于构建, 首先, 它是一个构建工具, 把源代码编译并打包成可发布应用的构件工具其次, 它是一个依赖管理工具, 集中 ...
- FSL - MELODIC
Source: http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/MELODIC; https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/MELODI ...
- java多线程系类:基础篇:06线程让步
本系类的知识点全部来源于http://www.cnblogs.com/skywang12345/p/3479243.html,我只是复制粘贴一下,特在此说明. 概要 本章,会对Thread中的线程让步 ...
- BZOJ 1024 【SCOI2009】 生日快乐
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- C语言 memset函数盲点
#include <stdio.h> #include <stdlib.h> #include <string.h> struct packet { int len ...