当前位置:  编程技术>移动开发
本页文章导读:
    ▪五 0.OC16-Block        5 0.OC16-Block 5 0.OC16-Block Block 1)、Blocks封装了一段代码,可以在任何时候执行 2)、Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似.........
    ▪ Mybatis3.2使用经验 中文API        Mybatis3.2使用心得 中文API 最近写一个web服务接口,用到了MyBatis3.2,把我配置的过程及自己的一些做法供大家参考,希望能帮助到刚入手MyBatis的人;(如果您阅读文章时发现问题的,希望能.........
    ▪ Git 常用命令拾掇(转)       Git 常用命令整理(转) 初始化配置 C代码   git diff <file>     # 比较当前文件和暂存区文件差异   git diff   git diff <$id1> <$id2>   # 比较两次提交之间的差异   git dif.........

[1]五 0.OC16-Block
    来源: 互联网  发布时间: 2014-02-18
5 0.OC16-Block
5 0.OC16-Block

Block

1)、Blocks封装了一段代码,可以在任何时候执行

2)、Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:blocks是inline(内联函数的),并且默认情况下它对局部是只读的

3)、苹果官方建议尽量多用blocks。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

 

Blocks的定义



 

例一

Main.m

 //

//  main.m

//  OC10-内存管理2-set方法的内存管理

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013年 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import "Button.h"

 

typedef int (^mySum) (int, int) ;

 

void test(){

    //定义了一个block,这个block返回值是int类型,接受两个int类型的参数

    int (^Sum) (int, int) = ^(int a, int b){

        return a + b;

    };

    

    int a = Sum(10, 11);

    NSLog(@"%i", a);

}

 

void test2(){

    //__block有2个下划线

    __block int c = 15;

    

    //声明了一个block变量

    mySum sum = ^(int a, int b){

        //如果外部的变量用了__block关键字,就可以在block内部修改这个变量

        c = 19;

        //block可以访问外面定义的变量

        NSLog(@"c is %i", c);

        return a + b;

    };

    

    NSLog(@"%i", sum(10, 10));

    

}

 

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

//      test2();

        

        Button *btn = [[[Button alloc] init] autorelease];

       

        btn.block = ^(Button *btn){

            NSLog(@"按钮-%@被点击了", btn);

        };

        

        //模拟按钮点击

        [btn click];

    }

    return 0;

}

 

Button.h

 //

//  Button.h

//  OC10-内存管理2-set方法的内存管理

//

//  Created by qwz on 13-12-10.

//  Copyright (c) 2013年 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@classButton;

 

typedef void (^ButtonBlock) (Button *);

 

@interface Button : NSObject

 

@property (nonatomic, assign) ButtonBlock block;

 

//模拟按钮点击

- (void)click;

 

@end

 

 

Button.m

 //

//  Button.m

//  OC10-内存管理2-set方法的内存管理

//

//  Created by qwz on 13-12-10.

//  Copyright (c) 2013年 renhe. All rights reserved.

//

 

#import "Button.h"

 

@implementation Button

- (void)click{

    _block(self);

}

 

@end

 

 

 

 

 


    
[2] Mybatis3.2使用经验 中文API
    来源: 互联网  发布时间: 2014-02-18
Mybatis3.2使用心得 中文API

最近写一个web服务接口,用到了MyBatis3.2,把我配置的过程及自己的一些做法供大家参考,希望能帮助到刚入手MyBatis的人;(如果您阅读文章时发现问题的,希望能留言指出)

首先导入mybatis-3.2.3.jar包 还有连接数据库的驱动包,我用的是Sqls2005 所以导入sqljdbc.jar

工程中必须导入的三个包(对应的包附件中可以下载):

  • mybatis-3.2.3.jar
  • sqljdbc.jar
  • log4j-1.2.14.jar
  •  第一部分 配置MyBatis及经验之谈(我把类所在包的路径删了,如果要引用我代码的话自己新建一个合适的包路径)
  • 配置过程如下六个步骤缺一不可
  • 第一步:编写数据库连接文件sqlserver-jdbc-connection.properties,我的文件路径在com.mybatis.config包下
#sqlserver connection
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://192.168.1.31:1433; DatabaseName=dataBaseName
username=sa
password=sa
 
  • 第二步:编写MyBatis配置文件Configuration.xml,我的文件路径在com.mybatis.config包下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- 注意:每个标签必须按顺序写,不然蛋疼的DTD会提示错误:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". -->
<configuration>
	<!-- 属性配置 -->
	<properties resource="com/mybatis/config/sqlserver-jdbc-connection.properties">
		<!-- 相同属性:最高优先级的属性是那些作为方法参数的,然后是资源/url 属性,最后是 properties元素中指定的属性 -->
<!-- 		<property name="username" value="sa"/> -->
<!-- 		<property name="password" value="phoenix"/> -->
	</properties>
	
	<!-- 设置缓存和延迟加载等等重要的运行时的行为方式 -->
	<settings>
		<!-- 设置超时时间,它决定驱动等待一个数据库响应的时间  -->
		<setting name="defaultStatementTimeout" value="25000"/>
		<!-- 这个配置使全局的映射器启用或禁用缓存  -->
		<setting name="cacheEnabled" value="true"/>
		
		<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载  -->
<!-- 		<setting name="lazyLoadingEnabled" value="true"/> -->
		<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载  -->
		<setting name="aggressiveLazyLoading" value="true"/>
		
		<!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)  -->
		<setting name="multipleResultSetsEnabled" value="true"/>
		<!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动  -->
		<setting name="useColumnLabel" value="true"/>
		<!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby)  -->
		<setting name="useGeneratedKeys" value="false"/>
		<!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况)  -->
		<setting name="autoMappingBehavior" value="PARTIAL"/>
		<!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新  -->
		<setting name="defaultExecutorType" value="SIMPLE"/>
	</settings>
	
	<!-- 别名 -->
	<typeAliases>
		<!-- 用户bean-用户登录时映射使用  -->
		<typeAlias alias="UserBean" type="com.restservice.bean.UserBean"/>
	
	
	<environments default="development">
		<!-- environment 元素体中包含对事务管理和连接池的环境配置 -->
		<environment id="development">
			<transactionManager type="JDBC" />
			<!-- type分三种:
					UNPOOLED是每次被请求时简单打开和关闭连接 
					UNPOOLED的数据源仅仅用来配置以下 4 种属性driver,url,username,password
					POOLED :JDBC连接对象的数据源连接池的实现,不直接支持第三方数据库连接池
			-->
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- ORM映射文件 -->
	<mappers>
		<!-- 用户测试XML -->
		<mapper resource="com/restservice/bean/UserBean.xml" />
	</mappers>	
</configuration> 
 
  • 第三步:编写对应的用户bean及xml

贴一下xml代码,需要自己写一下bean哦,(不会可以留言。)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper     
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"     
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">     
   
<!-- namespace用于java代码调用时识别指定xml的mapper文件 -->
<mapper namespace="userinfo">
 <!-- 开启Mabatis二级缓存 -->
 <cache/>
 <!-- 配置ORM映射 -->
 <resultMap type="UserInfo" id="user_orm">
  <id property="id" column="id"/>
  <result property="code" column="code"/>
  <result property="name" column="name"/>
  <result property="sex" column="sex"/>
  <result property="phone" column="phone"/>
  <result property="money" column="money"/>
 </resultMap>
 
 <!-- 用来定义可重用的SQL代码段 -->
 <sql id="demo_sql">
  code,name,sex,phone,money
 </sql>
 
 <insert id="inser_userInfo" parameterType="UserInfo">
  <!-- include 引用可重用的SQL代码段 -->
  INSERT INTO USERINFO(<include refid="demo_sql"/>) VALUES(#{code},#{name},#{sex},#{phone},#{money})
 </insert>
 
 <update id="update_userInfo" parameterType="UserInfo">
  UPDATE USERINFO SET code=#{code} ,name=#{name} ,sex=#{sex} ,phone=#{phone} ,money=#{money} WHERE id=#{id}
 </update>
  
    <select id="selectAll_userInfo"  resultMap="user_orm">
     SELECT * FROM USERINFO
   </select>
   
   <select id="selectById_userInfo" parameterType="int" resultType="UserInfo">
     SELECT * FROM USERINFO WHERE id= #{id}
   </select>
</mapper>  

 

 sql语句中常用的特殊处理 如:需要in查询

 

<select id="findWellsInfo" useCache="false" flushCache="true" resultType="hashmap">
  SELECT ID AS FIELDCODE,NAME AS DATACATEGORYNAME,'' COLOR FROM IMS_WELL WHERE ID IN 
  <foreach item="wellIds" index="index" collection="wellIds"
  open="(" separator="," close=")">
  #{wellIds}
  </foreach>
   </select>

我这里传入的参数是一个map ,map中有一个参数是数组wellIds,所以我写成collection="wellIds";

可以直接传入数组,写法:只需要把collection="wellIds"改成collection="array";

也可以传入List ,写法:只需要把collection="wellIds"改成collection="list";

 还有很多特殊情况就不一一举例了,具体请详细阅读附件MyBatis3.2中文API

 

  •  第四步:创建SessionFactoryUtil.java工具类
import java.io.IOException;
import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
/**
 * 
 * MyBatis会话工厂类.
 * 
 * @version 1.0 2013-12-1
 * @author xqwu
 */
public class SessionFactoryUtil {
	
	protected static final Logger log = Logger.getLogger(SessionFactoryUtil.class);
	//MyBatis配置路径
	private static final String RESOURCE = "com/mybatis/config/Configuration.xml";
	//sql会话工厂
	private static SqlSessionFactory sqlSessionFactory = null;
	//所有sqlSession
	private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
	
	/**
	 * 静态代码块 用于获得sqlSessionFactory
	 * 不执行 由SessionFactoryListener调用初始化方法
	 */
	/*static {
		Reader reader = null;
		try {
			reader = Resources.getResourceAsReader(RESOURCE);
		} catch (IOException ioex) {
			throw new RuntimeException("Get resource error:"+RESOURCE, ioex);
		}
		//获得sqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
	}*/
	
	/**
	 * 
	 * 获得SqlSessionFactory
	 * @author xqwu
	 * @date 2013-12-1 下午2:08:59
	 *
	 * @return
	 */
	public static SqlSessionFactory getSqlSessionFactory(){   
        return sqlSessionFactory;   
    }

	/**
	 * 
	 * 初始化SqlSessionFactory.
	 * @author xqwu
	 * @date 2013-12-1 下午2:08:39
	 *
	 */
	public static void initSqlSessionFactory() throws RuntimeException,Exception{
		try {
			
			if(sqlSessionFactory == null){
				Reader reader = Resources.getResourceAsReader(RESOURCE);
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
				log.debug("init sqlSessionFactory success");
			}
			
		} catch (IOException ioex) {
			
			throw new RuntimeException("Get resource error:"+RESOURCE, ioex);
			
		}
	}
	
	/**
	 * 
	 * 获取sqlSession.
	 * @author xqwu
	 * @date 2013-12-1 上午11:27:38
	 *
	 * @return
	 */
	public static SqlSession getSession(){
		SqlSession sqlsession = threadLocal.get();
		
		if(sqlsession!=null){
			if(sqlSessionFactory == null){
				getSqlSessionFactory();
			}
			//如果sqlSessionFactory不为空则获取sqlSession,否则返回null
			sqlsession = (sqlSessionFactory!=null) ? sqlSessionFactory.openSession(): null;
		}
		
		return sqlsession;
	}
	
	/**
	 * 
	 * 关闭sqlSession
	 * @author xqwu
	 * @date 2013-12-1 上午11:26:23
	 *
	 */
	public static void closeSqlSession() throws Exception{
		//获得sqlsession
		SqlSession sqlsession = threadLocal.get();
		threadLocal.set(null);
		if(sqlsession!=null){//验证关闭sqlsession
			sqlsession.close();
			log.debug("close sqlsession success");
		}
		
		log.debug("sqlsession is null");
	}
}

 

  •  第五步:创建tomcat启动监听器类SessionFactoryListener,用于管理sqlSessionFactory生命周期(我用的是tomcat6.0)
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.log4j.Logger;

import com.opro.ims.i.restservice.utils.SessionFactoryUtil;

/**
 * Class description goes here.
 * 
 * @version 1.0 2013-12-6
 * @author xqwu
 */
public class SessionFactoryListener implements ServletContextListener {

	protected static final Logger log = Logger.getLogger(SessionFactoryListener.class);
	/* (non-Javadoc)
	 * <p>Title: contextDestroyed</p>
	 * <p>Description: </p>
	 * @param arg0
	 * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
	 * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
	 */
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		try {
			
			SessionFactoryUtil.closeSqlSession();
			
		} catch (Exception ex) {
			
			log.error(ex.getMessage());
			
		}
	}

	/* (non-Javadoc)
	 * <p>Title: contextInitialized</p>
	 * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化, 
	 * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。 
	 * @param arg0
	 * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
	 */
	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		
		try {
			
			SessionFactoryUtil.initSqlSessionFactory();
			
		} catch (RuntimeException rex) {

			log.error(rex.getMessage());
			
		} catch (Exception ex) {

			log.error(ex.getMessage());
			
		}
		
	}

}

 

  •  第六步:web.xml 配置文件中加入如下内容
	<!-- 初始化SessionFactory监听器 -->
	<listener>   
		<listener-class>com.opro.ims.i.restservice.listener.SessionFactoryListener</listener-class>   
	</listener> 

 

 

  • 第二部分,自己写的扩展接口,项目中所有的dao都继承该接口,个人觉得是可以方便许多。(我把类所在包的路径删了,如果要引用我代码的话自己新建一个合适的包路径)放在自定义包下,如:package com.gool.core

 

编写接口BaseDao
import java.sql.SQLException;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.type.TypeException;

/**
 * Class description goes here.
 * 
 * @version 1.0 2013-11-29
 * @author xqwu
 */
public interface BaseDao {
	
	/**
	 * 
	 * 获得sqlSession对象.
	 * @author xqwu
	 * @date 2013-11-29 下午4:17:11
	 *
	 * @return
	 */
	public SqlSession getSqlSession() throws TypeException,SQLException,Exception;
	
	/**
	 * 
	 * 插入数据.
	 * @author xqwu
	 * @date 2013-12-6 上午09:56:00
	 *
	 * @param s
	 * @param obj
	 * @throws TypeException
	 * @throws SQLException
	 * @throws Exception
	 */
	public void insert(String s, Object obj) throws TypeException,SQLException,Exception;
	
	/**
	 * 
	 * 查询所有数据.
	 * @author xqwu
	 * @date 2013-11-29 下午3:52:21
	 *
	 * @return
	 */
	public List<?> findAll(String s, Object obj) throws TypeException,SQLException,Exception;
	
	/**
	 * 
	 * 查询指定页数大小.
	 * @author xqwu
	 * @date 2013-11-29 下午3:54:06
	 *
	 * @param s      namespace用于java代码调用时识别指定xml的mapper文件
	 * @param pageNo 页码
	 * @param pageSize 大小
	 * @return
	 */
	public List<?> findList(String s, Object obj, int pageNo, int pageSize) throws TypeException,SQLException,Exception;
	
	/**
	 * 
	 * 查询返回对象.
	 * @author xqwu
	 * @date 2013-12-2 下午02:58:41
	 *
	 * @param s
	 * @param param
	 * @return
	 */
	public Object selectOne(String s, Object param) throws TypeException,SQLException,Exception;
	
	/**
	 * 
	 * 更新数据方法.
	 * @author xqwu
	 * @date 2013-12-4 下午05:59:16
	 *
	 * @param s
	 * @param param
	 * @throws TypeException
	 * @throws SQLException
	 * @throws Exception
	 */
	public void update(String s, Object param) throws TypeException,SQLException,Exception;
}
  编写接口实现BaseDaoImpl
import java.sql.SQLException;
import java.util.List;

import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.type.TypeException;

import com.opro.ims.i.restservice.core.BaseDao;
import com.opro.ims.i.restservice.utils.SessionFactoryUtil;

/**
 * Dao基类,所有Dao都继承该类.
 * 
 * @version 1.0 2013-11-29
 * @author xqwu
 */
public class BaseDaoImpl implements BaseDao{

	@Override
	public SqlSession getSqlSession() throws TypeException,SQLException,Exception {
		// TODO Auto-generated method stub
		return SessionFactoryUtil.getSqlSessionFactory().openSession();
	}

	@Override
	public List<?> findAll(String s, Object obj) throws TypeException,SQLException,Exception {
		// TODO Auto-generated method stub
		SqlSession session = getSqlSession();
		try{
			List list = session.selectList(s, obj);
			return list;
		} finally{
			session.close();
		}
	}
	
	@Override
	public List<?> findList(String s, Object obj, int pageNo, int pageSize) throws TypeException,SQLException,Exception {
		// TODO Auto-generated method stub
		SqlSession session = getSqlSession();
		try{
			List list = session.selectList(s, obj, new RowBounds((pageNo-1)*pageSize, pageSize));
			return list;
		} finally{
			session.close();
		}
	}

	@Override
	public Object selectOne(String s, Object param) throws TypeException,SQLException,Exception {
		// TODO Auto-generated method stub
		SqlSession session = getSqlSession();
		try{
			Object object = session.selectOne(s, param);
			return object;
		} finally{
			session.close();
		}
	}

	@Override
	public void update(String s, Object param) throws TypeException,SQLException, Exception {
		// TODO Auto-generated method stub
		SqlSession session = getSqlSession();
		try{
			session.update(s, param);
			session.commit();
		} finally{
			session.close();
		}
	}

	/* (non-Javadoc)
	 * <p>Title: insert</p>
	 * <p>Description: </p>
	 * @param s
	 * @param obj
	 * @throws TypeException
	 * @throws SQLException
	 * @throws Exception
	 * @see com.opro.ims.i.restservice.core.BaseDao#insert(java.lang.String, java.lang.Object)
	 */
	@Override
	public void insert(String s, Object param) throws TypeException, SQLException, Exception {
		// TODO Auto-generated method stub
		SqlSession session = getSqlSession();
		try{
			session.insert(s, param);
			session.commit();
		} finally{
			session.close();
		}
	}
	
}
  在Dao层中调用示例

继承BaseDaoImpl后,写法就如此简单了

 

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.type.TypeException;

import com.opro.ims.i.restservice.core.impl.BaseDaoImpl;

/**
 * 检索报警数据Dao.
 * 
 * @version 1.0 2013-12-5
 * @author xqwu
 */
public class RetrieveWarningsDao extends BaseDaoImpl{
	@SuppressWarnings("unchecked")
	public List retrieveWarnings(Map param, int pageNo, int pageSize) throws TypeException,SQLException,Exception{
		return findList("retrievewarnings.retrieveWarnings", param, pageNo, pageSize);
	}
}

 

最后我把对应的MyBatis中文API分享给大家。

 


    
[3] Git 常用命令拾掇(转)
    来源: 互联网  发布时间: 2014-02-18
Git 常用命令整理(转)
初始化配置
C代码  
  • #配置使用git仓库的人员姓名  
  • git config --global user.name "Your Name Comes Here"  
  •   
  • #配置使用git仓库的人员email  
  • git config --global user.email you@yourdomain.example.com  
  •   
  • #配置到缓存 默认15分钟  
  • git config --global credential.helper cache   
  •   
  • #修改缓存时间  
  • git config --global credential.helper 'cache --timeout=3600'    
  •   
  • git config --global color.ui true  
  • git config --global alias.co checkout  
  • git config --global alias.ci commit  
  • git config --global alias.st status  
  • git config --global alias.br branch  
  • git config --global core.editor "mate -w"    # 设置Editor使用textmate  
  • git config -1 #列举所有配置  
  •   
  • #用户的git配置文件~/.gitconfig  
  •   
    查看、添加、提交、删除、找回,重置修改文件
    C代码  
  • git help <command>  # 显示command的help  
  • git show            # 显示某次提交的内容  
  • git show $id  
  •    
  • git co  -- <file>   # 抛弃工作区修改  
  • git co  .           # 抛弃工作区修改  
  •    
  • git add <file>      # 将工作文件修改提交到本地暂存区  
  • git add .           # 将所有修改过的工作文件提交暂存区  
  •    
  • git rm <file>       # 从版本库中删除文件  
  • git rm <file> --cached  # 从版本库中删除文件,但不删除文件  
  •    
  • git reset <file>    # 从暂存区恢复到工作文件  
  • git reset -- .      # 从暂存区恢复到工作文件  
  • git reset --hard    # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改  
  •    
  • git ci <file>  
  • git ci .  
  • git ci -a           # 将git add, git rm和git ci等操作都合并在一起做  
  • git ci -am "some comments"  
  • git ci --amend      # 修改最后一次提交记录  
  •    
  • git revert <$id>    # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象  
  • git revert HEAD     # 恢复最后一次提交的状态  
  •   查看文件diff
    C代码  
  • git diff <file>     # 比较当前文件和暂存区文件差异  
  • git diff  
  • git diff <$id1> <$id2>   # 比较两次提交之间的差异  
  • git diff <branch1>..<branch2> # 在两个分支之间比较  
  • git diff --staged   # 比较暂存区和版本库差异  
  • git diff --cached   # 比较暂存区和版本库差异  
  • git diff --stat     # 仅仅比较统计信息  
  •   
    查看提交记录
    C代码  
  • git log  
  • git log <file>      # 查看该文件每次提交记录  
  • git log -p <file>   # 查看每次详细修改内容的diff  
  • git log -p -2       # 查看最近两次详细修改内容的diff  
  • git log --stat      #查看提交统计信息  
  •  

     tig

    Mac上可以使用tig代替diff和log,brew install tig

     

    取得Git仓库
    C代码  
  • #初始化一个版本仓库  
  • git init  
  •   
  • #Clone远程版本库  
  • git clone git@xbc.me:wordpress.git  
  •   
  • #添加远程版本库origin,语法为 git remote add [shortname] [url]  
  • git remote add origin git@xbc.me:wordpress.git  
  •   
  • #查看远程仓库  
  • git remote -v  
  •  

    提交你的修改
    C代码  
  • #添加当前修改的文件到暂存区  
  • git add .  
  •   
  • #如果你自动追踪文件,包括你已经手动删除的,状态为Deleted的文件  
  • git add -u  
  •   
  • #提交你的修改  
  • git commit –m "你的注释"  
  •   
  • #推送你的更新到远程服务器,语法为 git push [远程名] [本地分支]:[远程分支]  
  • git push origin master  
  •   
  • #查看文件状态  
  • git status  
  •   
  • #跟踪新文件  
  • git add readme.txt  
  •   
  • #从当前跟踪列表移除文件,并完全删除  
  • git rm readme.txt  
  •   
  • #仅在暂存区删除,保留文件在当前目录,不再跟踪  
  • git rm –cached readme.txt  
  •   
  • #重命名文件  
  • git mv reademe.txt readme  
  •   
  • #查看提交的历史记录  
  • git log  
  •   
  • #修改最后一次提交注释的,利用–amend参数  
  • git commit --amend  
  •   
  • #忘记提交某些修改,下面的三条命令只会得到一个提交。  
  • git commit –m &quot;add readme.txt&quot;  
  • git add readme_forgotten  
  • git commit –amend  
  •   
  • #假设你已经使用git add .,将修改过的文件a、b加到暂存区  
  •   
  • #现在你只想提交a文件,不想提交b文件,应该这样  
  • git reset HEAD b  
  •   
  • #取消对文件的修改  
  • git checkout –- readme.txt  
  •   查看、切换、创建和删除分支
    C代码  
  • git br -r           # 查看远程分支  
  • git br <new_branch> # 创建新的分支  
  • git br -v           # 查看各个分支最后提交信息  
  • git br --merged     # 查看已经被合并到当前分支的分支  
  • git br --no-merged  # 查看尚未被合并到当前分支的分支  
  •    
  • git co <branch>     # 切换到某个分支  
  • git co -b <new_branch> # 创建新的分支,并且切换过去  
  • git co -b <new_branch> <branch>  # 基于branch创建新的new_branch  
  •    
  • git co $id          # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除  
  • git co $id -b <new_branch>  # 把某次历史提交记录checkout出来,创建成一个分支  
  •    
  • git br -d <branch>  # 删除某个分支  
  • git br -D <branch>  # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)  
  •   分支合并和rebase
    C代码  
  • git merge <branch>               # 将branch分支合并到当前分支  
  • git merge origin/master --no-ff  # 不要Fast-Foward合并,这样可以生成merge提交  
  •    
  • git rebase master <branch>       # 将master rebase到branch,相当于:  
  • git co <branch> && git rebase master && git co master && git merge <branch>  
  •   Git补丁管理(方便在多台机器上开发同步时用)
    C代码  
  • git diff > ../sync.patch         # 生成补丁  
  • git apply ../sync.patch          # 打补丁  
  • git apply --check ../sync.patch  #测试补丁能否成功  
  •   Git暂存管理
    C代码  
  • git stash                        # 暂存  
  • git stash list                   # 列所有stash  
  • git stash apply                  # 恢复暂存的内容  
  • git stash drop                   # 删除暂存区  
  •   Git远程分支管理
    C代码  
  • git pull                         # 抓取远程仓库所有分支更新并合并到本地  
  • git pull --no-ff                 # 抓取远程仓库所有分支更新并合并到本地,不要快进合并  
  • git fetch origin                 # 抓取远程仓库更新  
  • git merge origin/master          # 将远程主分支合并到本地当前分支  
  • git co --track origin/branch     # 跟踪某个远程分支创建相应的本地分支  
  • git co -b <local_branch> origin/<remote_branch>  # 基于远程分支创建本地分支,功能同上  
  •    
  • git push                         # push所有分支  
  • git push origin master           # 将本地主分支推到远程主分支  
  • git push -u origin master        # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)  
  • git push origin <local_branch>   # 创建远程分支, origin是远程仓库名  
  • git push origin <local_branch>:<remote_branch>  # 创建远程分支  
  • git push origin :<remote_branch>  #先删除本地分支(git br -d <branch>),然后再push删除远程分支  
  •  
    基本的分支管理
    C代码  
  • #创建一个分支  
  • git branch iss53  
  •   
  • #切换工作目录到iss53  
  • git chekcout iss53  
  •   
  • #将上面的命令合在一起,创建iss53分支并切换到iss53  
  • git chekcout –b iss53  
  •   
  • #合并iss53分支,当前工作目录为master  
  • git merge iss53  
  •   
  • #合并完成后,没有出现冲突,删除iss53分支  
  • git branch –d iss53  
  •   
  • #拉去远程仓库的数据,语法为 git fetch [remote-name]  
  • git fetch  
  •   
  • #fetch 会拉去最新的远程仓库数据,但不会自动到当前目录下,要自动合并  
  • git pull  
  •   
  • #查看远程仓库的信息  
  • git remote show origin  
  •   
  • #建立本地的dev分支追踪远程仓库的develop分支  
  • git checkout –b dev origin/develop  
  •  
    Git远程仓库管理
    C代码  
  • git remote -v                    # 查看远程服务器地址和仓库名称  
  • git remote show origin           # 查看远程服务器仓库状态  
  • git remote add origin git@ github:robbin/robbin_site.git         # 添加远程仓库地址  
  • git remote set-url origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址)  
  • git remote rm <repository>       # 删除远程仓库  
  •   创建远程仓库
    C代码  
  • git clone --bare robbin_site robbin_site.git  # 用带版本的项目创建纯版本仓库  
  • scp -r my_project.git git@ git.csdn.net:~      # 将纯仓库上传到服务器上  
  •    
  • mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库  
  • git remote add origin git@ github.com:robbin/robbin_site.git    # 设置远程仓库地址  
  • git push -u origin master                                      # 客户端首次提交  
  • git push -u origin develop  # 首次将本地develop分支提交到远程develop分支,并且track  
  •    
  • git remote set-head origin master   # 设置远程仓库的HEAD指向master分支  
  •  
    也可以命令设置跟踪远程库和本地库
    C代码  
  • git branch --set-upstream master origin/master  
  • git branch --set-upstream develop origin/develop  
  •  

    参考资料

    远程仓库的使用

    何谓分支

    基本的分支与合并

    分支的管理

    分支式工作流程

    远程分支

    衍合

     

    参考1: http://www.xbc.me/git-commands/

    参考2: http://neverno.me/hello-world/git-commands-github.html

     

    在线中文图书: 1. Git Magic  2. Pro Git        


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3