使用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 ...
随机推荐
- WinMain与wWinMain,win32的字符集问题
刚接触win32开发的会发现,用vs新建一个win32项目默认代码里面的入口函数并不是WinMain而是_tWinMain或者wWinMain,这些都有什么区别呢? WinMain对应的是多字节字符集 ...
- LNMP源码安装
1. mysql安装 # Preconfiguration setup shell > groupadd mysql shell > useradd -r -g mysql -s /bin ...
- 浅谈输入输出”重定向“——基于Linux系统
前言 进程在启动后会自动的打开3个文件:标准输入.标准输出和标准错误输出分别对应文件描述符0.1.2.对于每个进程他们都都维护了一张文件描述符表(file descriptor table),通常fd ...
- Windows 2008 R2 Powershell 3.0
下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=34595&WT.mc_id=rss_alldownloads_all
- AngularJS服务
在使用AngularJS的路由管理和控制视图加载的时候,当新的视图加载进来,原有视图的控制器会被销毁,这是出于内存占用和性能的考虑.服务提供了一种能在应用的整个生命周期内保持和共享数据的方法,它能够在 ...
- eclipse乱码解决方法
eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的.一般默认都是UTF-8或者GBK,当从外部导入的一个工程时,如果该工程的编码方式与eclipse中设置的编码方式不同 ...
- [Basic Information Theory] Writen Notes
- USACO1.5Superprime Rid[附带关于素数算法时间测试]
题目描述 农民约翰的母牛总是产生最好的肋骨.你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们.农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组 ...
- NOIP2008传纸条[DP]
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- 关于using关键字
使用C#访问数据库资源需要如下几步: SqlConnection con=new SqlConnection(str); try { con.Open(); //略 } catch(Exception ...