Git 2.7灵活的新特性

翻译 2016年06月01日 16:02:57

在2.6之后两个月发布的Git 2.7拥有更多的功能改进和性能提升。以下是我们在Bitbucket团队发现的一些有趣的新素材。如果您还没有体验,欢迎点击下载试用http://mall.csdn.net/product/733 

 

丰富git worktree

 

Git 2.5引入的极好的git worktree命令,让您可以在不同的目录中同时检查并处理多个存储库分支。比如,如果您需要做一个快的热修复补丁,并且不想干扰到您的工作副本,您可以在一个新目录中检查一个新的分支:

$ git worktree add -b hotfix/BB-1234 ../hotfix/BB-1234
Preparing ../hotfix/BB-1234 (identifier BB-1234)
HEAD is now at 886e0ba Merged in bedwards/BB-13430-api-merge-pr (pull request #7822)

Git 2.7增加了 git worktree list子命令来显示您存储库的工作树(以及它们相关的分支):

$ git worktree list
/Users/kannonboy/src/bitbucket/bitbucket            37732bd [master]
/Users/kannonboy/src/bitbucket/staging              d5924bc [staging]
/Users/kannonboy/src/bitbucket/hotfix/BB-1234       37732bd [hotfix/BB-1234]


git bisect命令对工作树的支持也得到改进。bisect用来追踪“好”和“坏”的代码提交的参考已经从.git/refs/bisect移动至.git/refs/worktrees/$worktree_name/refs/bisect,因此您可以跨多个工作树同时运行等分。

 

关于完整性,截止Git 2.7,您还可以在磁盘上复制一个工作树。这可创建一新的,独立的Git 存储库 (不是另一工作树)。

 

有趣的事实: Git 工作树不仅仅是为了分支!当本帖子研究新的Git功能性时,我通过在单独的工作树中签出并建立它们平行比较了Git v2.6.0和v2.7.0标记:

$ git worktree add ../git-v2.6.0 v2.6.0
Preparing ../git-v2.6.0 (identifier git-v2.6.0)
HEAD is now at be08dee Git 2.6

$ git worktree add ../git-v2.7.0 v2.7.0
Preparing ../git-v2.7.0 (identifier git-v2.7.0)
HEAD is now at 7548842 Git 2.7

$ git worktree list
/Users/kannonboy/src/git         7548842 [master]
/Users/kannonboy/src/git-v2.6.0  be08dee (detached HEAD)
/Users/kannonboy/src/git-v2.7.0  7548842 (detached HEAD)

$ cd ../git-v2.7.0 && make

几个git stash改进

 

如果您是一个git rebase爱好者,您会对--autostash选项非常熟悉。它可以在重建基础之前自动存放您工作拷贝的任何局部变化,并且在重建基础完成之后再次运用。

$ git rebase master --autostash
Created autostash: 54f212a
HEAD is now at 8303dca It's a kludge, but put the tuple from the database in the cache.
First, rewinding head to replay your work on top of it...
Applied autostash.


这样就能很方便的在脏的工作树上重建。同时还可以方便地配置rebase.autostash为全局的默认行为:

$ git config --global rebase.autostash true

rebase.autostash至Git 1.8.4后即可用,但是2.7引入了使用--no-autostash选项取消该标记的功能。我想这主要是为了完整性,因为使用它看上去仅给您一个脏工作树警告:

$ git rebase master --no-autostash
Cannot rebase: You have unstaged changes.
Please commit or stash them.


我的理解可能有错误,如果您有更好的使用案例请告诉我!


说到配置标记, Git 2.7还引入了stash.showPatch。git stash show默认动作是显示您暂存文件的摘要信息。

$ git stash show
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

添加 -p标记,gitstash show会进入“补丁模式”,这会显示完整的文件差异:

diff --git a/package.json b/package.json
index c876b26..e21eeb3 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
     "mkdirp": "^0.5.0",
     "byline": "^4.2.1",
     "express": "~3.3.4",
-    "git-guilt": "^0.1.0",
+    "git-guilt": "^0.1.1",
     "jsonfile": "^2.0.0",
     "jugglingdb-sqlite3": "0.0.5",
     "jugglingdb-postgres": "~0.1.0",

要让stash.showPatch成为默认操作。您可以使用以下启用它:

$ git config --global stash.showPatch true

如果您启用stash.showPatch,但另一方面您仅想查看文件摘要,您可以通过--stat 选项返回旧模式。

 

$ git stash show --stat
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)


顺便插一句: --no-patch 是一个有效的选择,但是不能取消stash.showPatch。


git filter-branch 提升了速度(和一个进度指示器)

 

git filter-branch是一个灵活的工具可以改写git历史。既然每一个提交对象都有一个父对象参考(并过渡到其所有祖先),改写一个别提交意味着改写其所有继承者对象。这意味着如果您想挑选一较早的提交,甚至于微不足道的历史改写操作都需要花一些时间。


Git 2.7 引入了一个漂亮的新进度指示器可以估计一个filter-branch命令完成需要多长时间:

 

作为额外奖励,filter-branch命令不改变索引或树,目前可以彻底跳过索引读取,导致性能大大提升。以上GIF中的commit-filter命令重写每个代码提交中的Git作者名,把我的名字("Tim Pettersen")改为我的推特名("Kannonboy"), 整个过程没有触碰过树。在Git2.7.0下改写Bitbucket服务器源代码的前1000个提交只需要约38s,而Git 2.6.0 约为64s:有大约40%的改善。引入改进性能的测试平均会节约时间约60%。

 

.gitignore中改进的否定

 

.gitignore文件让您排除那些不想进行源代码管理的文件。您可以通过使用否定符号(!)来“反忽略”个别文件。比如:

# .gitignore
*.json
!cat.json

将忽略除了cat.json之外的所有json文件。

 

但是,在Git 2.6中,您不能对已被忽略的目录中的文件运用否定。

# .gitignore
/animals
!/animals/cat.json # <-- this was still ignored (pre Git 2.7)

在Git 2.7上,以上第二个例子也起作用。现在您可以在被忽略的目录中使用否定符号来“反忽略”文件。

 

别急着走,好东西留在最后!


这仅仅是2.7中的Git优越性的个别例子而已。若想了解更多,请查阅 Junio C Hamano的发布说明或者您自己详读 Git 存储库记录:

$ git log v2.6.0..v2.7.0

原文地址:https://developer.atlassian.com/blog/2016/01/git-2.7-release/ 

CSDN开发服务为企业提供ALM(应用全生命周期管理)解决方案,致力于打造基于研发管理前沿、开放的工具产品集群(如Atlassian、Sonar、Jenkins等),结合CSDN CODE等研发工具的高效率、高质量和高可靠性企业级研发管理平台,为企业软件开发生命周期内各阶段、各部门、各角色提供全流程、全方位的跟踪和综合管理。截止目前,CSDN ALM解决方案已服务于包括华为、中国移动通信研究院、嘀嘀打车、广联达、招商银行、南粤银行等在内的数百家行业企业及互联网企业。


如何整合JIRA、FishEye、Crucible进行CodeReview

Atlassian的东西相信大家都不陌生,知道Confluence的有木有,用过JIRA的有木有,虽然说这些产品都要收费,不过对于学校和开源组织都可以申请免费License,也可以申请试用。 ...

jenkins基于ansible持续集成

开发团队在日常工作中,主要是围绕着需求、编码、代码提交、打 build、分配环境、安装 build、BVT(Build Verification Test)、发现 defect、修复并提交新代码,然后...
  • rui_w_
  • rui_w_
  • 2015年12月19日 17:56
  • 2766

用JIRA、CVS、XPlanner、WIKI来进行项目管理

用JIRA、CVS、XPlanner、WIKI来进行项目管理JIRA,一个非常出色的Issue跟踪系统,这里的Issue不单单是指BUG, 很多时候也可以是TASK, IMPROVEMENT, NEW...
  • xiedd
  • xiedd
  • 2006年07月19日 13:29
  • 1085

iOS9新特性_更灵活的后台定位

感谢:https://github.com/ChenYilong/iOS9AdaptationTips#1-demo1_ios9%E7%BD%91%E7%BB%9C%E9%80%82%E9%85%8D...
  • cactusz
  • cactusz
  • 2017年07月06日 16:41
  • 69

[git]创建分支(branch)以测试或添加新特性

本文包含两部分内容 1,创建新的分支(branch) 2,回到项目的某个历史版本(history version) git 创建项目分支(branch)可以很好的解决以下两个问题 1,...

Git 2.1有哪些新特性?

在git 2.0.0发布2个半月后,作为小版本更新迎来了2.1.0,带来了一大波令人兴奋的新特性。 完整的发布说明文档可以在这里查看,但如果你不怎么接触git社区,会觉得发布说明文档有些太简明了...

Python2.7 小巧灵活

  • 2014年09月17日 22:35
  • 15.05MB
  • 下载

java8新特性

  • 2017年11月08日 13:39
  • 48B
  • 下载

Python2.7注意点汇总(高级特性模块)

1. 切片(以list为例) list[start:end] 获取下标从start到end-1的元素 list[:end] 获取下标从0到end-1的元素 list[start:end:step] 获...
  • yab4534
  • yab4534
  • 2016年05月12日 16:48
  • 272

JDK5.0新特性与正则表达式

  • 2017年12月04日 20:31
  • 266KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Git 2.7灵活的新特性
举报原因:
原因补充:

(最多只允许输入30个字)