提升git的10个技巧

最近,我们发表了关于Git基础知识和在团队中使用Git的教程。我们之前讨论的那些命令,已经足够让帮助一个开发者在Git世界里生存了。本篇文章,我们将尝试探索如何更有效的管理您的时间以及如何充分使用Git提供的各种功能。

注意:本文中,一些命令包含含有方括号的部分(e.g.git add -p [file_name]).在这些例子中,您要在该处插入所需的数字,标示符等。而不需要保留方括号。

1.Git自动补全

如果你在命令行中使用Git命令,每次手动输入命令是一件非常烦人的。为了解决这个问题,你可以很方便的开启自动补全功能。

在Unix系统下,运行以下指令来获取脚本:

1
2
cd ~
curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

然后,在您的~/.bash_profile文件中添加以下代码:

1
2
3
if [ -f ~/.git-completion.bash ]; then
. ~/.git-completion.bash
fi

尽管我之前就提到过,在这里我仍要不厌其烦的说:如果你想使用Git提供的全部功能,你肯定是需要转而使用命令行来操作的。

2.在Git中忽略文件

你是否对出现在你Git仓库中的已编译文件(比如.pyc)感到厌烦?

亦或是你已经对把它们加入Git中这件事感到忍无可忍了?

眼下就有一个可以让Git忽略特定文件或是目录的方法。只需要简单的创建一个.gitignore文件,然后列出你不想让Git跟踪的文件和目录即可。你可以使用感叹号(!)来指出例外的情况。

1
2
3
4
5
*.pyc
*.exe
my_db_config/

!main.pyc

3.谁动了我的代码?

出了问题后去责怪别人,是人类的天性。如果你的成品服务器出了问题,你可以非常轻松的把坏人揪出来——只需要使用git blame命令。

这个命令会显示文件中每一行的作者,最后一次改动后进行的提交(commit)以及该次提交的时间戳。。

1
git blame [file_name]

下图中,你可以看到在一个大型仓库中使用该命令是什么样子的。

4.回顾仓库历史

在之前的教程中,我们了解了git log命令的用法,然而,它还有三个选项,你应该了解。

  • –oneline——把每次提交间显示的信息压缩成缩减的hash值和提交信息,在一行显示。
  • –graph——该选项会在输出界面的左手边用一种基于文本的图形表示法来显示历史。如果你只是浏览一个单独分支的历史,那么这个功能是没有用的。
  • –all——显示全部分支的历史
    这里是以上命令综合使用的效果。

5.绝不丢失一个提交信息

比方说,你提交了一个你不想要提交的代码,最后你通过使用硬重置(hard reset)使其回到了之前的状态。稍后,你意识到,在这个过程中你丢失了一些其他的信息,并想要退回或是至少能看一眼。git reflog命令可以帮你做到这一点。

一个简单的git log命令,显示你最近的提交信息,以及上一次,再上一次的提交信息,以此类推。

而git reflog显示的是所有head移动的信息。记住,它是在本地的,而不是你仓库的一部分,不会包含在推送(push)和合并中(merge)。

如果我使用git log,我得到的提交信息是我的仓库的一部分。

然而git reflog显示了一个提交信息(b1b0ee9 – HEAD@{4}),这是我使用硬重置(hard reset)时丢失的那个。

6.暂存一个文件的部分改动

通常来讲,创建一个基于特性的提交是一个良好的做法,就是说,每次提交都必须代表一个新特性的产生或者是一个bug的修复。考虑一下,如果你修复了两个bug,或是添加了多个新特性但是却没有提交这些变化会怎样呢?在这种情况下,你可以把这些变化放在一次提交中。但是还有一个更好的方法:把文件分别暂存(Stage)然后分别提交。

比如说,你对一个文件进行了多次修改并且想把他们分别提交。这种情况下,你可以在添加命令(add)中加上-p选项

1
git add -p [file_name]

让我们演示一下。我在file_name文件中添加了3行文字,而且我只想提交第一行和第三行。我们先看一下git diff显示的结果。

然后,我们看一下,在添加命令(add)中加上-p选项后会发生什么。

看上去,Git假定所有的改变都是针对同一件事情的,因此它把这些都放在了一个块里。你有如下几个选项:

  • 输入y来缓存该块
  • 输入n不缓存该块
  • 输入e来人工编辑该块
  • 输入d来退出或进入下一个文件
  • 输入s来分割这个块
    对我们而言,我们肯定希望把它分成几个部分,有选择的添加一部分而忽略其他的。

正如你所看到的,我们添加了第一行和第三行而忽略了第二行。你可以在之后查看仓库状态并进行提交。

7.合并多次提交

当你提交你的代码进行审核并创建一个pull request时(在开源项目中常常发生这样的情况),你经常会在代码被采纳前,要求修改一些代码。你进行了一些修改,而在下一次审核中,又会被要求进行另外的修改。你不知道还有多少次修改等着你,在你知道以前,你进行了多次额外的提交。理想的状态是,你可以使用rebase命令,把他们都合并成一次提交。

1
git rebase -i HEAD~[number_of_commits]

如果你希望合并最后两次提交,您需要以下命令

1
git rebase -i HEAD~2

使用该命令,你会进入一个交互式的界面,显示了最后两次提交,并且询问你要压缩哪些。理想状态是你pick最近的一次提交并把它和之前的提交squash。

接下来你会被要求为合并后的这次提交填写描述信息。这一个过程实际上重写了你的提交历史。

8.保存尚未提交的改动

比方说你正在解决一个bug或是添加某个新功能,这时你突然被要求展示你的工作。你当前的工作还没有完成到进行提交的地步,而且你在这个阶段也没办法展示你的工作(如果不回退所有变化的话)。在这种情况下,git stash可以拯救你。stash命令本质上是保存了你全部的改动以供将来使用。保存你的改动,你只需要运行如下命令:

1
git stash

查看暂存列表,你可以运行如下命令:

1
git stash list

如果你不想保存了或是想要恢复这些改动,你使用如下命令:

1
git stash apply

在最后一张截图中,你可以看到,每一次保存都有一个标示符,一个独一无二的数字(尽管我们此处只有一次保存),万一你只想使用某些保存,你需要在apply命令后指明标示符。

1
git stash apply stash@{2}

##9.检查丢失的提交
尽管reflog是一种查看丢失提交的方法,但是它在大型仓库中行不通。这时就该fsck

(file system check)出场了。

1
git fsck --lost-found

这里你可以看到丢失的提交,你可以使用git show [commit_hash]来查看这些提交所包含的改动或者是使用git merge [commit_hash]来恢复它。

git fsck比reglog有一个优势。比如你删除了一个远端分支并且克隆了仓库,使用fsck命令你可以搜索并恢复该远端分支。

10.cherry-pick命令

我把最优雅的Git命令留在了最后。cherry-pick是我最爱的Git命令,因为它的名字就意味着它的功能!

简而言之,cherry-pick是指从不同的分支里选择某次提交并且把它合并到当前的分支来。如果你在并行的开发某两个或多个分支,你可能会注意到有一个bug存在于所有的分支中。如果你在一个分支中解决了它,你可以使用cherry-pick来把这次提交合并进其他的分支而不会搞乱其他的文件或是提交。

让我们想象一个可以使用该命令的场景。我有两个分支,并且我想要把b20fd14: Cleaned junk这次提交使用cherry-pick的方法放入到另一个分支。

我切换到我想要放入该提交的分支,然后运行如下命令:

1
git cherry-pick [commit_hash]

尽管我们本次使用cherry-pick没什么问题,但是你应该清楚这个命令会带来冲突,请谨慎使用。

小结

说着说着我们就来到了文章的末尾,我认为这些技巧会让你的Git水平更上一层楼。

Git是最棒的,只要你能想得到,它就能做得到。

因此,要经常挑战自己的Git水平。最后你很有可能会学到新的东西。

一个程序员的告白:多年后,我才学会承认自己的无知

你知道吗?你那些年收入 15 万美金的程序员朋友们,并不是一天到晚都在写程序。

懂得愈多,就会理解其实自己知道的事物宛如沧海一粟。懂得愈少,就会产生自己什麽都知道的错觉。
-David T. Freeman

几乎每一天,我都会发现某些我从来未知的事物。

今天,我就会坦白,我压根不知道什麽 rails plugins,面对 Rails,我根本像个三岁婴儿。

每个人都是从一无所知开始的。

如果插根电线,就能自动灌输某种科目的知识到我们的脑子裡,那真的是再好也不过了。但是现实当然并非如此,我们需要付出心血、勤勉努力才能牢牢掌握知识,而这,永远始于全然无知。

所以,习惯这件事吧,别想当天生全知的上帝。

最初我靠接桉维生,习惯「无知」让我无所适从。我的骄傲嚥不下无知的感受,我的自尊筑起防御牆,打了一场场看似胜利的仗,我服膺「装久了就是你的(fake it ’til you make it)」这句名言,即使不懂, 还是硬要装懂。

但是有一天,假装累了,我与无知的感受妥协了。从此之后,如果有人问了什麽我不懂的问题,我会努力压抑自尊,马上承认「我不懂」,通常接着我会说「但是我很确定我可以试着解决」。

对自己诚实

对于自己「其实懂得不多」的事实,我採取了新的态度。其后,我快速而且敏锐地感知到自己学习的速度正在疾速前进。

我不再盲目追赶那些我本来应该要知道的知识,现在我意识到,我愈常说「我不是很清楚,但我会想办法搞懂它」,我就愈能真正弄明白本来不知道的事物。

这远比你预期得收穫还要多。

结束语

首先,承认并且意识自己并不是什麽都知道,拥抱它们,就像掌握机会一般,而不是错误。

从简单有趣的事情开始做起,将它培养成一种嗜好,别想太多,别做不切实际的计划,学着喜爱并且享受过程。

设定专桉目标时不要好高骛远,但是也请保持得以鞭策自己的难度。

这个专桉也许简单如在 HTML 页面中打出静态的「Hello World」,也可能複杂到为自己的多重执行实体网站应用建立一个负载测试与基准系统。

工作博客

今天给部门添加了一个部门博客,决心要改变要从自己开始。要做技术,这样的事情还是得自己来。

博客地址

种下一棵种子,用心呵护,盼望秋天有所收获

雨天

早上忽然下起了大雨,像是诉说着某些不经意的悲伤。

弟弟回去了,期望他的回归。

Rss阅读器思考记录

想熟悉nodejs完成一个项目,但是对于MVC了解实在太少,于是想到做一个Rss阅读器。

自己想的实现原理是,将远程的Rss文章拉到本地缓存一份,定期更新本地的数据文件,本地查看之前的Rss文档。

第一个想到的就是experss,nodejs写的本地服务器,作为本地阅读的server。

找到一些Rss源,存成数据文件,提供使用。

关于自己的思考

#关于自己的思考

早晨醒来,嗓子还是没有好转,这里空气不好,弟弟也要走了,心里有点失落,马上准备要搬家,应该早点收拾好心情,准备新的旅程。

最近思考了很多,和弟弟也聊了挺多,弟弟选择了一件事,就义无反顾的去做了,起初我不理解,可是我现在也越来越明白,这样的决定也许还是早点做的好,应该选择一样自己的事业,为了生活也是为了自我实现。虽然大公司呆着也不错,但是不应该是一种常态,不得不承认的现实是,我并不比别人聪明多少,继续走下去,或许危机就在未来某天,自己被淘汰。

要做自己想要成为的人,而不盲目接受别人给自己安排好的路。

做自己最想要成为的人,坚持做自己最喜欢的事情,把兴趣变成生活工作,不用太在意周围人的眼光,相信真理掌握在少数人手里,该去拼搏的时候,一定要放手一搏,不要固步自封,应该把思想和眼界放的更开阔,更远大一些。

google公司的员工都认为自己最聪明,或与现实脱节。–来自某新闻

要做聪明的人,但是应该低调,把聪明变成现实生活的一部分,不要盲目自大,自作聪明的结果,大家可以想见,和现实脱节,最终只能是自我毁灭。

天下古今之庸人,皆以一惰字致败;天下古今之才人,皆以一傲字致败。-曾国藩

不要懒惰不去学习,变成庸庸碌碌的一员,不应骄傲,踏实实干才能成功,要收起自己的骄傲的心态。

手机上传图片问题小结

早上碰到一个手机上打不开上传控件的问题,具体表现为,android无法打开文件上传控件而ios正常,之前的上传方案是:

1
2
3
<form style="display:none">
<input type="file" id="upload">
</form>

通过点击页面上的Element#elem,trigger#upload的click事件来调起控件

1
2
3
$("#elem").click(function(){
$("#upload").trigger("click");
})

推测可能原因有两个,1) trigger方法在android上不生效,2) android不支持file控件.

模拟环境查原因

构造静态页

1
2
3
<form>
<input type="file" id="upload">
</form>

使用问题android打开,在原生的android浏览器中,可以打开文件控件,否定第二个原因.
增加js,添加jquery,绑定事件

1
2
3
$("#elem").click(function(){
$("#upload").trigger("click");
})

也可以调起文件控件,不解,再次操控原始html,设置form的display:none, 无法调起控件,至此大致明白了因果。
android手机浏览器应该是在display:none的element上做了不同于PC的特殊渲染处理,导致file无法被获取,固无法调起file控件.

解决方案

将form设置不可见,但是不能设置display:none

1
2
3
<form style="visibility:hidden;width:0;height:0;overflow:hidden">
<input type="file" id="upload">
</form>

上传demo,手机打开页面,ok,问题解决了.

总结

手机浏览器和PC浏览器还是有较多差异,需要耐心测试才能找到问题的根本原因.

思考

每天都在喧闹的都市,穿梭来回,看到的每个人,要么着急赶路,要么死死盯着手机,却很少停下来思考。

  • 对于前途的思考,应该从更高的角度去看,跨端或着跨行业,心里很想把游戏这条路走下去,用cocos2d写一个游戏出来。
  • 把身体和精神都调整到最佳的状态.
  • 或者干脆应该去学习c, c++,将游戏进行到底,应该早点做出抉择.

前端工具

FeHelper

百度高工写的前端工具FeHelper,包含如下功能:

代码美化

包括Javascript代码美化、CSS代码美化、HTML代码美化;其实所有C系的代码,都可以通过Javascript代码美化工具进行格式化查看

JSON接口自动格式化查看

当你访问的接口(打开的页面)返回的是一个JSON格式的数据,FeHelper会自动将内容进行格式化处理,便于您的查看

JSON查看器

把你的JSON代码粘贴到JSON查看器的输入框中,点击“格式化”,在下方便会以非常友好的方式列出JSON数据,便于查看

字符串编解码

包括Unicode编码和解码、UTF-8字符串编码和解码、Base64字符串编解码、字符串MD5编码,前端非常实用的工具

二维码生成器

能对网址、普通文本内容、电话号码、通讯录、短信等编码并生成二维码,很实用的二维码生成工具

Tracker(Javascript嗅探器)

协助您了解目标网页中 JavaScript 的运行情况,包括:执行覆盖率、执行行数、是否存在执行或语法错误等信息Tracker官网

时间(戳)转换工具

支持任意时间到对应时间戳的转换;支持任意时间戳到对应日期的转换

正则表达式工具

提供一个正则表达式的及时测试工具,并能将匹配结果进行高亮显示、高亮定位等;同时还罗列了一些常用的正则表达式供开发者使用

编码规范检测

对当前网页进行Javascript、CSS、HTML编码规范的检测,包括文件是否压缩、标签是否正确闭合、cookie管理等等

页面性能检测

对当前页面的性能进行检测,如HTTP响应时间、页面渲染时间、是否启用gzip压缩等等

栅格规范检测

如果您的页面是基于栅格系统而开发的(如960gs),这个简单的工具能很好的帮助您分析栅格对齐是否规范