Git是Linux之父Linus开发的分布式代码管理工具,也是目前最流行的开源代码管理工具。许多开源项目,包括
Linux,U-Boot等等都在使用Git进行代码管理。
1.Git安装
Ubuntu下直接在shell下面运行:
sudo apt-get install git
Windows下直接去下面网站下载msysgit(包含一个命令行界面和一个GUI界面):
http://code.google.com/p/msysgit/downloads/
2.Git使用帮助
2.1所有支持的命令
git help
对于某个命令,例如config
git help config
git 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..rev2
2.3 diff结果阅读
结果:
diff --git a/src/test.txt b/src/test.txt
index 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 kdiff3
git config --global core.editor vim
git 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 -sb
6.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或者标签 --stat
6.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 clear
6.8 数据库交互
从远程仓库获取分支信息和修改但不合并
git fecth
从服务器取数据并合并到本地数据库
git pull
提交某个分支代码到服务器数据库
git push origin 分支名称或者tag名称
6.9 patch操作
生成summary,为每个提交生成一个detail patch,并签名
git format-patch --cover-letter -s 起始提交ID或者标签..结束提交ID或者标签
应用patch
patch -p1 < xxx.patch
7.分支操作(可选)
显示所有分支和当前工作分支详细信息(名字,修改记录,提交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:文件路径
查看某个分支或者某次提交的commitID
git 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 提交ID
merge到当前分支
git merge 提交ID
11.标签tag
打标签
git tag -m "xxxx" tag名称
打签名标签(GnuPG签名,包括创建时间、创建者等等,可用git tag -v验证,签名可用gpg --gen-key生成)
git tag -m "xxxx" tag名称
删除
git tag -d tag名称
显示当前标签(输出可用作版本号)
git describe
查看所有tag
git tag -n
查看某个tag
git show tag名称
或者
git cat-file tag tag名称
显示带标签的日志
git log --oneline --decorate
更新到远程服务器
git push orign tag名称
查看远程服务器的tag
git ls-remote origin
删除远程服务器上的tag
git push orign :tag名称
12.二分法查找错误提交
开始
git bisect start
标志坏提交
git bisect bad 提交ID
标志好提交
git bisect good 提交ID
查看log
git bisect log
13.删除错误提交
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