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