关闭

Git 2.7灵活的新特性

标签: BitBucketgit
7024人阅读 评论(0) 收藏 举报

在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解决方案已服务于包括华为、中国移动通信研究院、嘀嘀打车、广联达、招商银行、南粤银行等在内的数百家行业企业及互联网企业。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:566998次
    • 积分:3204
    • 等级:
    • 排名:第10658名
    • 原创:21篇
    • 转载:35篇
    • 译文:9篇
    • 评论:55条
    最新评论