Git是Linux之父Linus开发的分布式代码管理工具,也是目前最流行的开源代码管理工具。许多开源项目,包括
Linux,U-Boot等等都在使用Git进行代码管理。
1.Git安装
Ubuntu下直接在shell下面运行:
sudo apt-get install gitWindows下直接去下面网站下载msysgit(包含一个命令行界面和一个GUI界面): http://code.google.com/p/msysgit/downloads/2.Git使用帮助
2.1所有支持的命令
git help
对于某个命令,例如configgit help configgit config --help注意:git支持TAB键补全,包括命令和变量。对Linux用户,如果该功能没打开,可以在~/.bashrc中加入:# Enable Git command auto-completion
source /etc/bash_completion.d/git
然后在shell中重新执行bash命令。
2.2 提交ID或者各种标签(HEAD,tag, stash@{n},branch名称等等,本质上都是提交ID)的后缀
^或者^1或者~或者~1:当前提交的第一个父提交
^2:当前提交的第2个父提交,如果该提交有多个父提交(merge或者stash(工作进度暂存)引起的)^^或者~2:当前提交的第一个父提交的第一个父提交^2^或者^2^1:当前提交的第2个父提交的第一个父提交^{}或者^{commit}:当前提交的提交ID^{tree}:当前提交的树ID范围形参数的表示方法:rev1..rev22.3 diff结果阅读
结果:
diff --git a/src/test.txt b/src/test.txtindex ff0303a..3ccac05 100644--- a/src/test.txt +++ b/src/test.txt@@ -1,3 +1,3 @@+modified-orign+tested解释:--- a/src/test.txt :原始文件(以---开头) +++ b/src/test.txt :目标文件(以+++开头) @@ -1,3 +1,3 @@ :当前差异块的比较对象为原始文件的第1行开始的3行与目标文件的地1行开始的3行-orign :只存在于原始文件(以-开头) +modified :只存在于目标文件(以+开头) 以空格开头 : 同时存在于原始文件和目标文件2.4 merge结果阅读
<<<<<<<
当前分支=======待合并的分支>>>>>>>3.Git配置(可选)
git config -l 显示所有用户配置
git config --global user.name 用户姓名git config --global user.email 用户邮箱git config --global color.ui auto
git config --global merge.tool kdiff3
git config --global diff.external kdiff3git config --global core.editor vimgit config --global --unset xxxxx
4.创建数据库(服务器上)
建立一个用于提交代码的共享数据库,在服务器上没有本地文件
git init --bare --shared=all 项目名称(xxx.git)5.克隆一个本地分支
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
6.日常用法
6.1 显示状态
详细信息(包括本地分支和远程分支的关系等等,如果领先远程分支,可用git cherry获取未push到远程分支
的本地提交;如果落后,则需执行git pull)git status简单信息git status -sb6.2 把代码加入到暂存区
指定文件或者目录加入到暂存区
git add 目录或者文件名工作区中所有改动和增删文件(包括untracked文件,可以新增文件)加入到暂存git add -A更新工作区中所有tracked文件的改动到和删除到暂存区git add -u交互式git add -i 目录或者文件名patch模式添加文件git add -p 目录或者文件名6.3 从暂存区提交到本地数据库
git commit -m 注释
或者启动默认编辑器编辑注释git commit 追加或者更改上一次提交的注释git commit -amend重用某次提交的注释git commit -C 提交ID或者标签跳过add命令直接提交代码(修改不经过暂存区,无确认过程,轻度危险,尽量不要使用)git commit -a无代码修改提交(通常用于创建代码仓库后的第一个提交)
git commit --allow-empty
6.4 文件操作
删除某个文件
git rm 文件名或者目录名移动或者更名文件
git mv汇总显示工作区、暂存区与HEAD差异
git checkout 用暂存区内容覆盖工作区(危险,可在后面加上 > xxx 另存到其他文件)git checkout 文件名用指定提交的文件替换暂存区和工作区内容(危险,可在后面加上 > xxx 另存到其他文件)git checkout 提交ID或者标签 文件名替换所有本地文件(极度危险)git checkout .6.5 显示修改记录
6.5.1 整个数据库的修改记录
git log
图形化显示并跟踪修改(显示当前提交ID,目录树ID和父提交ID(可能会有多个父提交))git log --pretty=raw --graph单行图形化显示git log --graph --oneline显示数据库内文件移动复制记录git log -C -C -l -p 显示所有提交修改概要git log --stat显示详细信息git log --pretty=fuller显示指定提交修改概要git show 提交ID或者标签 --stat6.5.2 某个文件修改记录
git blame -L 起始行,结束行 文件名
git blame -L 起始行,+行数 文件名文件内移动复制记录git blame -M 文件名6.6 比较
比较工作区与暂存区中的文件
git diff 文件名 比较工作区与某个提交git diff 提交ID或者标签 文件名比较暂存区与某个提交中文件git diff --cached 提交ID或者标签比较2个版本(不加文件名表示比较所有文件)git diff 提交ID或者标签 提交ID或者标签 文件名生成patch提交后:git diff -c -p HEAD^ > patch_xxx.txt提交前:git diff -c -p HEAD > patch_xxx.txt逐字比较(默认逐行)git diff --word-diff 文件名 使用外部比较git --ext-diff 文件名6.7 保存和恢复工作进度
保存暂存区河工作区中的tracked文件
git stash保存暂存区河工作区中的tracked文件并包括注释git stash save “xxxxx”查看工作进度缓存git stash list查看某个缓存的内容
git stash show stash@{进度ID}
恢复工作进度
git stash pop stash@{进度ID}git stash apply stash@{进度ID}清除工作进度git stash clear6.8 数据库交互
从远程仓库获取分支信息和修改但不合并
git fecth
从服务器取数据并合并到本地数据库
git pull 提交某个分支代码到服务器数据库git push origin 分支名称或者tag名称6.9 patch操作
生成summary,为每个提交生成一个detail patch,并签名
git format-patch --cover-letter -s 起始提交ID或者标签..结束提交ID或者标签应用patchpatch -p1 < xxx.patch7.分支操作(可选)
显示所有分支和当前工作分支详细信息(名字,修改记录,提交ID)
git branch -v从某个提交创建分支并切换到新分支(主分支可用来跟服务器同步)git checkout -b 分支名称 提交ID或者标签(可省略,默认为HEAD)切换分支git checkout 分支名称rebase当前分支git rebase --onto master 当前分支从其他分支merge到当前分支git merge 其他分支出现merge冲突后对启动图形界面git mergetool 文件名(可选)删除分支(分支必须先merge到其他分支,否则失败)git branch -d 欲删除分支强制删除分支(不检查分支已是否merge到其他分支)git branch -D 欲删除分支重命名分支git branch -m 新名称 查看远程分支git branch -r -v建立远程分支
git push -u origin <本地分支>
8. 版本库查看
显示暂存区(最新提交)中的文件
git ls-files显示指定提交中的文件git ls-files --with-tree=提交ID或者标签显示版本库目录树git ls-tree -l -r -t 提交ID或者标签显示暂存区目录树git write-tree | xargs git ls-tree -l -r -t 查看目录树中某个对象的内容(blob对象存放文件内容)git cat-file -p 对象ID 或者 (对象类型包括commit, tree,tag or blob)git cat-file 对象类型 对象ID 查看某个命名版本中(例如分支名称或者HEAD)某个对象的内容git cat-file blob HEAD:文件路径查看某个分支或者某次提交的commitIDgit rev-parse 提交ID或者标签9.版本库操作(小心使用)
首先执行下面命令确保分支日志功能打开
git config core.logAllRefUpdates不更新HEAD指针仅用目的版本的某个文件内容替换暂存区中的文件git reset 提交ID或者标签(HEAD^, HEAD~1等等) 文件路径将HEAD指针回溯到某个历史提交git reset --soft 提交ID或者标签(HEAD^, HEAD~1等等)将HEAD指针回溯到某个历史提交并用目的提交的内容替换暂存区内容git reset 提交ID或者标签(HEAD^, HEAD~1等等)或者git reset --mixed 提交ID或者标签(HEAD^, HEAD~1等等)将HEAD指针回溯到某个历史提交并用目的提交的内容更新暂存区和工作区git reset --hard 提交ID或者标签(HEAD^, HEAD~1等等)显示版本操作日志git reflog show逆向恢复到某次操作后的状态(例如倒数第3次)git reset master@{2}10.分离头模式查看历史版本
checkout某个历史版本用以查看内容、测试和提交
(当前分支和HEAD指针指向不同的引用git rev-parse查看,切换回当前分支后HEAD指针恢复)git checkout 提交ID或者其他代号(HEAD^, HEAD~1等等)查看在分离头模式中做的修改git show 提交IDmerge到当前分支git merge 提交ID11.标签tag
打标签
git tag -m "xxxx" tag名称打签名标签(GnuPG签名,包括创建时间、创建者等等,可用git tag -v验证,签名可用gpg --gen-key生成)git tag -m "xxxx" tag名称删除git tag -d tag名称显示当前标签(输出可用作版本号)git describe查看所有taggit tag -n查看某个taggit show tag名称或者git cat-file tag tag名称显示带标签的日志git log --oneline --decorate更新到远程服务器git push orign tag名称查看远程服务器的taggit ls-remote origin删除远程服务器上的taggit push orign :tag名称12.二分法查找错误提交
开始
git bisect start 标志坏提交git bisect bad 提交ID标志好提交git bisect good 提交ID查看loggit bisect log13.删除错误提交
13.1 cherry-pick方式
13.1.1 checkout错误提交的前一个提交
git checkout 错误提交ID或者其他代号^
13.1.2 找出所有需要的版本
git cherry-pick 提交ID或者其他代号
13.1.3 重置版本树到最近一次提交(修改后的)
git checkout 当前分支名称
git reset --hard HEAD@{1}13.2 rebase方式
13.2.1.手动模式
git rebase --onto <newbase> <since> <till(不写则为HEAD)>
该命令执行过程: 1.用checkout切换到<till> 2.将 <since>和<till(不写则为HEAD)>之间的提交(不包括<since>)写入临时文件 3.当前分支强制重置(reset --hard)到<newbase> 4.将临时文件中的提交逐一顺序提交到<newbase> 5.遇到已存在的提交则跳过,遇到冲突则暂停。手动解决冲突后,用git rebase --continue继续, 也可以不解决冲突直接git rebase --skip跳过或者git rebase --abort终止本次rebase操作。执行完rebase命令后重复13.1.3重置版本树即可。13.2.2 交互模式
git rebase -i <newbase>
13.3 重置本次操作
git reset --hard 原始版本最后一次提交ID
14.其他命令
查看所有引用
git show-ref从某个提交新建一个版本树(丢掉以前记录)echo “提交注释” | git commit-tree 提交ID或者标签^{tree}git rebase --onto 前1条命令返回的提交ID 提交ID或者标签 当前分支名称回退某个提交git revert 提交ID或者标签清除工作区中的untracked文件git clean -fd
打包
git archive -o xxx.zip 提交ID或者标签git archive -o xxx.tar 提交ID或者标签git archive -o xxx.tar.gz 提交ID或者标签更改远程数据源地址git remote set-url origin <URL>显示远程数据源地址git remote show origin忽略文件添加忽略文件名到.git/info/exclude