Git代码防丢指南 原 荐

栏目: 编程工具 · 发布时间: 5年前

内容简介:我们在日常使用Git的过程中经常会发生一些意外情况,如果处理不当,则可能会出现代码丢失的假象。本文将针对为简化问题,本文假设所有团队成员均在同一分支上开发。文中

我们在日常使用Git的过程中经常会发生一些意外情况,如果处理不当,则可能会出现代码丢失的假象。本文将针对 IDEA & Git 日常开发中的一些场景,为你层层拨开迷雾,解析常见的错误及其发生原因,让你从此不再惧怕代码冲突或丢失问题。

为简化问题,本文假设所有团队成员均在同一分支上开发。

文中 更新操作 是指在 IDEA 中单击菜单 VCS - Update Project...

1. 常见工作流程

通常当你早上到公司打开电脑,首先执行更新操作(单击 IDEA 菜单 VCS - Update Project... ),然后开始愉快地编码。编码完成后通常要执行以下几个操作:

  • 更新操作
  • 创建本次提交
  • 推送远程分支

1.1 更新操作

为了保证Git拥有一个简洁的提交历史,在提交之前需要先执行更新操作,即在IDEA中依次单击菜单 VCS - Update Project... ,或者按下 Ctrl+T ,弹出如下窗口:

Git代码防丢指南 原 荐

窗口左侧选择更新类型(Update Type):

  • Merge :更新时执行合并操作。等价于执行 git fetch && git merge 或者 git pull --no-rebase
  • Rebase :更新时执行 rebase 操作。等价于执行 git fetch && git rebase 或者 git pull --rebase
  • Branch Default :在 .git/config 文件中指定不同分支的更新类型。

窗口右侧选择在更新前工作目录(Working Directory)的清理方式:

  • Using Stash :使用 git stash 储藏本地修改。
  • Using Shelve :使用IDEA内置的 Shelve 功能储藏本地修改。

通常选择 MergeUsing Stash 即可,单击 OK 后,IDEA执行步骤如下:

git stash
git fetch && git merge
git stash pop

有些同学可能更习惯先创建本地提交,然后在执行更新操作,这样会导致Git自动生成一个合并提交,导致提交历史不够简洁。

1.2 创建本次提交

更新完成后,在IDEA中单击菜单 VCS - Commit... 创建本次提交。

1.3 推送远程分支

然后单击 VCS - Git - Push... 推送至远程分支。

2. 常见问题分析

在上面的3步执行步骤中,第2步和第3步发生意外的风险最高,最常见的两种意外情况是冲突和文件占用,下面我们分别讨论。

2.1 合并远程分支冲突

如果在执行更新操作之前,你的本地分支已经创建过提交,并且尚未推送至远程分支,则在第2步执行 git merge 时很可能会发生冲突。

Git代码防丢指南 原 荐

此时关闭上面的冲突窗口, Version Control 工具窗口显示内容如下:

Git代码防丢指南 原 荐

窗口右下角原本显示分支名称的位置变成了 Merging master ,表示本地分支 master 目前处于正在合并状态。单击左侧红框内 Resolve 按钮可以再次调出处理冲突窗口。基于IDEA的图形界面手动解决冲突后,IDEA会自动将该文件加入暂存区(加入暂存区即表示冲突解决完成),最后执行一次提交便可以完成冲突处理。

2.2 恢复储藏冲突

在更新操作的第3步执行 git stash pop 恢复储藏时,储藏内容可能与刚更新的内容发生冲突。

Git代码防丢指南 原 荐

恢复储藏时发生的冲突跟上面的合并冲突稍微有些区别,首先是右下角的分支名称没有 Merging 字样,另外会在右下角额外弹出一个小窗提示恢复储藏失败,并且告诉你不用担心,所有的修改都在 stash 列表中,并没有丢失。查看 stash 列表的方式为单击菜单 VCS - Git - UnStash Changes... :

Git代码防丢指南 原 荐

选中列表最上面的条目,然后单击 Apply Stash ,之前的修改就会重新回到工作目录。

我们继续回到冲突问题,手动解决冲突后执行一次提交就可以了。如果在解决冲突过程中发生了误操作,可以右击 Default Changelist - Revert... 清空当前工作目录内容,重新执行一次 Apply Stash ,然后重复解决冲突过程。

Git代码防丢指南 原 荐

2.3 文件占用错误

在执行第2步 git merge 时,可能会因为文件被占用导致执行失败。例如项目可能引入了一些jar文件,这些jar文件在本地已经被JVM动态加载了,如果有其它人更新了该jar文件并且推送到了远程分支,当你更新时便会遇到上述问题。

Git代码防丢指南 原 荐

对于这种错误的解决方法很简单,首先解除文件的占用状态,例如终止本地JVM进程,然后再次点击 VCS - Update

在执行第3步 git stash pop 时,也会因为文件被占用导致执行失败。例如你更新了某个jar文件,当恢复储藏时可能因为该jar文件被占用导致恢复失败。

Git代码防丢指南 原 荐

对于这种错误,你需要首先解除文件占用状态,然后手动执行 unstash 操作。

3. 先提交还是先更新?是个问题!

3.1 先提交后更新导致的问题

3.1.1 发生冲突时难以处理

如果先提交,但是在更新时却发生了冲突,这就意味着你刚刚创建的提交其实是有问题的,通常是团队沟通或是分工出了问题,但是不管这么说,别人已经抢先一步 push 了,你的提交便会被拒之门外。即便是手动解决了冲突,这个提交保留在历史中也会成为隐患,如果有其他人 reset 回这个提交继续工作,则在合并其它分支内容时发生冲突的概率会大大增加,所以最好处理方式是先撤销这个提交( reset --soft HEAD~ ),然后更新并解决冲突,最后创建一个新的提交。

3.1.2 错误的处理冲突方式

在发生冲突后,有些同学可能会想到下面的处理方式:

stash

3.2 推荐先更新后提交

如果你事先知道会发生冲突,相信你一定不会选择先提交代码,但是冲突是不可避免的,这就要求我们平时养成良好的开发习惯。与其解决提交后的冲突,不如尽早地解决冲突然后提交,这样不仅可以减少一个无意义的自动合并提交,而且可以在冲突发生时简化处理过程。

3.3 养成良好习惯

为了尽量避免冲突发生,建议养成如下开发习惯:

  • 编码前先更新
  • 提交前先更新
  • 提交前检查是否有编译错误
  • 提交粒度尽可能小,描述尽可能准确
  • 修改了公共文件,尽早通知其他成员更新
  • 最后一条,也是最重要的,团队分工要明确

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Stylin' with CSS

Stylin' with CSS

Wyke-Smith, Charles / 2012-10 / $ 50.84

In this completely revised edition of his bestselling Stylin' with CSS, veteran designer and programmer Charles Wyke-Smith guides you through a comprehensive overview of designing Web pages with CSS, ......一起来看看 《Stylin' with CSS》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具