代码改变世界

你所需要知道的一些git 的使用命令:历史

2013-04-15 16:49 by Terry_龙, 阅读(4361) 阅读, 推荐(2) 推荐, 收藏, 编辑
== 关于历史 ==
 
Git分布式本性使得历史可以轻易编辑。但你若篡改过去,需要小心:只重写你独自拥有
的那部分。正如民族间会无休止的争论谁犯下了什么暴行一样,如果在另一个人的克隆
里,历史版本与你的不同,当你们的树互操作时,你会遇到一致性方面的问题。
 
一些开发人员强烈地感觉历史应该永远不变,不好的部分也不变所有都不变。另一些觉
得代码树在向外发布之前,应该整得漂漂亮亮的。Git同时支持两者的观点。像克隆,分
支和合并一样,重写历史只是Git给你的另一强大功能,至于如何明智地使用它,那是你
的事了。
 
=== 我认错 ===
 
刚提交,但你期望你输入的是一条不同的信息?那么键入:
 
 $ git commit --amend
 
来改变上一条信息。意识到你还忘记了加一个文件?运行git add来加,然后运行上面的
命令。
 
希望在上次提交里包括多一点的改动?那么就做这些改动并运行:
 
 $ git commit --amend -a
 
=== 更复杂情况 ===
 
假设前面的问题还要糟糕十倍。在漫长的时间里我们提交了一堆。但你不太喜欢他们的
组织方式,而且一些提交信息需要重写。那么键入:
 
 $ git rebase -i HEAD~10
 
并且后10个提交会出现在你喜爱的$EDITOR。一个例子:
 
    pick 5c6eb73 Added repo.or.cz link
    pick a311a64 Reordered analogies in "Work How You Want"
    pick 100834f Added push target to Makefile
 
之后:
 
- 通过删除行来移去提交。
- 通过为行重新排序行来重新排序提交。
- 替换 `pick` 使用:
   * `edit` 标记一个提交需要修订。
   * `reword` 改变日志信息。
   * `squash` 将一个提交与其和前一个合并。
   * `fixup` 将一个提交与其和前一个合并,并丢弃日志信息。
 
保存退出。如果你把一个提交标记为可编辑,那么运行
 
 $ git commit --amend
 
否则,运行:
 
 $ git rebase --continue
 
这样尽早提交,经常提交:你之后还可以用rebase来规整。
 
=== 本地变更之后 ===
 
你正在一个活跃的项目上工作。随着时间推移,你做了几个本地提交,然后你使用合并
与官方版本同步。在你准备好提交到中心分支之前,这个循环会重复几次。
 
但现在你本地Git克隆掺杂了你的改动和官方改动。你更期望在变更列表里,你所有的变
更能够连续。
 
这就是上面提到的 *git rebase* 所做的工作。在很多情况下你可以使用 *--onto* 标
记以避免交互。
 
另外参见 *git help rebase* 以获取这个让人惊奇的命令更详细的例子。你可以拆分提
交。你甚至可以重新组织一棵树的分支。
 
=== 重写历史 ===
 
偶尔,你需要做一些代码控制,好比从正式的照片中去除一些人一样,需要从历史记录
里面彻底的抹掉他们。例如,假设我们要发布一个项目,但由于一些原因,项目中的某
个文件不能公开。或许我把我的信用卡号记录在了一个文本文件里,而我又意外的把它
加入到了这个项目中。仅仅删除这个文件是不够的,因为从别的提交记录中还是可以访
问到这个文件。因此我们必须从所有的提交记录中彻底删除这个文件。
 
 $ git filter-branch --tree-filter 'rm top/secret/file' HEAD
 
参见 *git help filter-branch* ,那里讨论了这个例子并给出一个更快的方法。一般
地, *filter-branch* 允许你使用一个单一命令来大范围地更改历史。
 
此后,+.git/refs/original+目录描述操作之前的状态。检查命令filter-branch的确做
了你想要做的,然后删除此目录,如果你想运行多次filter-branch命令。
 
最后,用你修订过的版本替换你的项目克隆,如果你想之后和它们交互的话。
 
=== 制造历史 ===
 
[[makinghistory]]
想把一个项目迁移到Git吗?如果这个项目是在用比较有名气的系统,那可以使用一些其
他人已经写好的脚本,把整个项目历史记录导出来放到Git里。
 
否则,查一下 *git fast-import* ,这个命令会从一个特定格式的文本读入,从头来创
建Git历史记录。通常可以用这个命令很快写一个脚本运行一次,一次迁移整个项目。
 
作为一个例子,粘贴以下所列到临时文件,比如/tmp/history:
 
----------------------------------
commit refs/heads/master
committer Alice <alice@example.com> Thu, 01 Jan 1970 00:00:00 +0000
data <<EOT
Initial commit.
EOT
 
M 100644 inline hello.c
data <<EOT
#include <stdio.h>
 
int main() {
  printf("Hello, world!\n");
  return 0;
}
EOT
 
 
commit refs/heads/master
committer Bob <bob@example.com> Tue, 14 Mar 2000 01:59:26 -0800
data <<EOT
Replace printf() with write().
EOT
 
M 100644 inline hello.c
data <<EOT
#include <unistd.h>
 
int main() {
  write(1, "Hello, world!\n", 14);
  return 0;
}
EOT
 
----------------------------------
 
之后从这个临时文件创建一个Git仓库,键入:
 
 $ mkdir project; cd project; git init
 $ git fast-import --date-format=rfc2822 < /tmp/history
 
你可以从这个项目checkout出最新的版本,使用:
 
 $ git checkout master .
 
命令*git fast-export* 转换任意仓库到 *git fast-import* 格式,你可以研究其输
出来写导出程序, 也以可读格式传送仓库。的确,这些命令可以发送仓库文本文件
通过只接受文本的渠道。
 
 
=== 哪儿错了? ===
 
你刚刚发现程序里有一个功能出错了,而你十分确定几个月以前它运行的很正常。天啊!
这个臭虫是从哪里冒出来的?要是那时候能按照开发的内容进行过测试该多好啊。
 
现在说这个已经太晚了。然而,即使你过去经常提交变更,Git还是可以精确的找出问题所在:
 
 $ git bisect start
 $ git bisect bad HEAD
 $ git bisect good 1b6d
 
Git从历史记录中检出一个中间的状态。在这个状态上测试功能,如果还是有问题:
 
 $ git bisect bad
 
如果可以工作了,则把"bad"替换成"good"。Git会再次帮你找到一个以确定的好版本和
坏版本之间的状态,通过这种方式缩小范围。经过一系列的迭代,这种二分搜索会帮你
找到导致这个错误的那次提交。一旦完成了问题定位的调查,你可以返回到原始状态,
键入:
 
 $ git bisect reset
 
不需要手工测试每一次改动,执行如下命令可以自动的完成上面的搜索:
 
 $ git bisect run my_script
 
Git使用指定命令(通常是一个一次性的脚本)的返回值来决定一次改动是否是正确的:
命令退出时的代码0代表改动是正确的,125代表要跳过对这次改动的检查,1到127之间
的其他数值代表改动是错误的。返回负数将会中断整个bisect的检查。
 
你还能做更多的事情: 帮助文档解释了如何展示bisects, 检查或重放bisect的日志,并
可以通过排除对已知正确改动的检查,得到更好的搜索速度。
 
=== 谁让事情变糟了? ===
 
和其他许多版本控制系统一样,Git也有一个"blame"命令:
 
 $ git blame bug.c
 
这个命令可以标注出一个指定的文件里每一行内容的最后修改者,和最后修改时间。但
不像其他版本控制系统,Git的这个操作是在线下完成的,它只需要从本地磁盘读取信息。

android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法

2013-04-02 09:36 by Terry_龙, 阅读(6158) 阅读, 推荐(2) 推荐, 收藏, 编辑
摘要:使用setMovementMethod才能使TextView里面的元素自动拥有点击功能,支持ClickSpan。但是加上这个方法会造成ListView的每个项无的文本会占用ListView的ItemClick,解决这个办法需要重写一个setMovementMethod方法,详见代码如下:public class TextViewFixTouchConsume extends TextView {boolean dontConsumeNonUrlClicks = true;boolean linkHit;public TextViewFixTouchConsume(Context context 阅读全文

你所需要知道的一些git 的使用命令:Git大师

2013-03-19 15:31 by Terry_龙, 阅读(10575) 阅读, 推荐(2) 推荐, 收藏, 编辑
摘要:=== 源码发布 ===就我的项目而言,Git完全跟踪了我想打包并发布给用户的文件。创建一个源码包,我运行:$ git archive --format=tar --prefix=proj-1.2.3/ HEAD=== 提交变更 ===对特定项目而言,告诉Git你增加,删除和重命名了一些文件很麻烦。而键入如下命令会容易的多:$ git add .$ git add -uGit将查找当前目录的文件并自己算出具体的情况。除了用第二个add命令,如果你也打算这时提交,可以运行`git commit -a`。关于如何指定应被忽略的文件,参见 *githelp ignore* 。你也可以用一行命令完成以 阅读全文

你所需要知道的一些git 的使用命令:Git的缺点

2013-03-18 13:14 by Terry_龙, 阅读(3556) 阅读, 推荐(3) 推荐, 收藏, 编辑
摘要:=== SHA1 的弱点 ===随着时间的推移,密码学家发现越来越多的SHA1的弱点。已经发现对对资源雄厚的组织哈希冲撞是可能的。在几年内,或许甚至一个一般的PC也将有足够计算能力悄悄摧毁一个Git仓库。希望在进一步研究摧毁SHA1之前,Git能迁移到一个更好的哈希算法。=== 微软 Windows ===Git在微软Windows上可能有些繁琐:- http://cygwin.com/[Cygwin] ,, 一个Windows下的类Linux的环境,包含一个 http://cygwin.com/packages/git/[ 一个Git在Windows下的移植].- http://code.g 阅读全文

你所需要知道的一些git 的使用命令:克隆

2013-03-13 10:44 by Terry_龙, 阅读(13537) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:在较老一代的版本控制系统里,checkout是获取文件的标准操作。你将获得一组特定保存状态的文件。在Git和其他分布式版本控制系统里,克隆是标准的操作。通过创建整个仓库的克隆来获得文件。或者说,你实际上把整个中心服务器做了个镜像。凡是主仓库上能做的事,你都能做。=== 计算机间同步 ===我可以忍受制作tar包或利用rsync来作备份和基本同步。但我有时在我笔记本上编辑,其他时间在台式机上,而且这俩之间也许并不交互。在一个机器上初始化一个Git仓库并提交你的文件。然后转到另一台机器上:$ git clone other.computer:/path/to/files以创建这些文件和Git仓库的 阅读全文

android 简单的两步实现Play上的文本伸缩功能

2013-03-12 17:46 by Terry_龙, 阅读(3347) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:经常上google play下载软件,看到它的伸缩式的软件介绍很感兴趣。功能截图如下:点击文本会下拉更多详细介绍,实现这一功能很简单,废话不多说,直接上代码 private boolean isExpanded = false; private int lastHeight = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_expan... 阅读全文

你所需要知道的一些git 的使用命令:分支

2013-03-11 15:38 by Terry_龙, 阅读(5398) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:即时分支合并是Git最给力的杀手锏。*问题* :外部因素要求必须切换场景。在发布版本中突然蹦出个严重缺陷。某个特性完成的截至日期就要来临。在项目关键部分可以提供帮助的一个开发正打算离职。所有情况逼迫你停下所有手头工作,全力扑到到这个完全不同的任务上。打断思维的连续性会使你的生产力大大降低,并且切换上下文也更麻烦,更大的损失。使用中心版本控制我们必须从中心服务器下载一个新的工作拷贝。分布式系统的情况就好多了,因为我们能够在本地克隆所需要的版本。但是克隆仍然需要拷贝整个工作目录,还有直到给定点的整个历史记录。尽管Git使用文件共享和硬链接减少了花费,项目文件自身还是必须在新的工作目录里重建。*方案 阅读全文

你所需要知道的一些git 的使用命令:基本技巧

2013-03-08 14:34 by Terry_龙, 阅读(4022) 阅读, 推荐(4) 推荐, 收藏, 编辑
摘要:与其一头扎进Git命令的海洋中,不如来点基本的例子试试手。它们简单而且实用。实际上,在开始使用Git的头几个月,我所用的从来没超出本章介绍的内容。=== 保存状态 ===要不来点猛的?在做之前,先为当前目录所有文件做个快照,使用:$ git init$ git add .$ git commit -m "My first backup"现在如果你的编辑乱了套,恢复之前的版本:$ git reset --hard再次保存状态:$ git commit -a -m "Another backup"=== 添加、删除、重命名 ===以上命令将只跟踪你第一次运行 阅读全文

cocos2d-x for android:士兵听我的命令移动

2012-11-11 20:49 by Terry_龙, 阅读(8505) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:上一篇文章讲述了利用cocos2d-x构建精灵的动画效果,今天打算以此为引子,创建一个在移动时同时指挥角色到我手指触摸的移动地点,那么就开始吧。开始本篇要点 角色(Sprite)缓存 动画(Animation)缓存 触摸(Touch)精灵到我指定的移动地点 动作(Action)移动和切换涉及到的要学的学习点: 角色移动点击由此进入-->cocos2d-x for android:SimpleGame分析 播放动画点击由此进入-->cocos2d-x for android:CCSprite 精灵动画­角色缓存角色缓存使用CCSprite... 阅读全文

cocos2d-x for android:CCSprite 精灵动画

2012-11-07 21:55 by Terry_龙, 阅读(16977) 阅读, 推荐(2) 推荐, 收藏, 编辑
摘要:记得以前学习XNA游戏开发的时候,操作精灵角色的攻击或者行走动作都是给出特定的几张序列图或者一张长序列图然后通过切割来作一帧一帧的切片动画播放。开始关于精灵sprite我从网上摘录了一段话如下说白一点,精灵就是将图形资源加载到内存中,并根据游戏需要将其显示到屏幕中的工具,游戏中大到背景、UI,小到NPC、道具,只要是用图片展示的,都是精灵或它的子类。从技术上讲,精灵是一个可以不断变化的图片,这些变化包括:位置移动、旋转、缩放、换帧(就是像动画片一样播放几张连续的图片,每帧换一张,形成一个动画效果)在cocos2d-x 中精灵的关系如下图该图来源于:http://www.xuanyusong.c 阅读全文

cocos2d-x for android:SimpleGame分析

2012-10-30 13:18 by Terry_龙, 阅读(8945) 阅读, 推荐(5) 推荐, 收藏, 编辑
摘要:作为cocos2d-x的标配DEMO,SimpleGame可算是给入门学cocos2d-x的俺们这些新手门学习的对象了,那么来分析分析,把几个关键的代码记录下来。设置游戏读取资源的目录CCFileUtils::sharedFileUtils()->setResourceDirectory("sd");默认路径是Resource目录设置游戏的分辨率大小CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480, 320, kResolutionNoBorder);也可以不设置,自动去获取创建精灵CCSpri 阅读全文

cocos2d-x for android:HelloWorld 解读

2012-10-28 09:01 by Terry_龙, 阅读(10552) 阅读, 推荐(5) 推荐, 收藏, 编辑
摘要:上一篇文章说到,执行create-android-project.sh脚本会生成一个android 项目。该android 项目会有三个目录分别为cocos2d-x 生成的项目列表proj.android:上文说过,是android 运行的项目工程Classes:是上面android 工程运行时的NDK库,所有可以跨平台的以C++编写的代码都放在该目录,然后以NDK的方式编译成SO动态库,供android 项目调用,原生编译出来的工程有四个文件Resources:是存放so动态库需要的资源文件比如图片、音频等cocos2d-x的makefile文件要清楚的知道它是如何把Classes文件编译成 阅读全文

cocos2d-x for android:ubuntu 环境搭建

2012-10-27 15:02 by Terry_龙, 阅读(12594) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:自从体验了vim 的强大之后,好像一开发程序都不自觉的离不开这货了,也倾向在ubuntu 下开发应用。周末闲来无事,看了一下cocos2d,盘算着我也进军游戏界得了。于是乎,装之。cocos2d-x 引擎下载点击跳转下载 或 git://github.com/cocos2d/cocos2d-x.git下载完成后,解压,得到如下的目录安装第一步打开create-android-project.sh脚本,将NDK_ROOT_LOCAL 和ANDROID_SDK_ROOT_LOCAL改成你系统对应的NDK目录和SDK目录,如下图改完后保存。执行create-android-project.sh 脚本 阅读全文

android 电视盒下XBMC源码功能的简单分析

2012-10-08 15:43 by Terry_龙, 阅读(11385) 阅读, 推荐(3) 推荐, 收藏, 编辑
摘要:XBMC是一个优秀的自由和开源的(GPL)媒体中心软件。XBMC最初为Xbox而开发,现在可以运行在Linux、OSX、Windows系统。 2003年,一些兴趣相投的程序员创建了这个项目。XBMC是一个非盈利的项目,由遍布世界各地的自愿者开发维护。超过50名软件开发人员为XBMC作出贡献,还有超过100名翻译人员努力扩大它的应用范围,使它支持超过30种语言。 由于XBMC一开始设计就是倾向于遥控输入,自身的框架极其强大,容易扩展,用在电视盒上面刚好可以补充小公司在内容不足时的替代品。值得庆幸的是,XBMC的android 源码也开源了,android 电视盒的开发者可以学习或者拿过来改造了. 阅读全文

关于Ubuntu 下新开发板adb 无法识别的问题

2012-08-14 10:12 by Terry_龙, 阅读(3734) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:一般开发公司都开发员都有同时处理不同开发板,因为项目迭代需要。但是不同的开发板的USB并不同,导致adb无法识别。下面给出解决方法。步骤一:打开终端,输入lsusb上面的2207:0006就是我们新的开发板的USB的ID,不知道如何识别的同学 ,可以通过反复的插拔查找哪个是变化值。我们需要复制:前缀的2207,新增到配置文件里面。步骤二:修改51-android.ruls 配置文件在终端上输入:sudo vim /etc/udev/rules.d/51-android.rules,可以看到下面的数据将这两行数据,复制拷备,重新换一行。然后修改SYSFS{idVendor}这个值的数据,将其改成 阅读全文

关于下载xbmc后打开Android 源码时的一个思考问题?兼各平台安装xbmc 的中文显示

2012-07-27 15:13 by Terry_龙, 阅读(5557) 阅读, 推荐(1) 推荐, 收藏, 编辑
摘要:XBMC是一个优秀的自由和开源的(GPL)媒体中心软件。XBMC最初为Xbox而开发,现在可以运行在Linux、OSX、Windows、android、IOS系统。 2003年,一些兴趣相投的程序员创建了这个项目。XBMC是一个非盈利的项目,由遍布世界各地的自愿者开发维护。超过50名软件开发人员为XBMC作出贡献,还有超过100名翻译人员努力扩大它的应用范围,使它支持超过30种语言(当然也包括咱们的中文)。 作为一个标准的媒体中心软件,XBMC表现良好,因为它的开发目标就是要成为你的HTPC的最佳伴侣。支持几乎所有摇控器,整合了华丽且功能强劲的皮肤引擎,XBMC自然成为你客厅家庭影院系统的理. 阅读全文

Android 关于图片文件夹后缀错误,使应用在源码下编译通过却无法运行的错误

2012-07-18 16:31 by Terry_龙, 阅读(5632) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:问题描述:同事在处理一个应用,之前一直在Eclipse 下编译,并运行到开发板上调试,一切正常,相安无事。后来需要在源码下编编译使一些动态库取得系统权限,源码下编译也是很顺利的,但一跑到开发板上就出错无法运行,直接force stop.相关出错的Logcat :E/AndroidRuntime(1969):FATALEXCEPTION:mainE/AndroidRuntime(1969):java.lang.RuntimeException:UnabletostartactivityComponentInfo{com.android.xuzhitech.xfree/com.android.xu 阅读全文

Android 解决不同进程发送KeyEvent 的问题

2012-06-07 10:14 by Terry_龙, 阅读(27626) 阅读, 推荐(3) 推荐, 收藏, 编辑
摘要:最近在做有关于Remote Controller 的功能,该功能把手机做成TV的遥控器来处理。在手机的客户端发送消息到TV的android 服务端,服务端接收到客户端的请求消息,模拟KeyEvent命令,发送Key值。最简单的发送命令为如下代码:publicstaticvoidsimulateKeystroke(finalintKeyCode){newThread(newRunnable(){publicvoidrun(){//TODOAuto-generatedmethodstubtry{Instrumentationinst=newInstrumentation();inst.sendKe 阅读全文

Android 框架层为IMountService 增加新接口

2012-04-20 10:10 by Terry_龙, 阅读(10794) 阅读, 推荐(6) 推荐, 收藏, 编辑
摘要:在为Android 增加多分区的支持时,可能会需要获得当前 USB 连接的挂载口,可能标准的Android 框架并未提供这样的接口给开发者,这时就需要我们自己为它提供接口了。先来看一下上层(应用)如何得到一个IMountService 的。privatesynchronizedIMountServicegetMountService(){if(mMountService==null){IBinderservice=ServiceManager.getService("mount");if(service!=null){mMountService=IMountService. 阅读全文

Android SDCard Mount 流程分析(二)

2012-04-12 10:09 by Terry_龙, 阅读(15119) 阅读, 推荐(3) 推荐, 收藏, 编辑
摘要:上一篇关于Mount的分析,分析了main的作用和一些挂载系统的分析。下面深入分析Mount的流程走法。Mount流程分为两个部分 主动挂载(插入SDCARD或者USB硬盘时系统自动挂载) 手动挂载(卸载SDCARD或者USB硬盘后,再点击加载设备的手动挂载)不同挂载走的流程并不相同,比如手动挂载是由上层发命令给vold 执行挂动作,而主动挂载是由kernel 分命令给vold 再由vold 发挂载消息给上层,上层得到挂载消息和状态后再发命令给vold 执行挂载。主动挂载较之复杂些。不过虽然流程不一样,但最终还是要调用Volume的挂载函数,下面将详细介绍两者的行走的流程。由于... 阅读全文
点击右上角即可分享
微信分享提示