git & tsocks

sudo apt-get install git-all

获取简短帮助:

.e.g
git init -h


获取帮助

git help <verb>
git <verb> --help
man git-<verb>

 

git config

git config --list 列出所有的配置信息

git config --global user.name 'xx'

git config --global user.email 'xxx'

git config --global core.editor vim

git config --global merge.tool vimdiff

 

使用git管理的仓库中:有些文件无需纳入git的管理,同时也不希望出现在未跟踪列表中,此时需要使用  .gitignore  文件,其中列出了所有要忽略的文件。

文件  .gitignore  的格式规范如下:

1、所有空行或者以注释符号 # 开头的行都会被 git 忽略;

2、可以使用标准的  glob 模式匹配;

3、匹配模式最后跟反斜杠/ 说明要忽略的是目录;

4、要忽略指定模式以外的文件或目录,可以在模式前加 !取反。

 

git status 查看状态

gitk 查看图形化分支信息

git whatchanged -p master..check_name 查看修改记录

查看 .git目录所在的位置

git rev-parse --git-dir

git rev-parse  --show-toplevel
//显示工作区根目录
 

 

git clone

git clone project_path loca_path
//git clone 是根据远端所处的分支来决定克隆哪个分支,而非所有分支

 

git fetch

git fetch [remote-name]
//将remote-name仓库下的所有分支都下载到本地(注意是所有分支)

git fetch path_dir master:check_name
//从path_dir目录下的master分支下载objects和refs到本地的check_name分支中去

git fetch <options> <repository> <refspec>
//<repository> 表示远端的仓库路径
//<refspec> 的标准格式是 <src>:<dst>,<src>表示源分支,如果<dst>不为空,则表示本地的分支;如果为空,则使用当前分支

 

git add

git add [define_remote-name] [url]                                              
//添加远程仓库,仅仅是添加了仓库名字,仓库的内容并未取下放到本地

git add -u
//将工作区文件的变更(修改、删除)全部记录到暂存区中

git add -A
//将工作区的所有改动及新增文件添加到暂存区。

 

git pull

git pull
//由于git clone时已经记住了远端分支,因此合并该远端分支到本地当前分支

git pull remote_dir                                                             
//合并远端的当前分支到本地的当前分支

git pull remote_dir local_check
//合并远端的当前分支到本地分支合并

git pull remote_dir src:local_check
//合并远端的src分支到本地分支合并

git pull . check_name
//合并本地的check_name 到本地当前分支                                           

 

git push

git push origin serverfix:awesomebranch
//origin记录了远程分支的地址,即将本地的serverfix推送到远程origin/awesomebranch

git push  origin:serverfix
//删除服务器上的分支origin:serverfix(服务器上的数据被删除了)

 

git commit

git commit --amend
//将使用当前的暂存区域快照提交,并修改上一次提交日志

git commit -a
可以直接提交所有修改,但是commit -a无法把新增加的文件或文件夹加入进来

git commit -a -s

 

git branch

git branch branch_name
//根据commit来建立新分支,而非working tree 或 index files

git branch -v
//查看各个分支最后一次commit信息

git branch -d expermental
//只有将experimental已合并到主分支之后,才能删除

git branch -D expermental
//无论experimental是否已合并到主分支,都进行删除

git branch --merge
//查看哪些分支已经与当前分支合并

git branch --no-merge
//查看哪些分支未与当前分支合并

 

git checkout

git checkout -- filename[s]                                                     
//从 index 中提取文件到 working tree                                            
                                                                                
git checkout HEAD -- filename[s]                                                
//从 repository 中提取文件到 index 和 working tree 中

 

git reset

git reset --soft HEAD^
//恢复到上一次commit的代码。--soft表示不改动 index files 和 working tree中的内容。

git reset -- filename[s]
//从index中删除一个已登记的文件;比如刚刚git add了一个文件到index file里,但突然意识到错误,此时就需要git rest --

git reset --hard HEAD //--hard表示将working tree 和 index files 都撤销到当前仓库的状态 git reset HEAD filename[s]
git reset --mixed HEAD filename[s] //表示只撤销commit和index,只保留working files

 

删除文件

git rm filename
//只删除 working tree 和 index files 中的 filename 
//git rm log/*.log  只删除 log目录下的.log文件
//git rm log/\*.log 删除log目录下的所有.log文件(包括子目录)

git rm --cached filename
//只删除 index files 中的 filename
//如何删除 repository中的文件, 当index 中文件被删除时,提交后则仓库中的文件无效,此时再执行 git gc

git clean -nd
//查看working tree中哪些文件是不存在于index files中的

git clean -fd
//
查看working tree中哪些文件是不存在于index files中的,并将多出的文件删除

 

移动文件

git 中移动文件
例如想执行: mv file_from file_to 
方法一:
mv file_from file_to
git rm file_from
git add file_to
方法二:
git mv file_from file_to

 

 git diff

git diff
//查看working tree 和 index file的区别,只比较在index 中存在相应文件名的文件

git diff --cached
//查看 index file 和 repository的区别,无论文件名是否记录在repository中,都比较

git diff HEAD
//查看working tree 和 repository的区别
git diff --check //把可能的多余空白字符列出来

 

git log

git log --graph --pretty=oneline
//查看提交历史简图

git log -3 --pretty=online
//显示最近的3条日志

git log master..experiment //所有可从experiment分支中获得且不能从master分支中获得的提交 //git log origin/master..HEAD git log refA refB ^refC git log refA refB --not refC //所有从refA或refB包含的但是不被refC包含的提交 git log --left-right master...experiment //查看master或者experiment中包含的但不是两者共有的引用

git log --since="2 weeks ago"
显示2周前到现在的所有历史记录。具体语法可以查询git-ref-parse命令的帮助文件
git log 用法 --graph 显示分支及合并情况 --stat 显示每次更新的文件修改统计信息。 --shortstat 只显示 --stat 中最后的行数修改添加移除统计。 --name-only 仅在提交信息后显示已修改的文件清单。 --name-status 显示新增、修改、删除的文件清单。 --abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 -p 按补丁格式显示每个commit之间的差异 -p -2 按补丁格式显示最近两个commit之间的差异 --pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 --pretty=oneline 每个commit只显示一行 --pretty=format:"xxxxx" format格式化显示记录: %H 提交对象(commit)的完整SH1 %h 提交对象(commit)的简短SH1 %T 提交对象(tree)的完整SH1 %t 提交对象(tree)的简短SH1 %P 父对象的完整SH1 %p 父对象的简短SH1 %an author name %ae author email %ad author修订日期(可以用-date=选项定制格式) %ar author修订日期,按多久以前的方式显示 %cn committer name %ce committer email %cd 提交日期 %cr 提交日期,按多久以前的方式显示 %s 提交说明 -(n) 仅显示最近的 n 条提交 --since, --after 仅显示指定时间之后的提交。 --until, --before 仅显示指定时间之前的提交。 --author 仅显示指定作者相关的提交。 --committer 仅显示指定提交者相关的提交。

log信息查询:


git log \
        --since=“July 7, 2014” \
        --grep=“look for this” \
        --author=who@email.domain \
        --pretty=oneline \
        <some-branch> -- include/*.c
 

 

git remote

git remote
//列出所有远程库的名字

git remote -v 
//显示地址
                                                                                
git remote show remote_name
//查看远程仓库的详细信息
                                                                                
git remote rename org_name new_name 
//重命名远端仓库名称 
                                                                                
git remote rm name 
//删除远端仓库路径

 

跟踪远程分支

git checkout -b serverfix  origin/serverfix
//以远程origin/serverfix在本地的仓库为基础,新建本地分支 serverfix,此时本地的serverfix亦称跟踪分支(tracking branch),在此分支下运行git push,将自动的推送到远程的origin/serverfix分支

 

git merge

git merge experimenatl
//将experimental与master合并(事前需commit experimental 分支,事后需commit master分支)
//使用 git merge的前提是两个分支都处于commit状态

git merge branch_name remote_name/remote_branch_name
//将远端remote_name在本地的库remote_branch_name合并到本地的branch_name

 

git rebase

永远不要衍合那些已经推送到公共仓库的更新。如果把衍合当成一种在推送之前清理提交历史的手段,而且仅仅衍合那些永远不会公开的commit,那就不会有任何问题。如果衍合那些已经公开的 commit,而与此同时其他人已经用这些 commit 进行了后续的开发工作,那你有得麻烦了。

git rebase master
//将当前分支衍合到master分支

git rebase branch_one branch_two
//先检出分支branch_two,再将branch_two分支衍合到branch_one分支

git rease --onto branch_one branch_two branch_three
//检出branch_three分支,找出branch_three和branch_two分支的共同祖先,并找出branch_three在此祖先上的变化,然后把他们在branch_one上重演一遍

 

空白提交

如果没有对工作区的文件进行任何修改,GIt 默认是不会执行提交的,使用 --allow-empty参数后允许执行空白提交:
git init
git commit --allow-empty -m "blank commit"

 

建立纯仓库

方法一:
1、git clone --bare path_dir  repository_name.git
2、然后把 repository_name.git 放到服务器上                                      

方法二:
1、在服务器上新建一个目录,在该目录下执行
git --bare init

2、在本地添加该远程仓库,使用
git remote add reomte_name url

3、将本地当前分支推送到远端
git push remote_name  local_branch_name 

 

可以使用git show再加上commit名称来显示详细的commit信息;
每一个commit都会有 "parent commit",可以使用^表示parent:
   git show HEAD^ 查看HEAD的父母的信息
   git show HEAD^^ 查看HEAD的父母的父母的信息
   git show HEDA~4 查看HEAD上溯4代的信息
   由于git-merge会产生双父母,因此:
   git show HEAD^1  查看HEAD的第一个父母
   git show HEAD^2  查看HEAD的第二个父母

   git show <commit>:<file>  > new_name
   //检出某文件的历史版本到其它文件名

 

 

所有的对象信息都存储在.git/objects/目录下,这些对象都经过压缩,其类型可以是blob, tree, commit或tag,其中包括了对象长度、对象类型和对象内容。
git cat-file -t 241e
查看241e的对象类型

git cat-file commit 241e
此处的commit表示要查询的是一个对象类型为commit的对象,后面给出对象的ID

tree的ID表示了一个BLOB对象,此对象对应着一个文件或另一个tree。可以使用ls-tree命令来查询关于这个tree的更详细信息:
git ls-tree 9a327
假定9a327这颗树上挂了一个file.txt的文件,其ID为7d4e0f,且通过git cat-file -t 7d4e0f发现其为blob,则可以通过
git cat-file blob 7d4e0f
查看该blob的内容

索引文件就是 .git/index 文件,它是二进制的文件,可以用ls-files来查看它的内容。
git ls-files --stage

 

AA目录下建立了BB目录和CC目录。
BB 目录下建立了git仓库,AA目录下也建立了git仓库。
如果将BB目录下的内容做了更改,那么只有在BB目录下的git仓库已经commit后,才能在AA目录下将BB目录使用git add添加到AA目录下的git仓库,而后才能提交。

HEAD:表示最近一次的commit
FETCH_HEAD:使用git-fetch获得的object和ref的信息都存储在这里,这些信息是为日后git-merge准备的

Tag a commit
    git tag some-name
    git tag –f some-name
    git tag another-name b4e0bebe...
List existing tags
    git tag –l
Remove a tag
    git tag –d some name

可以给复杂名称起个别名 
git tag V3 5b888
可以使用V3来代替复杂的名称

git branch stable V3
建立一个基于V3的分支

git fsck 检查仓库的错误

 

git tag

列显已有的标签
  git tag
新建标签
轻量级的(lightweight)和含附注的(annotated)
轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证
含附注的标签
  git tag -a v1.4 -m 'my version 1.4'
签署标签
  git tag -s v1.5 -m 'my signed 1.5 tag'
轻量级标签
  git tag v1.4-lw
验证标签
  git tag -v [tag-name]
后期加注标签
  git tag -a v1.2 9fceb02
分享标签
  git push origin [tagname]
  git push origin --tags  一次推送所有(本地新增的)标签

 

 

在软件开发过程中发现Bug,并定位到具体的代码时,Git文件的追朔命令可以指出是谁在什么时候,以及什么版本引入了此Bug。当针对文件执行git blame命令时,就会逐行显示文件,在每一行的行首显示此行最早是在什么版本引入的。
git blame README.txt
如果只想看某几行,使用-L n,m参数,如:
git blame -L 6,+5 README.txt

谁修改了文件

git blame <filename>

 

git prune
git clean
git bisect 二分查找定位问题 git cherry
-pick 重演 git rebase 对于已提交到服务器器部分的提交,不要执行rebase

 

AA目录下建立了BB目录和CC目录。
BB 目录下建立了git仓库,AA目录下也建立了git仓库。
如果将BB目录下的内容做了更改,那么只有在BB目录下的git仓库已经commit后,才能在AA目录下将BB目录使用git add添加到AA目录下的git仓库,而后才能提交。

 

参考自:http://smilejay.com/2012/02/tsocks_git_repository/  (这个博客可能是 I 公司员工的)

sudo apt-get install tsocks

sudo vim /etc/tsocks.conf ====>

server = 10.7.211.16

tsocks git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

 

 

Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,分布式版本控制系统中,每一个工作目录都包含一个完整仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器上。

因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git project组成,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,使得Git的使用更加简单。

1、Git的安装(步骤1)
在Ubuntu 8.04上安装git只要设定了正确的更新源,然后使用apt-get就可以了,有什么依赖问题,就让它自己解决吧。其中crul是一个利用URL语法在命令行下工作的文件传输工具,会在后面安装Repo的时候用到。
sudo apt-get install git-core curl
2、安装Repo(步聚2) 首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它(~/bin)加到PATH环境变量中 接下来通过crul来下载Repo脚本,保存到~/bin/repo文件中 curl http://android.git.kernel.org/repo >~/bin/repo 别忘了给repo可执行权限 chmod a+x ~/bin/repo 3、初始化版本库 如果是想把Android当前主线上最新版本的所有的sourcecode拿下来,我们需要repo的帮助。 先建立一个目录,比如~/android,进去以后用repo init命令即可。 repo init -u git://android.git.kernel.org/platform/manifest.git 具体要多少时间就取决于网络条件了,我只用了2、3分钟的样子。 最后会看到 repo initialized in /android这样的提示,就说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode。(步骤3) 如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如: repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
在repo init时带上 -b 分支名称 比如要拿某个1.6分支的: repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.6_r2 repo sync 分支信息在后面 另一种情况是,我们只需要某一个project的代码,比如kernel/common,就不需要repo了,直接用Git即可。 git clone git://android.git.kernel.org/kernel/common.git 这也需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。 如果需要某个branch的代码,用git checkout即可。比如我们刚刚拿了kernel/common.git的代码,那就先进入到common目录,然后用下面的命令: git checkout origin/android-goldfish-2.6.27 -b goldfish 这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。我们可以通过git branch来列出本地的所有分支。 4、同步版本库 使用repo sync命令,我们把整个Android代码树做同步到本地,同样,我们可以用类似 repo sync project1 project2 … 这样的命令来同步某几个项目 我进入~/android后使用命令 repo sync 命令完成源码的下载,这是时间最长的,建议在晚上下班之后下载。(步聚4) 如果是同步Android中的单个项目,只要在项目目录下执行简单的 git pull 即可。

 

 最好不要使用  git revert

使用 git revert时,实际上当前的提交仍然存在,新生成的提交与原来的提交没有多大区别,只是提交号不同。

“git-revert” generates new commits using previous commits

 

 2014/12/12

git commit -a -s

 

 

 

 

posted on 2013-01-16 19:27  阿加  阅读(662)  评论(0编辑  收藏  举报

导航