Git命令:
1、
* 精简输出:git status -s
* 精简输出提交ID: git log --oneline
* 带说明的提交: git commit -m ""
* 撤销工作区尚未提交的更改:git checkout
* git diff 工作区与暂存区之间的改动, git diff --cached 暂存区和当前工作分支的比较, git diff head 工作区和当前工作分支 git
* 清除当前工作区中没有加入版本库的文件和目录(非跟踪文件和目录) git clean -fd
* 显示暂存区的目录树:git ls-files -s
* 使用git ls-tree -l HEAD命令查看HEAD中的目录树:返回结果如下:100644 blob 17367963649d34750ef1944f1bf3716ccdef01b5 10newTestFile.txt ; 五列分别表示文件属性,文件类型(blob对象),文件ID,文件大小,文件名。
* 使用git cat-file -t id查看指定ID的对象类型,使用git cat-file -p id查看指定ID的对象内容。
* 使用git stash命令来讲工作区和暂存区的改动全部封存起来,使用git stash list来恢复已经暂存的进度.
* 重置到上一次提交:git reset head^; 重置到指定提交:git reset commitID;
* 列出master提交的历史记录:git reflog master,根据记录值来重置到指定提交。
——————————————————————————————————————————————————
Git知识点:
1、
* HEAD(当前版本库的头指针),master(当前工作分支),文件.git/index实际上就是一个包含文件索引的目录树,记录了文件名和文件的状态信息(如:时间戳和文件长度等),文件的内容并没有存储在其中,而是存储在Git对象库.git/objects目录中,文件索引建立了文件核对系那个苦中对象是实体间的对应。
* 当对工作区修改的文件执行 git add 命令时,暂存区的目录树将被更新,同时工作区的修改的文件内容会被写入到对象库的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
* 当执行提交操作git commit是,暂存区的目录树会写到对象库中,并且master分支会做出相应的更新,即master最新指向的目录是就是提交奥是原暂存区的目录树。
* 当执行git reset HEAD命令时,暂存区的目录树会被重写,会被master分支指向的目录树所替换,但是工作区不受影响。
* 当执行git rm --cached命令时,会直接从暂存区删除文件,工作区则不回做出改变
* 当执行git checkout命令时,会用暂存区的文件来替换工作区的文件,即这个操作会清除工作区仲未添加到暂存区的改动。
* 当执行git checkout HEAD命令时,会用HEAD指向的master分支中的文件替换暂存区和工作区的文件,即清除所有未提交的改动。
2、
master作为分支名称,指向一个最新提交的ID,通过这个ID就可以将对象库和目录树联系起来,这样就可以查到该分支上每一次的提交历史记录。通过cat .git/HEAD命令可以发现HEAD其实就是对master文件的引用,而master文件指的正是当前分支的最新提交的ID.
最近成功申请了公司型IDP,过程中很意外居然没有传真营业执照,也没有给华厦邓白氏交800RMB,只传真了Purchase Form就搞掂了,在此分享一下。
首先说说我理解的公司型与个人IDP的区别:
其实第一点不重要,但第二点则很重要,产品发布者显示是一个人而不是一个公司,显得相当不专业。其实这个名字会显示在较不显眼的地方,一般人不会太注意,但对一个公司产品来说,这仍然是不太能接受的,因此还是要申请一个公司IDP。
基本的公司IDP申请流程网上都已经有很多,比如我参考的这个:
http://www.cnblogs.com/scottwong/archive/2010/12/05/1896770.html
因此细节就不说了。这里只说关键步骤。
第一个关键是申请邓白氏编码。不知从何时起,苹果公司IDP申请需要邓白氏编码了。网上有人说要给中国的华厦邓白氏交800RMB才能获取,其实现在是可以不需要了。参考这个帖子可以免费获取:http://www.cocoachina.com/bbs/read.php?tid=113741
申请邓白氏编码需要注意几点:
收到邓白氏编码后据说要过两星期才能同步到苹果服务器生效,但我只过了四天就去试着申请(反正说每周可以试3次),并且成功提交了。也许是运气好刚好这几天他们同步了DUNS编码吧。
提交IDP申请后等待苹果的身份校验。第二天中国苹果的客服打电话给我,应该就是确认了一下我的存在,然后告诉我申请已经通过,可以支付了。
支付要注意的:
- 把Puchase form的PDF文件打开,放大到250%(100%的话分辨率太低,打印出来会有锯齿)
- 屏幕截图,把Purchase form的内容全截到画笔里保存为一张图片(屏幕不够大怎么办?分块截,多截几次,拼在一起)
- 打开WORD,插入这张图片,调整大小到适合一页纸
- 在需要填写内容的地方,插入文本框,设置文本框为透明、无边框(搞一个然后拷贝多份),然后填写你的信息
- 再找个小勾的图片,插入到要勾选的地方(就是$99和VISA那里)
- 打印,签名,扫描,传之
在这过程中,我没有主动联系苹果,也没有主动联系邓白氏,没有给邓白氏付钱,苹果也没有要求我提供公司营业执照(本来都已经准备好了),前后总共用了15天,中间还干等了5天,应该说还是比较快的。
android 布局中经常会用到 <merge></merge> 标签,来优化 ui 布局。
具体如何优化,可以借助 android sdk 提供的 tools/hierarchyviewer 工具。
这个工具,并不是万能的,你需要自己去根据实际情况分析和优化自己的布局。
该工具的使用可以查阅资料,这里不赘述。
关于 <merge></merge> 使用,推荐一篇文章,简单明了
http://www.bangchui.org/simple/?t17479.html
其实这里面还有其他标签的介绍如 include、viewstub 等。
另外,http://developer.android.com/training/improving-layouts/reusing-layouts.html
也介绍了 merge 以及merge 的好处(可以用来优化布局)。
这里总结一下 merge 注意事项
1. merge 只可以是一个布局文件中的根节点,不可以有父节点。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ssb" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <merge> <!-- 省略 --> </merge> </LinearLayout>
这个就是错误的,错误报告内容如下:
2. merge 可以包含 include 标签,反之不行
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" <include android:id="@+id/newone"layout="@layout/share"> </include> <include android:id="@+id/newtwo"layout="@layout/share"> </include> </merge>
上面的用法是正确的。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ssb" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include> <merge> <!-- 省略 --> </merge> </include> </LinearLayout>
这种用法是错误的(也是类似 1 的错误)。
3. include 可以间接包含 merge
mergedemo.xml 文件
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:contentDescription="@null" android:scaleType="centerInside" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center" android:background="@drawable/sb_msg_count" android:gravity="center" android:textColor="@android:color/white" /> </merge>
main.xml 文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <include layout="@layout/mergedemo" /> </LinearLayout>
注意这种情况下,include 进来的 xml 文件,merge 就会被忽略,没有任何作用。
也就是说,main.xml 相当于
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:contentDescription="@null" android:scaleType="centerInside" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center" android:gravity="center" android:textColor="@android:color/white" /> </LinearLayout>
这一点要注意!
4. 使用 inflate 加载 merge 布局文件
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ssb" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > </LinearLayout>
mergedemo.xml
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:contentDescription="@null" android:scaleType="centerInside" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center" android:gravity="center" android:textColor="@android:color/white" /> </merge>
activity.java
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 找到父节点 LinearLayout superlayout = (LinearLayout) findViewById(R.id.ssb); // 实例化 LayoutInflater LayoutInflater inflater = LayoutInflater.from(getApplicationContext()); // inflate View view = inflater.inflate(R.layout.mergedemo, superlayout, true); // 显示 setContentView(superlayout); }
这里需要注意几个问题
(a). inflater.inflate(R.layout.mergedemo, superlayout, true);
必须指定 superlayout 和 true,否则报错。
(b). 不需要再次 addview
// 找到父节点 LinearLayout superlayout = (LinearLayout) findViewById(R.id.ssb); // 实例化 LayoutInflater LayoutInflater inflater = LayoutInflater.from(getApplicationContext()); // inflate View view = inflater.inflate(R.layout.mergedemo, superlayout, true); superlayout.addView(view); // 显示 setContentView(superlayout);
代码 superlayout.addView(view); 是多余的。
具体可以查看 LayoutInflater.java 源码
5. merge 并不是一定可以取代 FrameLayout 标签。
这个需要视具体情况而定,merge 被 include 之后,是被忽略的。