精华内容
下载资源
问答
  • vc++6.0的watch使用技巧

    2018-09-19 23:02:32
    转载处:... 1 #include <stdio.h> 2 #include <windows.h&... 4 class AutoExpand 5 { 6 public: 7 AutoExpand(int val, char* pval) 8 ...

    转载处:https://www.cnblogs.com/herbertchina/p/3917999.html

    复制代码
     1 #include <stdio.h>
     2 #include <windows.h>
     3 
     4 class AutoExpand
     5 {
     6 public:
     7     AutoExpand(int val, char* pval)
     8     {
     9         a = val;
    10         p = pval;
    11     }
    12 private:
    13     int a;
    14     char *p;
    15 };
    16 class CantExpand
    17 {
    18 public:
    19     CantExpand(int val, char* pval)
    20     {
    21         a = val;
    22         p = pval;
    23     }
    24 private:
    25     int a;
    26     char *p;
    27 };
    28 
    29 int main(void)
    30 {
    31     int p[4] = {0x31,0x32,0x33,0x34};
    32     int *a  = p;
    33     
    34     FILE* fp = fopen("File Not Exist", "r");
    35     DWORD dwError = GetLastError();
    36     
    37     AutoExpand ae(10, "abc");
    38     CantExpand ce(10, "abc");
    39 
    40     return 0;
    41 }
    复制代码

          上面代码中出现的变量先说明一下:

      p: 是整形数组,含四个元素,总共16Byte;

      a: 整形指针,指向数组p;

      fp: 文件指针,用来标识打开的"File Not Exist",我机器里是没这个文件的;

      dwError: 获得fopen失败的错误码。一般来说可以用FormatMessge来格式化这个错误原因或者直接用VC自带的工具errorlookup来查找这个错误码的解释;

      ae和ce: 是自定义的AutoExpand类型的变量和CantExpand类型的变量。注意,这两种类型只有类型名字不同。

      下面看一下我在调试这个程序的时候,watch窗口的显示:

      

      上图中,左边是Context窗口的Locals页,显示所有局部变量。右边是Watch窗口,是我自己添加的要观察的对象。 

      好,先看看整形数组p。我们看到Context窗口的显示p其实只显示了数组的地址,点了+号展开后,显示出了4个整形数据。而右边窗口,我添加了一个p,c。p后面加个",c"是什么意思呢?看看效果,p,c下面的[0],[1],[2],[3]显示的是这4个整形值对应的ascii字符哈。所以从这里有了第一个小技巧:

      1.watch窗口中,在整形变量后面加上",c"可以显示该变量对应的ASCII字符。实际上,可以直接敲数字这么显示也行。比如上面右边窗口中的118,c的对应值是'v'。也就是说118对应的ASCII字符是'v'。那么,反过来,要知道一个字符的ASCII码值怎么看呢?看上面,'v',d就是显示字符'v'对应的十进制ASCII码值是118。 'v',x显示的是对应的十六进制的ASCII码值。除了",c"   ",d"   ",x"外,还有一些其他的参数可以加,见后面的附表。

      然后我们看看变量a。a是个指针。看左边窗口,即使点了它的+号展开,也只看到了它指向的地址的第一个元素(49)。如果想要看得更多的数据,也可以像我一样,在上面的Memory窗口里看。但是Memory窗口只有一个,要看多个指针指向的数据就麻烦了,切来切去。那就在watch窗口中显示吧,a,4就可以了,看到我的watch窗口的显示没?所以,有了第二个小技巧:

      2.watch窗口中,把指针当成数组看,只要在指针名后面加上一个长度,就可以想看数组一样看到对应的数据了。比如我上面的a,4。那么如果一个指针指向的数据很大,比如一个整形指针a是指向一个1000个整数的大块内存,我只想看看最后4个数据,要怎样呢?那就(a+996),4 呗。从第996个数据开始,看4个~

      接下来这个小技巧是我最喜欢的一个了。调试中遇到系统函数调用失败的情况,通常都要加上GetLastError()函数获得返回值,然后查对应的解释才知道错误原因。比如,我上面的代码要打开一个不存在的文件,结果fopen失败。取回了错误码dwError=2,一查才知道是文件不存在。那么可不可以不用查,调试器直接告诉我原因呢?当然可以,不然我写这干嘛!刚才的错误码2是记录在dwError中了,所以只要在watch窗口看看dwError,hr看value栏:系统找不到指定的文件!爽吧!总结一下,第三个小技巧:

      3. 在watch窗口中察看错误原因,只需要在错误之后面颊上",hr"就可以了。比如我上面的 dwError,hr 和 2, hr 都能够显示错误消息。想看某个错误码的解释,只要后面加上",hr"就轻松搞定,非常方便!这里还要提一下的是,即使不调用GetLastError()也是可以看错误原因的。在fopen()调用完后,直接在watch窗口敲err,hr也可以显示最近一次的错误原因。但是我机器重新装了os,还没装vc,现在用的还是安装前的尸体。所以这个err,hr的显示有问题。不过还是有应对之法,那就是强大的TIB信息。watch窗口看看*(unsigned long*)(TIB+0x34), hr也是一样的。至于为什么吗,那就是GetLastError的机制了。

      还剩2个变量,ae和ce。这两变量类型名不同,但是其他全都一样。为什么这两个变量在watch窗口中显示的不一样呢?ae直接显示出了类成员的值,ce就显示了个......嗯,这就是最后一个小技巧:

      4. 在vc安装目录的msdev\bin目录下有个autoexp.dat文件。可以在里面自定义数据的显示。具体的看看它前面的大段说明,说得很详细。我就是在文件后面加上一行AutoExpand =int_val=<a,d> sz_val=<p,s>。

     

    附表:

      下表说明调试器可识别的格式说明符。

     

    说明符格式显示
    d,i signed 十进制整数 0xF000F065 -268373915
    u unsigned 十进制整数 0x0065 101
    o unsigned 八进制整数 0xF065 0170145
    x,X 十六进制整数 61541(十进制) 0x0000F065
    l,h 用于 d、i、u、o、x、X 的 long 或 short 前缀 00406042,hx 0x0c22
    f signed 浮点型 3./2. 1.500000
    e signed 科学计数法 3./2. 1.500000e+000
    g signed 浮点型或 signed 科学计数法,无论哪个都更短 3./2. 1.5
    c 单个字符 0x0065 101 'e'
    s 字符串 0x0012fde8 "Hello world"
    su Unicode 字符串   "Hello world"
    hr HRESULT 或 Win32 错误代码。(调试器自动将 HRESULT 解码,因此这些情况下不需要该说明符。 0x00000000L S_OK
    wc 窗口类标志。 0x00000040 WC_DEFAULTCHAR
    wm Windows 消息数字 0x0010 WM_CLOSE

     

      下表包含用于内存位置的格式化符号。

    符号格式显示
    ma 64 个 ASCII 字符 0x0012ffac .4...0...".0W&.......1W&.0.:W..1...."..1.JO&.1.2.."..1...0y....1
    m 以十六进制表示的 16 个字节,后跟 16 个 ASCII 字符 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..
    mb 以十六进制表示的 16 个字节,后跟 16 个 ASCII 字符 0x0012ffac B3 34 CB 00 84 30 94 80 FF 22 8A 30 57 26 00 00 .4...0...".0W&..
    mw 8 个字 0x0012ffac 34B3 00CB 3084 8094 22FF 308A 2657 0000
    md 4 个双倍字长 0x0012ffac 00CB34B3 80943084 308A22FF 00002657
    mq 2 个四倍字长 0x0012ffac 7ffdf00000000000 5f441a790012fdd4
    mu 2 字节字符 (Unicode) 0x0012fc60 8478 77f4 ffff ffff 0000 0000 0000 0000

      可以使用带有计算为位置的任何值或表达式的内存位置说明符。

    展开全文
  • 注意:技巧主要针对在watchOS 7(Apple Watch Series 6,SE,5、4、3)上运行的型号。但是其中一些也可以在watchOS 6和更早版本上使用。 1.让Apple Watch宣布时间 唤醒您的手表屏幕,然后用两根手指按在手表表面上。...

    我们知道Apple Watch除了普通的查看时间外,还可以帮你完成一系列任务。对于新用户来说掌握一些使用小技巧是非常必要的,小编总结了Apple Watch的一些使用小技巧,可以让你更好的使用iwatch,快来学习一下吧!
    注意:技巧主要针对在watchOS 7(Apple Watch Series 6,SE,5、4、3)上运行的型号。但是其中一些也可以在watchOS 6和更早版本上使用。
    1.让Apple Watch宣布时间
    唤醒您的手表屏幕,然后用两根手指按在手表表面上。它将宣布时间。如果没有:
    ▪打开设置,然后点击时钟。
    ▪启用讲话时间。在这里插入图片描述
    2.每隔几分钟发出提醒声音
    希望您的Apple Watch(处于非静音模式时)每15、30或60分钟发出一次声音吗?可以按照以下步骤进行操作。
    ▪在Apple Watch上打开设置。
    ▪点击辅助功能。
    ▪点击铃声。
    ▪启用Chimes的开关。
    ▪接下来,点击计划以选择间隔,最后点击声音以选择所需的音调。
    在这里插入图片描述
    3.自定义Dock以显示喜欢的应用
    当您按下Apple Watch的侧面按钮时,Dock会显示十个最近访问的应用程序,所以我们可以来设置十个最喜欢的应用程序。
    ▪在配对的iPhone上打开Watch应用。
    ▪在“我的手表”选项卡中,点击Dock。
    ▪在DOCK ORDERING下,选择收藏夹。
    ▪接下来,点击编辑以将应用程序添加到收藏夹,您也可以根据自己的喜欢重新排列它们的顺序。
    在这里插入图片描述
    4.定制表盘
    自定义表盘时,Apple Watch具有无限的可能性。您可以更改表盘颜色,甚至与他人共享表盘等等。当然也可以使用个人照片做表面了!
    5.启用或禁用Apple Watch上的Always On屏幕
    如果您拥有Apple Watch Series 5或更高版本,则可以选择使用“始终在线”功能。(默认情况下处于启用状态。)但是,如果您希望电池寿命更长一点,可以选择关闭“始终显示”功能。关闭方法如下:
    ▪按Digital Crown查看所有应用程序,点击设置。
    ▪向下滚动并点击显示和亮度。
    ▪点按“始终在线”。
    ▪禁用“始终开启”切换。在这里插入图片描述
    6.编辑应用程序布局
    当您按下Digital Crown时,会看到应用程序的气泡。您可以按照自己喜欢的方式移动和重新排列这些应用程序图标。
    ▪按下Digital Crown以查看应用程序图标。
    ▪按住一个图标,直到所有图标开始抖动。
    ▪触摸所需的应用并将其拖到新位置。在这里插入图片描述
    快来发挥创造力设计一个独一无二的程序布局吧!
    7.将应用程序视图从网格更改为列表
    更习惯列表显示方式,非常简单,来看设置方法。
    ▪在Apple Watch上打开“设置”应用。
    ▪点击应用程序视图。
    ▪选择列表视图。在这里插入图片描述8.增加文字大小让阅读更舒适
    默认情况下Apple Watch屏幕很小,相应的文字也会很小,如果您在阅读屏幕上的文字时感到非常不习惯,请按照以下方法调整文字大小。
    ▪启动Apple Watch设置应用。
    ▪点击显示和亮度。
    ▪向下滚动并点击文本大小。
    ▪旋转数字表冠或点击Aa更改文本大小。
    ▪返回或按任何物理监视按钮以保存更改。在这里插入图片描述
    9.防水设置
    Apple Watch是具有防水功能的,在游泳或下雨后,您可以强行将水从其格栅中喷出。
    ▪调出控制中心,如果您位于任何其他屏幕(主屏幕除外)内,请从屏幕底部向上滑动。
    ▪向下滚动并点按液滴图标。
    ▪手表会要求您转动数字表冠,该过程开始时,您会听到排水的声音。
    10.退出Apple Watch上的应用
    无论是应用程序无响应还是不必要的应用程序耗尽了手表的电池电量,都令人烦恼,无论哪种情况都可以按照以下步骤快速在Apple Watch上强制退出应用程序。
    ▪按下侧面按钮(位于圆形数字表冠下方的一个按钮)以查看打开的应用程序。
    ▪在应用程序卡上从右向左滑动。
    ▪点击红色的关闭按钮。
    更多Apple Watch使用小技巧,可以关注本站哦!

    展开全文
  • 1、列出/root目录下文件的扩展名ls -Xp /root | grep -Eo "\.[^/]+$"2、每行一个显示PATH变量printf ${PATH//:/\\n}3、有时候...lsof -n |grep deleted4、数字时钟watch -tn1 'date +%T'5、删除当前目录下的所有空...


    1、列出/root目录下文件的扩展名

    ls -Xp /root | grep -Eo "\.[^/]+$"

    2、每行一个显示PATH变量

    printf ${PATH//:/\\n}

    3、有时候文件明明被删除,但是还是占用硬盘空间,可以使用下面命令看看是不是还被某些进程占用着。

    lsof -n |grep deleted

    4、数字时钟

    watch -tn1 'date +%T'

    5、删除当前目录下的所有空目录

    find . -type d | tac | xargs rmdir 2> /dev/null

    6、curl只看响应头

    curl -I 'https://www.qq.com'

    7、查看指定网站web server(如果没有被刻意隐藏的话),另外上面的curl命令也可以查看。

    wget -S -O/dev/null "https://www.qq.com" 2>&1 | grep Server

    8、查看cpu信息,另外内存、网络等信息在/proc目录里也有对应的文件。一定要自己看一下哦。

    cat /proc/cpuinfo

    9、检查tar命令是否存在,在写脚本的时候会用到,了解command命令可以在linux命令手册公众号里回复该命令就能查看到用法。

    command -v tar

    10、好了就这样,这次也没有10,祝你周末愉快!


    e63eec0e7e3cac3d3dd766caf188a59f.png

    长按识别或扫码关注「Linux命令手册」

    可以快速查询命令和提升Linux技能哦!

    展开全文
  • git 学习3:Git的使用技巧

    千次阅读 2008-12-03 14:44:00
    git & kernel notesa> Google Talk: Linus Torvalds on git ...4XpnKHJAok8b> Google Talk: Randal Schwartz on git http://www.youtube.com/watch?v=8dhZ9BXQgc4b> git中文教程(写于200
     


    git & kernel notes

    a> Google Talk: Linus Torvalds on git
       http://www.youtube.com/watch?v=4XpnKHJAok8
    b> Google Talk: Randal Schwartz on git
       http://www.youtube.com/watch?v=8dhZ9BXQgc4
    b> git中文教程(写于2006年,内容还适用)
       http://www.bitsun.com/documents/gittutorcn.htm

           
            1, Linus的git tree,AKA 'mainline kernel':

                    $ git-clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

               其他的git trees可以在http://git.kernel.org/找到,点击进去就能看到GIT URL。


           
            2, 安装git docs
           
               要有asciidoc、wish命令,安装tcl/tk和asciidoc.  wish命令在tk-x.xx.xx包中。

                    $ sudo make install-doc
           

            3, TERMs in git

                       SHA1 ID                 : 由一个commit的内容和msg共同产生的一个全局唯一的ID。
                                                 用前5个字母就够了,git-describe列出来的就是。
                       HEAD                 : 当前branch的lastest commit,也叫tip。 (remember 'hg tip'?)
                                                 HEAD的SHA1 ID可以用git-show HEAD来产看
                       ORIG_HEAD                 : 原来的HEAD。 可以用git-show ORIG_HEAD来查看其SHA1 ID。
                                                 /* FIXME: 我觉得这个"原来",是针对那些可能导致HEAD移动的操作而言,
                                               * 例如merge,pull,reset --hard等。
                                               */


            4, 使用git
            [FYI] 自从git-1.5.4,'git-xyz'这种用法就不提倡了,而推荐'git xyz'风格。 git的后续版本中将在make install
                  时不再安装'git-xyz'这些hardlinks。

                  当如果执行git --exec-path输出的目录中依然有git-xyz这些脚本,你还是可以把这个路径加到PATH环境变量中,
                  这样还能够使用git-xyz形式的脚本。

               config
               ------
               我的一些简单的配置:

                       $ git-config user.name "Jike Song"
                       $ git-config user.email albcamus@gmail.com
                       $ git-config core.editor vim
                       $ git-config core.pager "less -N"
                       $ git-config color.diff true         //显示diff时色彩高亮
                       $ git-config alias.co checkout         //给git checkout取个别名,这样只输入git co即可
                       $ git-config sendemail.smtpserver /usr/bin/msmtp

               注意,这会在当前repository目录下的.git/config中写入配置信息。 如果git-config加了--global
               选项,配置信息就会写入到~/.gitconfig文件中。 因为你可能用不同的身份参与不同的项目,而多个
               项目都用git管理,所以建议不用--global配置。

                      $ git-val -l                 //列出git变量


               init
               ----

                       $ git-init-db                 //创建一个.git/目录,初始化一个空的git仓库
                                                    //这个目录在git-clone时也会创建。也就是说clone时会自动初始化git
                                                    //仓库里需要的东西
                   
               clone
               -----

                       $ git-clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git [dir name]
                       [dir name]是你想让这个仓库叫什么名字。 如果不指定,就会等同于目标仓库的名字。

                       注意,这种git server形式的repository,都有一个filename.git文件; 而对于*.git的操作,也可以
                       针对.git所在的目录:
                      
                            $ mkdir tmp/
                            $ cd tmp/
                            $ git-clone ~/Sources/linux-2.6
                   
                       或者通过ssh:

                            $ git-clone arc@host.xyz.com:/home/arc/Sources/linux-2.6

                       此时当前目录下有一个.git/目录. 以下我们都在linux-2.6/下演示:

               pull
               ----
                       $ git-pull                 //更新本地的git tree。 如果自从你clone了linus tree之后,linus tree
                                            //有新的改动,那么把这些更改更新到你的本地tree中
                                            //类似于cvs update

                      FYI:  git-clone和git-pull都会默认调用git-merge。
                
                      FYI: 每天git-pull更新技巧:
                            1) git-describe,例如目前是v2.6.26-rc8-12
                            2) git-pull -v
                            3) git-describe,例如是v2.6.26-rc8-22
                            4) git-log -p -10查看变化

               diff
               ----
                       $ git-diff                 /*列出自己本地的tree中已修改、但却未commit的改动
                                              这也是产生patch的方式(用来提交的patch需要先commit到自己的tree里,
                                              然后git-format-patch)。 注意,使用git-diff产生的patch都应该在
                                              patch(1)时指定-p1,或者直接使用git-apply打补丁
                                             */
                       选项:
                         --color                         diff语法高亮(可以git-config color.diff true)
                         --ignore-space-at-eol          忽略行尾的whitespace
                         -b
                         --ignore-space-change          忽略行尾的whitespace,并且认为所有的whitespace都是一样的
                         -w
                         --ignore-all-space         比较两行的时候,完全忽略whitespace。这样,即使是一行有很多
                                                         whitespaces,另一行文字一样但是没有whitespace,git也认为这两
                                                    行内容一致。


               FYI: diff不同的branches
                               
                        /* 下面这两种写法是一样的,都是列出:与jike分支相比,master分支有哪些不同 */
                        $ git-diff jike..master
                        $ git-diff jike master

                        /* 列出自从jike分支从master分支脱离以来,master分支又有过哪些改动 */
                        $ git-diff jike...master

    /*{{{*/                   git-diff的详细用法:

                       列出自己的tree HEAD和某一个tag的不同:
                               $ git-diff v2.6.22

                       列出某一个文件,和以前某个tag的该文件的不同:
                               $ git diff v2.6.20 init/main.c
                               注意结果中+表示自己的tree,-表示2.6.20的。

                       列出两个tags之间的不同:
                               $ git-diff v2.6.20..v2.6.21-rc1
                      
                       列出两个commits之间的不同(Notes,是这两次commits之间的commits引入的所有改动):
                                  $ git-diff 2a062ab483f5afd764fb20631ee960672946a4be..a44008f2372684bacfab03de5039f68b613c5b53

                       列出两个tags的某一文件的不同:
                               $ git-diff v2.6.23 v2.6.24-rc1 init/main.c

                       or:

                               $ git-diff v2.6.25-rc3:kernel/module.c v2.6.25-rc4:kernel/module.c

                       or:

                               $ git-diff v2.6.25-rc3:kernel/module.c HEAD:kernel/module.c
                      

                       事实上,git-log,git-whatchanged等命令都可以这么用。
    /*}}}*/

               apply
               -----

                       $ git-apply                 相当于patch(1)命令,不过git-apply专门用来apply那些用git-diff生成的补丁
                       --check                 //不真正打补丁,而只是检查补丁是否能完美的打上
                       -v                      //verbose模式
                       -R                         //reverse模式,也就是拉出这个补丁来(而不是打进去)

               gui
               ---
                       $ git-gui
                   
                    or:
                      
                       $ gitk                 //GUI模式。还有一些不在git包中的git GUI前端。 我觉得基于Qt的qgit最好用

              

              revision list
              -------------

                       $ git-rev-list <ID>        以时间为顺序,反向列出revision ID。 也就是先列最新的commit ID。
                                               也可以指定列出的数目,例如:

                                               $ git-rev-list -2 971a71bdc9b42e74a5a8ed0433ac27ae92291024
              log
              ---

               查看某一文件都被哪些补丁改动过:
              
                       $ git-whatchanged -p security/Kconfig
              
               查看某一文件的每一行的作者和Revision ID:
                      
                       $ git-blame  security/Kconfig

                 or:

                       $ git-annotate security/Kconfig

               查看某一版本的某一文件:
              
                       $ git-show v2.6.22:init/main.c

               查看两个tags之间的log:(git-shortlog也可以这么用)
              
                       $ git-log v2.6.25-rc3..v2.6.25-rc4
               和:
                       $ git-log -p v2.6.24..v2.6.25-rc1 arch/x86/kernel/smp_64.c
               和:
                       $ git-whatchanged v2.6.24..v2.6.25-rc1 arch/x86/kernel/smp_64.c
           
               查看某版本之后的log:
              
                       $ git-log v2.6.25-rc4..HEAD  //HEAD可以省略,直接写成git-log v2.6.25-rc4..


              撤销最近的commit
              ----------------

                       $ git-reset HEAD~1                 //HEAD~1这种方式也可以表示为HEAD^
                       $ git-diff |git-apply -R -v

                       注意:1) git-reset和git-revert不同,后者是把补丁作为另一个commit反向打入tree中,而reset
                                 是真正的撤销; 2) 如果撤销最近的n次commits,就用git-reset HEAD~<n>,例如HEAD~2
           

              回退到某个tag或commit
              --------------------
                      例如目前我的linux-2.6里是:
                           
                            $ git-desribe
                            v2.6.26-3465-g5b664cb

                    我想让它回退到v2.6.26时的状态(程序和ref log一起回退)。 git-log搜索"Linux 2.6.26"的commit ID为:
                           
                            bce7f793daec3e65ec5c5705d2457b81fe7b5725

                    那么:
                           
                            $ git-reset --hard bce7f793daec3e65ec5c5705d2457b81fe7b5725
                            --hard不但会reset你的working tree,而且联index files一起reset:整个回到你指定的commit状态。


               reset/reflog
               ------------
                    举例来说,reset你的当前branch的tip(HEAD所在的那个commit)

                            $ git-reset HEAD^

                            选项:
                                   
                                    --mixed         只撤销掉index中的commit,却保留那个commit对应的内容
                                    --hard                 index和working dir全撤销,也就是commit消失,并且其内容也消失
                                    --soft                 index和working dir都不动,只"require them to be in a good order" (
                                                    这是man git-reset中的话,什么意思?) 。这会让该commit修改的文件变
                                                    成"dded but not yet committed"的状态。

                            如果不加这3个参数之一,那git-reset默认就是--mixed方式。


    /*{{{*/                [FYI] git-reset --hard之后又想恢复
                         
                          在git中,除非你运行了git-gc --prune,否则历史是永远不会被擦除的,你可以随意恢复到任何历史状态。 下面就是
                          一个恢复被git-reset --hard擦除了的commit的例子:
                         
                            //reset最近的commit
                                    $ git-reset --hard HEAD^
                                    HEAD is now at bc45eb8 Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

                            //查看reflog
                                    $ git-reflog
                                    bc45eb8... HEAD@{0}: HEAD^: updating HEAD
                                    a7dc750... HEAD@{1}: commit: [PCI] code cleanup : remove dead pci_remove_device_safe()
                                    bc45eb8... HEAD@{2}: checkout: moving from jike to bc45eb8950b8c14487385cfd2bda1613ca8d9703

                            //reset回去
                                    $ git-reset --hard HEAD@{1}         //注意,HEAD@{1}就是我们要恢复的那个状态
                                    HEAD is now at a7dc750 [PCI] code cleanup : remove dead pci_remove_device_safe()

                            注意也可以把reflog列出来的历史状态checkout出来:
                                   
                                    $ git-checkout HEAD@{30} -b new_branch
    /*}}}*/



            stash
            -----
                    git-stash是个很有趣的功能,它可以让你把目前的dirty内容"隐藏"起来,使得你的仓库看起来是干净的。
                    这在两种情况下很有用:
                           
                            1,修改了一个文件,尚未commit,此时又想去修改别的文件;
                            2,切换到别的branch之前,把尚未commit的改动stash一下,以防git-checkout命令丢弃了你的
                               未提交的修改。
                           

                    用法:
                           
                            $ git-stash

                            参数:
                                    list                                 //列出所有stash了的项目,注意会显示stash的ID
                                    show [-p] [stash@{<id>}]        //查看某个stash,-p会显示补丁。 如果不指定id,则show最近stash的那个
                                    apply [stash@{<id>}]                 //恢复某个stash。 如果不指定id,则apply最近stash的那个
                                    save                                 //stash当前的未提交的改动
                                    clear                                 //销毁所有stash了的未提交改动

                            不加参数的话,默认行为就是save。
                           

                            例如:
                                    $ git-stash list
                                    stash@{0}: WIP on test: 42bb109... a commit to fix. --fixed in git-rebase, "edit"
                                    stash@{1}: WIP on test2: 10253e6... Merge branch 'test' into test2
                                    stash@{2}: WIP on test2: 10253e6... Merge branch 'test' into test2

                            注意'test'和'test2'都是branch。
                                   
                                    $ git-stash show -p stash@{2}

                                    $ git-stash apply stash@{2}

                            注意,$ git-stash pop相当于从stash 栈里头apply一个stash,亦即:git-stash apply stash@{0}

                            可以把任一分支的stash给apply到当前分支上。





              
           
             add
             ---
             新加文件到index中,使得git可以跟踪它:

                       $ git-add <filename>          //类似于cvs add <filename>。 如果<filename>是目录,那么git-add
                                                       //会自动去递归地添加该目录下的所有文件和子目录
                       $ git-add -a                 //本目录下所有文件和子目录

                       git-add 实际上是对git-update-index的调用,git-add hello.c就相当于:
                                      
                                    $ git-update-index --add hello.c

            commit
            ------

                       $ git-commit -e -s -a
                           -s                  增加Signed-off-by行
                       -e                 调用vim(我在.git/config里制定的editor)进行编辑 commit message
                       -a                 all
                       -v                 在vim中编辑commit msg时,连补丁本身也显示在其中
           
            delete
            ------
            删除文件:

                       $ git-rm aa.c
                       $ git-commit


            撤销一次commit
            --------------
              
                       $ git-log                  /* 找到要撤销的commit ID */
                       $ git-revert adb2f08089edac8bf1912a618a74485ab42f2b86         //指定导致删除操作的commit ID,进行撤消


            列出某一个commit ID对应的补丁
            -----------------------------

                       $ git-log -1 -p 721151d004dcf01a71b12bb6b893f9160284cf6e
                       -1的意思是只显示一个commit。如果你想显示5个,就-5。不指定的话,git log会从该commit一直往后显示。

                       选项:
                               --color         diff语法高亮

                    or:
                      
                       $ git-format-patch --stdout -1 721151d004dcf01a71b12bb6b893f9160284cf6e
                       --stdout指定git写到标准输出,否则会写入到磁盘中。

                    or:

                       $ git-show 721151d004dcf01a71b12bb6b893f9160284cf6e


            git-shortlog
            ------------
                   
                    类似于git-log,只是简略。
           

            git-bisect的用法
            ----------------
    /*{{{*/                   $ git-bisect start
                       $ git-bisect bad    //该版本的kernel标记为bad

               或者有针对性的:
                         
                       /* 只对2.6.22-rc1之后、2.6.22-rc2之间的commits进行bisect */
                       $ git-bisect bad v2.6.22-rc1
                       $ git-bisect good v2.6.22-rc2

              
    LABEL:           在你指定了bad和good之后,如果这两个版本之间有1000个revisions,git就默认剔除了500个,你应该在此时测试该版本:
                      
               创建一个临时性的output目录:

                       $ make ../git_bisect_output/
               编译:
                         
                       $ make O=../git_bisect_output/ menuconfig
                       $ make O=../git_bisect_output/ V=1 -j4
                       $ sudo make O=../git_bisect_output/ V=1 modules_install install
                       注意,最好在menuconfig时,给local version加上一个string,例如take1、take2等。
              
               启动新编译的kernel,如果还有BUG:
                         
                       $ git-bisect bad
              
               如果没有BUG了:
                         
                       $ git-bisect good

               goto LABEL;


               直到某个时候,只剩下一个revision可以怀疑,那时候就可以确认是它引入了BUG。

               当bisect结束,恢复到master版本:
                      
                    # git-bisect reset


               [注意]
                       git bisect是一个漫长而痛苦的过程。我在Dell Optiplex745(2G内存/Core2双核2G)机器上足足做了一天,才定位到一个BUG。
           
               [replay的用法]
                       如果应该输入git-bisect good的时候,不小心输入了git-bisect bad; 或者本应该输入git-bisect bad的时候不小心写成了
                    git-bisect good, 则可以这样回退:
                           
                            1) git-bisect log | tee ../git.bisect.log
                            2) 修改../git.bisect.log,删掉最后两行 -- 也就是回退1步。 如果需要回退N步,那就删掉N个最后两行
                            3) git-bisect replay ../git.bisect.log

               [visualize的用法]
                       git-bisect的时间很长,因为可能需要编译N次内核。 在此期间,可以用:
                           
                            $ git-bisect visualize

                    来在gitk中查看目前还待检验的那些Revs。
                    FYI: 如果你象我一样更喜欢qgit,可以修改`which git-bisect`脚本,将'gitk'字样替换成'qgit'。
            /*}}}*/
                      
              
            修改上次commit的log message
            ---------------------------

                       //下面这个方法真土..事实上,git-citool只是git-commit的GUI形式
                       $ git-citool                 GUI界面的git-commit。 不但可以提交,而且可以编辑上次commit的信息。

                    or:

                       //修改
                       $ git-commit --amend

                    同理,使用git-commit的--amend模式还可以修改last commit的 *内容*.
                           
                            -> git-stash                          //藏起未提交的工作,make your branch looks `clean'
                            -> 修改文件,直到你满意
                            -> git-commit -a --amend         //编辑msg
                            -> git-stash apply                 //undo the stash

           
            修改某个commit的msg和内容!!
            ---------------------------

            [WARNING] 修改一个已经不在HEAD位置的commit,无论是修改其msg还是内容,都必须发生在 *该commit尚未被
                      第2人看到* 的情况下,也就是说,没有push给别人,也没有被别人pull过。
                      否则,这种修改会造成开发社区的混乱(think about that...)。


            假定我们同时修改msg和内容:
            [FYI] 对于只修改msg的情形,也走这个步骤,但是注意"5, rebase"的时候,选edit(而不是squash)即可。

                    1, 记住那个要修改的commit ID,SHA1串的前5个字母即可。 例如它是27675;

                    2, 记住27675的前一个commit,例如它是534e3;
                      
                    3, git-show 27675看看它的内容,并用Vim修改相应的文件,改到自己满意为止;

                    4, 提交改动
                           
                            $ git-commit -a -m "a new commit, just to be combined with 27675"

                            假设其ID是12345。

                    5, rebase
                           
                            $ git-rebase -i 534e3

                       这时git会调用vim来让你编辑,你会看到一行行"pick 1acb3e <commit msg>",这些commits都是发生在
                       我们要在git-rebase 指定的534e3之后的。 此时:
                              
                            -> 如果你删除一行,那么git-rebase就会让这个commit消失;
                            -> 如果你删除所有行,那么git-rebase就放弃这次操作;
                            -> 如果你把某一行的"pick"改成了"squash",那么git-rebase就会把这个commit *合并* 到它的上一行
                               的commit里,并再次调用Vim让你编辑合并后的commit msg。
                            -> 如果你把某一行的"pick"改成"edit",那么git就会让你执行: a) git-commit --amend; b) git-rebase
                               --continue,这样可以修改其msg。 注意SHA1 ID会改变。
                      
                       我们需要的就是上面的第3种情形。 找到12345那行,把pick改成squash,然后dd删除该行,p命令粘贴在27675
                       那行的下面,:wq退出Vim。

                       马上Git会再次调用Vim,让你编辑合并后的commit的msg。  编辑后保存退出。

                    6, 再次查看合并后的commit
                           
                            $ git-log 查找msg 或者 git-whatchanged -p <file>查找补丁

                       这时你发现新commit的ID变了,既不是27675也不是12345,而是一个新的SHA1 ID。




            desribe
            -------
              
                       $ git-describe
                       v2.6.25-rc2-347-g97f7905
           
            merge
            -----
                       git-pull/git-push会默认调用git-merge,一般会成功; 如果失败,那就要:

                       1, 该命令必然失败,因为confilicts存在:
                      
                               $ git-merge
                      
                       2, 查看冲突(冲突的地方已经像CVS update冲突那样,在冲突文件中用>>>>和<<<<标记了):
                              
                            $ git-diff
                      
                       3, 修改冲突文件,改成你想要的样子

                       4, 更新index
                              
                            $ git-update-index
                      
                       5, commit这次merge
                              
                            $ git-commit -a -e -s
           

            archive
            -------
                    可以把当前版本(HEAD所处的位置)给export出来。 e.g.

                       $ git-describe
                       v2.6.25-rc4-155-g10c36be

                       $ mkdir ../linux-2.6.25-rc2-347-g97f7905
                       $ git-archive -v v2.6.25-rc2-347-g97f7905 | (cd ../linux-2.6.25-rc2-347-g97f7905/ && tar xf -)
                       $ head -4 ../linux-2.6.25-rc2-347-g97f7905/Makefile
                       VERSION = 2
                       PATCHLEVEL = 6
                       SUBLEVEL = 25
                       EXTRAVERSION = -rc2


                    从本地git仓库中提取某个版本的kernel:

                       $ git-archive -v v2.6.18 | (cd ../linux-2.6.18/ && tar xf -)
                       -v表示--verbose,注意'v2.6.18'可以是git-tag -l列出来的tags中的一个,也可以是其他Rev ID例如HEAD等。

                    导出最新的kernel:

                       $ git-archive -v HEAD | (cd ../linux-HEAD/ && tar xf -)
                      
                    或者打成tarball:
              
                       $ git-archive -v --format=tar v2.6.24 |bzip2 > ../linux-2.6.24.tar.bz2
              
            tag
            ---

                    列出当前已有的tags:
                      
                       $ git-tag [-l]

                    添加tag:
              
                       $ git-tag v2.6.26-test

                    删除:

                       $ git-tag -d v2.6.26-test


            branch/checkout
            ---------------

            添加/删除分支:

                    添加一个叫jike的分支:

                       $ git-branch jike

                    删除该branch:
                      
                       $ git-branch -d jike

                    列出所有分支:
                           
                       $ git-branch                   //列出所有本地分支
                       $ git-branch -a                 //列出所有分支,包括remote 和 local branches
                       $ git-branch -r                 //列出remote branches
           
                    查看目前在哪个branch上
                           
                            $ git-branch
                            jike
                            *master

                    切换到某个branch:
                     
                       $ git-checkout jike    /* 从当前分支(一般是master),checkout并切换到jike分支 */
                       -f 表示覆盖jike分支里未提交的内容(FIXME:是不是连master分支里未提交的内容也都丢失了?)

    /*{{{*/ 例子:从remote的分支checkout到一个新的本地branch:
                      
                       例如我clone了一个远程的仓库,进入那个目录,看看有哪些branches:
                              
                            $ git-branch -a
                            * master
                            origin/multiple-msi-20080711
                      
                       这时候我有可能想把origin/multiple-msi-20080711这个remote branch给checkout出来,并
                       为它新建一个叫做msi的本地branch:
                              
                            $ git-checkout origin/multiple-msi-20080711 -b msi
                      
                       再看看:
                              
                            $ git-branch -a
                            master
                            * msi
                            origin/multiple-msi-20080711
                      
    /*}}}*/
                      
    /*{{{*/                Linux自从2.6.24-rc1,就开始把i386和x86-64合并为x86的工作,有时候需要track旧的代码。
                    (say, 我不知道git-whatchanged -p arch/x86/kernel/apic_32.c怎么能够连以前的arch/i386/kernel/apic.c
                    也跟踪到) 这时候可以有一个workaround: checkout v2.6.23这个tag:
                           
                            $ git-checkout v2.6.23
                            注意,只有在git 1.5.x以及更新的版本上才支持这个操作。 这样checkout之后,HEAD就detach掉了,
                            亦即:你不在任何branch上。git-branch会告诉你你在(no branch)上。
                            那么,怎么切换到原来的状态? 再次git-checkout master即可。
                   
                    在1.5之前,也包括现在,还可以为v2.6.23创建一个branch,用于查看i386或者x86-64的版本历史:
                           
                            $ git-checkout v2.6.23 -b v2.6.23
    /*}}}*/

                    注意,有了master和jike两个分支之后,所有的修改、commit、revert工作,都在jike这个branch
                    上进行;而master这个branch,只用来每天git pull保持和upstream的同步。



            rebase
            ------

                    当jike这个分支有自己的commit、自己的改动,要重新和master分支同步一下
                    (将自己的local commits重新rebase在master里新引入的改动之上):
                           
                            $ git-checkout jike
                            $ git-rebase -i master
                            -i,表示interactive
                            /* 如果rebase失败,说明有冲突(jike和master冲突),修改,然后:
                             *       $ git-rebase --continue
                             */

    /*{{{*/ 一个git-rebase的例子:

                    //目前有master和jike两个branches
                            [arc@localhost linux-2.6]$ git-branch
                              jike
                            * master

                    //master分支比jike新
                            [arc@localhost linux-2.6]$ git-describe
                            v2.6.27-rc5-361-g82a28c7
                            [arc@localhost linux-2.6]$ git-checkout jike
                            Switched to branch "jike"
                            [arc@localhost linux-2.6]$ git-describe
                            v2.6.27-rc5-320-gf8a561a

                    //jike分支的HEAD位于一个local commit处
                            [arc@localhost linux-2.6]$ git log -1
                                  1 commit f8a561aa5fef94becc76a5509a369b742f925058
                                  2 Author: Jike Song <albcamus@gmail.com>
                                  3 Date:   Mon Sep 8 22:26:14 2008 +0800
                                  4
                                  5     PCI: utilize calculated results when detecting MSI features
                                  6
                                  7     in function msi_capability_init, we can make use of the calculated
                                  8     results instead of calling is_mask_bit_support and is_64bit_address
                                  9     twice, in spite of the fact that they are macros.
                                 10
                                 11     Signed-off-by: Jike Song <albcamus@gmail.com>

                    //在jike分支里执行git-rebase,-i表示interactive
                            [arc@localhost linux-2.6]$ git-rebase -i master
                            Successfully rebased and updated refs/heads/jike.

                    //已经rebase了master分支,现在jike分支除了作为HEAD的local commit之外,和master一样了
                    //注意,这里jike分支是rc5-362,此时master分支是rc5-361,正好多一个commit,就是我本地的这个
                            [arc@localhost linux-2.6]$ git-describe
                            v2.6.27-rc5-362-gedaa7ca
                            [arc@localhost linux-2.6]$ git log -1
                                  1 commit edaa7ca47705cc6ca695e267f88f91dbe958da44
                                  2 Author: Jike Song <albcamus@gmail.com>
                                  3 Date:   Mon Sep 8 22:26:14 2008 +0800
                                  4
                                  5     PCI: utilize calculated results when detecting MSI features
                                  6
                                  7     in function msi_capability_init, we can make use of the calculated
                                  8     results instead of calling is_mask_bit_support and is_64bit_address
                                  9     twice, in spite of the fact that they are macros.
                                 10
                                 11     Signed-off-by: Jike Song <albcamus@gmail.com>
    /*}}}*/

           
            pull
            ----
            (pull的访问方式也适用于clone)

                    pull某一个分支:
                   
                    例如我想在/mnt/usb3/linux-2.6的master分支上,来pull ~/Sources/linux-2.6的jike分支:
                   
                       $ cd /mnt/usb3/linux-2.6
                       $ git-pull -v /home/arc/Sources/linux-2.6 jike:master
                       --no-commit 告诉git不要真正commit,就像出现merge confilict了一样。 这样可以给执行
                       git pull的用户一个机会来review他从别人那里pull来的这些代码。

                    FYI:通过SSH协议:

                       $ git-pull root@myhost.xyz.com:/export/home/Sources/linux-2.6 master:master

                    把同一仓库中的master分支pull到jike分支:

                       $ git-pull -v . master:jike


            pull request
            ------------
                      
                       $ git-request-pull <start commit> <url> [<end>]

                       产生pull request信息,打印到标准输出。 其中<end>可以不指定,这样就默认为HEAD。 <url>应该是
                       一个git url,例如"git://git.infradead.org/users/jaswinder/linux-2.6-tip.git",这个url会包含
                       在git-request-pull的输出中.

            push
            -----
            例如我在/mnt/usb3/linux-2.6上,想把push到~/Sources/linux-2.6中:
                   
                       $ cd /mnt/usb3/linux-2.6
                       $ git-push  ~/Sources/linux-2.6  master:refs/remotes/jike

                    "master:refs/remotes/master"是传给git-push的refspec,告诉git把我这里的master分支push到<url>指定
                    的仓库(这里是~/Sources/linux-2.6)的jike分支上。

                    然后,并不是说在~/Sources/linux-2.6上的jike分支已经merge了/mnt/usb3/linux-2.6的master分支了,还
                    需要这样:
                      
                       $ cd ~/Sources/linux-2.6

                       $ git-pull -v .  refs/remotes/jike:jike                 //真正pull到jike分支上

            grep
            ----
            例如我看到dmesg的一个报错:
            evdev.c(EVIOCGBIT): Suspicious buffer size 511, limiting output to 64 bytes.
            See http://userweb.kernel.org/~dtor/eviocgbit-bug.html,
            想看看内核中哪里报的(当然这个例子都给出文件名了):
                      
                       $ git-grep "limiting output to"
                             1 drivers/input/evdev.c:                          "limiting output to %zu bytes. See "


            优化
            ----
            git使用一段时间之后,仓库会越来越大,需要隔一段时间就手工执行命令来优化(FIXME: TBD)
                   
                       $ git-gc
                       FYI: 'gc' stands for 'garbage collection'

                       $ git-prune

                       $ git-fsck
           
            alias
            -----
            git允许自定义命令的alias,在.git/config中添加:
                   
                    [alias]
                            co = checkout

                    那么执行git co就相当于git checkout。


           
            mailinfo & am
            -------------
                   
                       $ git-mailinfo msg patch  <   /path/to/your/filename.eml
                       分析邮件,把commit log写到msg文件,补丁写到patch文件。 其他信息打印到标准输出。
           
                    从mail文件中打补丁:
                   
                       $ git-am --utf8 -s  <  /path/to/your/filename.eml
                       -s等价于--signoff

                       git-am会在当前目录下产生一个.dotest/目录,如果成功apply,这个目录会消失;如果git-am失败,则需要手工
                       解决冲突,修改到一个自己满意的状态,然后执行:

                       $ git-am --resolved

                       这时会继续尝试从.dotest目录中apply这个邮件中的补丁。 或者,作为maintainer,你认为这个补丁需要重写,
                       现在放弃apply它:

                       $ git-am --skip


            send-email
            ----------

                    在普通的网络环境里(我用mail.hit.edu.cn的SMTP server), 有时出现错误:

                            Need MIME::Base64 and Authen::SASL todo auth

                    这说明需要安装MIME::Base64和Authen::SASL两个包:

                            $ sudo yum -y install perl-Email-MIME-Encodings perl-Authen-SASL

                    然后:

                            $ git-send-email --to someone@somewhare.com --compose /
                            --smtp-server 202.118.224.153 --smtp-server-port 25 /
                            --smtp-user albcamus /
                            /path/to/your/filename.patch

                    只要指定了--smtp-user,如果需要密码,会在命令行提示输入(不回显).

           
            用gmail的smtp账户发邮件
            -----------------------
                    1. 安装msmtp
                    2. 建立~/.msmtprc文件,chmod为0600,内容为:

                       //一种配置。 已验证此~/.msmtprc文件在公司内网可用,但Linux上不行
                            defaults
                            tls on
                            account gmail
                            host smtp.gmail.com
                            from albcamus@gmail.com
                            auth on
                            user albcamus@gmail.com
                            password [mypasswd]
                            port 587
                            account default:gmail

                       //另一种配置。 在Linux上,公司里和家里都能用
                       //注意/etc/pki/tls/certs/ca-bundle.crt在我的FC8上是openssl包中的
                           defaults
                           tls on
                           tls_trust_file /etc/pki/tls/certs/ca-bundle.crt
                           logfile ~/.msmtp.log
                           # My email service
                           account gmail
                           host smtp.gmail.com
                           port 587
                           from albcamus@gmail.com
                           auth on
                           user albcamus@gmail.com
                           password
                           # Set a default account
                           account default : gmail


                       注意上面的~/.msmtprc文件中,password命令后面,或者跟上真正的SMTP密码(只能以明文保存!),或者
                       留空。 如果留空,而你的SMTP server要求一个密码,msmtp会去查询~/.netrc文件; 如果还找不到,那
                       么就会在命令行(当然我们是在git-send-email的提示下,因为并不直接调用msmtp命令)提示你输入,并
                       且不回显密码。

                       FIXME: 为什么我用git-send-email发送补丁时,总是会发送两封邮件? 第一封是什么内容都没有的,
                                 (subject则是--subject指定的,或者--compose调用Vim编写的),第2封才是真正的补丁?


                    3. 发送
                           
                            $ cd ~/Sources/linux-2.6
                            $ git-send-email --to <someone@xx.com> --compose --smtp-server /usr/bin/msmtp  </path/to/your/patch/file>
                      
                       也可以把msmtp写到.git/config中去:
                              
                            $ git-config sendemail.smtpserver /usr/bin/msmtp
                      
                       这样在调用git-send-email的时候默认就会以msmtp程序作为smtp server -- 当然如果你又指定了"--smtp-server"的话,就
                       不会采用.git/config里的配置了。




            使用git-tools来处理mbox里的patch:
            ---------------------------------
               
                    $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/git-tools.git
                    然后编译、安装。
                   
                    它提供了applypatch, cvs2git, dotest, mailinfo, mailsplit, stripspace这些工具。
       

            email注意事项
            -------------
                   
                    1) 可以用xclip程序来复制补丁
                   
                              $ git-format-patch -1 --stdout <SHA1 ID> | xclip
                              Note, xclip程序目前似乎不能处理UTF-8字符。
                      
                       然后鼠标中键粘贴。

                    2) 确认你的编辑器不wrap word
                      
                       如使用thunderbird的插件:External Editor指定Vim编辑器(say, "konsole -e vim")等,确认不wrap word。

                       FYI: 不知道为什么External Editor指定konsole -e vim,会自动set tw=72,即使是~/.vimrc设置了tw=0也
                               不行。 这时候给vim加上参数-c "set tw=0"就可以了,亦即告诉vim在load完文件后执行"set tw=0"这个
                            命令。

                       我是这么指定external editor的:
                              
                            konsole --noframe --nomenubar --noscrollbar --notabbar -e vim -c "set tw=0"

                    3) thunderbird设置
           
                       1, View > Sort by 选择Threaded,可以把同一主题的Re:xxx分层列出。

                       2, View Settings for this account > composition & addressing,
                      
                            uncheck "Compose messages in HTML format"

                       3, 编辑~/.thunderbird/92r39mnp.default/prefs.js文件,加两行:
                      
                            user_pref("mailnews.wraplength", 0);
                            user_pref("mailnews.send_plaintext_flowed", false);
              
                          注意 92r39mnp.default 是~/.thunderbird/profiles.ini中的Path字段的值。

                     4) NOTE: 即使用了这些设置,用了Vim编辑邮件,使用thunderbird发补丁依然会遇到malformed问题:( 我真是
                        没办法了,只好只用git-send-email...





            使用free git hosting
            --------------------
                   
                    Internet上有很多免费的git hosting sites,你可以把自己的项目放在上边,以便和别人协同开发。 git官方站点
                    有一个页面列出了常用的站点:

                            http://git.or.cz/gitwiki/GitHosting

                    其中最老的site是:
                           
                            http://repo.or.cz

                    该站点要求项目必须是*free software*。
                   
                    另一个现在最受欢迎(没用过,看别人的评论)的是:
                           
                            http://github.com/

                    GITHUB把projects分为3种: a) opensource projects,免费; b) personal projects,收费; c) business projects,
                    当然收费:)



                           





    88, AKA 2007 Linux内核开发者大会 Bryan Wu的演讲'living rules in kernel community'
       
        kernel.org 有3方面重要功能: 1, git trees
                                            各个git trees的地址和说明:
                                            http://git.kernel.org/
                                         2, bugzilla
                                     3, LKML
                                        各个邮件列表的地址:
                                        http://vger.kernel.org/vger-lists.html

                                        一个lkml的归档下载:
                                        http://userweb.kernel.org/~akpm/lkml-mbox-archives/
                                        从2000年的都有。

        TERM:
                
                mailine == linus tree
                vanilla == stable kernel

                rcX            == linus tree上的git tag,每个rc版本会持续1-2周

                merge window  : 例如从2.6.22到2.6.23-rc1,此时称为merge window is open.
                                    一般情况下merge window是2周时间。
                                这时可以发有很大改动的patch(es).
                                从2.6.23-rc1开始,称做merge window is closed. 只有bugfix
                                等,不接受大的改动。
                
                -mm   : Andrew Morton的git tree,实际上是patches的打包,每个rc版会有1-3个
                        mm trees。
                        http://www.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/

                2.6.x.y         : stable tree,由Greg KH维护的稳定版本,主要是引入对2.6.x的
                              一些漏洞修正等补丁。 (stable@kernel.org)

                -git<N> : 一些git的snapshots,可以从这里下载:
                    http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/


        补丁的注意事项:
                1, 一行不能超过80列,这是硬规定
            2, 用scripts/checkpatch.pl检查自己的patch
            3, 所有的patch都要通过LKML


        git及其他:
                1, quilt, -mm tree用它管理patches
            2, guilt, quilt for git
            http://www.kernel.org/pub/linux/kernel/people/jsipek/guilt/
            3, git-gui, gitk, qgit, gitweb, etc...


    展开全文
  • 总结Vue的小技巧

    2020-01-17 10:17:47
    总结Vue的小技巧1.setTimeout/ setInterval2.Vue...深度作用选择器6.Vue数组/对象更新视图不更新7.Vue Filters过滤器的使用8.Vue深度watchwatch立即触发回调 1.setTimeout/ setInterval this只想改变,无法用thi...
  • <p>4) The last thing I can think of is, that sometimes I do know in advance the length of the slice, so I could just use arrays with fixed length. Could that change anything? <p>5) I have also made ...
  • 11个vue技巧分享

    2020-07-22 23:54:16
    1.路由参数解耦 2.函数式组件 3.样式穿透 4.watch高阶使用 5.深度监听 6.触发监听执行多个方法 7.watch监听多个变量 8.事件参数$event 9.自定义组件双向绑定 10.监听组件生命周期 11.手动挂载组件
  • 调试测试技巧(VS2010)

    2015-06-23 13:05:56
    调试测试技巧总结:1.最重要是编写代码时,命名规范一定要...3.Call Stack可以查看当前堆栈上的函数或过程调用4.Watch监视变量的值5.Hit Count满足某种条件时断点才停下6.直接使用find进行当前文档或整个项目的查找
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相关杂志。可能的话,可以到ic37去买一些小零件,自己搭一个小系统让它工作起来。 ...
  • vue 知识点复盘

    2020-10-19 14:56:54
    指令与修饰符 4.computed,watch使用与比较 5.组件间的通信方式 6.全局组件,局部组件,动态组件,异步组件,递归组件 7.单文件组件中 name 值的作用 8.v-show 与 v-if 的比较 9.key 的作用 10.双向绑定原理 11....
  • 4.l 确认Debugger可以使用 4.2 启动Debugger 4.2.1 Step Into和Step Over的区别 4.2.2 Go 4.2.3 Run to Cursor 4.3 理解Debugger工具栏图标 4.3.1 Restart 4.3.2 Stop Debugging 4.3.3 Break ...
  • 产品经理学习视频

    2018-07-27 14:21:07
    1产品经理原型设计工具Axure使用基础 1-认识Axure.mp4 2-Axure操作界面.mp4 3-动态面板.mp4 4-创建部件库.mp4 5-交互设置.mp4 6-变量.mp4 7-Web案例1.mp4 8-Web案例2.mp4 9-手机原型案例.mp4 PM的3大文档...
  • 有问题请先查阅 FAQ常见问答 和 Wiki使用技巧 或使用搜索引擎。 如果这个项目对你有用,请: 挥动鼠标,右上角给个 Star ! 保留网站页脚的二维码 访问 tk题库 ,充值下载题目 向同学同事推荐这个项目 每天扫一扫本...
  • 全书分4篇15章,共计602个实例和经验技巧。每个实例都是经过笔者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。  本书适合Visual C++的初学者,如高校学生、求职人员作为练习、速查、...
  • 全书分4篇15章,共计602个实例和经验技巧。每个实例都是经过笔者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。  本书适合Visual C++的初学者,如高校学生、求职人员作为练习、速查、...
  • IntelliJ IDEA 常用细节-4 插件推荐、插件开发 插件相关功能设置、插件推荐 Java 热部署插件 JRebel 安装及使用 插件开发视频教程 基于 IntelliJ IDEA 下的 demo 尝试 Maven 的单模块 / 多模块 Spring MVC +...
  • Visual.Basic.6大学教程.pdf

    热门讨论 2013-02-17 16:32:26
    18.6.4 使用INNER JOIN 从多个表中合并数据 593 18.6.5 Biblio.mdb中的全标题查询 593 18.7 再次讨论ADO数据控件和DataGrid控件 595 18.8 Hierarchical FlexGrid控件 597 18.9 DataList和DataCombo控件 598 18.9.1 ...
  • 欢迎来到我的博客,在这里大家可以随意watch、star和fork此项目! 跟谁学 - 长期招聘:Java 研发工程师,感兴趣的小伙伴进!!! 最新博文 New article 1:详述 synchronized 和 volatile 的实现原理以及两者的...
  • 易学C++,C++入门

    2009-12-06 14:30:11
     11.5.4 Watch窗口   11.5.5 用Debug找到错误   11.6 方法指导   11.7 习题   第12章 编写程序技巧   12.1 程序设计的基本步骤   12.2 三类C++编程问题   12.2.1 算法实现   12.2.2 匹配...
  • Android 实战技巧 - v1.1.epub Android 实战简易教程(连载) - v1.0.epub Android 开发教程 - v1.0.epub Android 测试教程 - v1.1.epub Android+ 开源项目指南+ -+ v1.1.epub AndroidTrainingCHS.epub App Store ...
  • Android 实战技巧 - v1.1.epub Android 实战简易教程(连载) - v1.0.epub Android 开发教程 - v1.0.epub Android 测试教程 - v1.1.epub Android+ 开源项目指南+ -+ v1.1.epub AndroidTrainingCHS.epub App Store ...
  • Apple Watch开发初探 马上着手开发 iOS 应用程序 网易斯坦福大学公开课:iOS 7应用开发字幕文件 返回目录 Java Apache Shiro 用户指南 Jersey 2.x 用户指南 Spring Framework 4.x参考文档 Spring Boot参考指南 ...
  • 接入代码watch后每次保存文件都能快速得知自己的的改动是否影响功能,节省了很多时间,毕竟机器干事情比人总是要快得多。 有了自动化测试,开发者会更加信任自己的代码。开发者再也不会惧怕将代码...
  • IWC:Install Watch文档 J J62:Ricoh照相机格式 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 ...
  • 其实了解这些工具的工作方式可以帮助我们更好理解和使用这些工具,也方便我们在项目开发中应用。 弄清楚打包工具的背后原理,有利于我们实现各种神奇的自动化、工程化东西,比如自创 JavaScript ...
  • 希望通过学习它掌握一些框架设计的技巧,也将很久不再拾起的js基础重新温习巩固一遍。如果你对这个系列感兴趣,欢迎点击</a><code>watch,随时关注动态。这篇文章主要想说一下zepto中事件模块(event.js)...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

watch4使用技巧