使用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 ...
随机推荐
- 感觉没睡好就..-shenmedoumeixie....
hi 昨晚没睡好,虽然梦很香,但睡不好没精神做科研啊... 1.jQuery 十二.实现聊天室创建 12.1 基本功能 登陆: 无刷新实时交流: 支持表情. 12.2 大致效果 登陆——>验证, ...
- Qt基础之开发环境部署
将 Qt 5.6 集成至 VS2015 摘要: 由于VS2015不再支持addin,所以要用其他手段. 这里给出64位系统下的安装步骤,32位类似. 一.安装VS2015 过程略.值得注意的是要选择需 ...
- Gprinter热敏打印机光栅位图点阵数据解析工具
最近参与的项目有一个需求,解析佳博热敏打印机的光栅位图点阵数据并保存为图片文件.数据是通过Bus Hound抓取的,如下图所示. 其中1b 40为初始化打印机的指令,对应的ASCII码为ESC @,1 ...
- web 小知识
document.write和innerHTML的区别 document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open.每次写完关 ...
- VR可以用做除游戏外的哪些地方
虚拟现实可以将你传送到平时不敢去的地方, 例如喜马拉雅山顶. 也可以将你带到人类几乎不可能到达的地方, 例如世界上最深处, 马里亚纳海沟.马里亚纳海沟最深处的水压可是达到惊人的110Mpa, 这个高压 ...
- Makefile规则③规则语法、依赖、通配符、目录搜寻、目标
规则语法 通常规则的语法格式如下: TARGETS : PREREQUISITES COMMAND ... 或者: TARGETS : PREREQUISITES ; COMMAND COMMAND ...
- SQL2012连接字符串
安装了sqlserver2012数据库,测试一包代码,搜索网上的方法,死活连接不上,最后偶然测试通过,居然是连接字符串的问题. “如果开发软件的时候是在局域网或者是在本机,并且数据库不在远程计算机上面 ...
- [No00003F]richtextbox实现拖放
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { Initialize ...
- 改变TableView中的分割线位置
加上以下代码,可以让系统的分割线位置置于起始位置 #pragma mark --- 设置分割线位置为起始位置-(void)viewDidLayoutSubviews{ if ([self.tab ...
- crontab日常使用梳理
在日常的运维工作中,对crontab定时任务的制定是再寻常不过的了.根据以往的使用经验梳理如下: 基本格式 :* * * * * command分 时 日 月 周 命令解释:第1列表示分钟1-59 每 ...