安装Git:
sudo yum install git
sudo apt-get install git git-doc gitweb git-gui gitk git-email git-svn
git init //创建一个空的git版本管理库
git add file //将file 添加到版本库中
git status //显示文件中间状态
git config命令在配置文件里保存你的身份
git config user.name "Jon Loeliger"
git config user.email "[email protected]"
git config --global user.name "Jon Loeliger"
git config --global user.email "[email protected]"
git log命令会产生版本库里一系列单独提交的历史
git log -3 //查看前三条提交
git show命令带一个提交码。
git show commitID //可以使用它来查看某个提交
git diff commitID-1 commitID-2 //查看两次提交的差别
git diff //显示仍留在工作目录中且未暂存的变更;
git diff --cached //显示已经暂存并且因此要有助于下次提交的变更。
git rm file //删除文件file 它会在版本库和工作目录中同时删除文件
git rm --cached //一个文件由已暂存的转化成未暂存的
git mv fileold filenew //重新命名
git mv stuff newstuff
mv stuff newstuff
git rm stuff
git add newstuff
git clone 命令创建一个完整的副本
git config -l列出在整组配置文件里共同查找的所有变量的设置
使用--unset选项来移除设
git config --unset --global user.email
git write-tree //生成树
git cat-file -p commitId //查看生成树
--follow选项会让Git在日志中回溯并找到内容相关联的整个历史记录。
git log --follow filepath
做到不需要提交文件的方法:
.gitignore
.git/info/exclude
==>git 引用
.git/refs/tags/ref //标签引用
.git/refs/heads/ref //本地分支引用
.git/refs/remotes/ref //远程分支引用
HEAD //HEAD始终指向当前分支的最近提交
ORIG_HEAD //会把调整为新值之前的先前版本的HEAD记录到ORIG_HEAD中。可以使用ORIG_HEAD来恢复或回滚到之前的状态或者做一个比较。
FETCH_HEAD //当使用远程库时,git fetch命令将所有抓取分支的头记录到.git/FETCH_HEAD 中。。FETCH_HEAD是最近抓取(fetch)的分支HEAD的简写,并且仅在刚刚抓取操作之后才有效。
MERGE_HEAD //当一个合并操作正在进行时,其他分支的头暂时记录在MERGE_HEAD中。换言之,MERGE_HEAD是正在合并进HEAD的提交。Git也给第二个父版本起了一个特殊的名字——MERGE_HEAD。
插入符号^是用来选择不同的父提交的,给定一个提交C,C^1是其第一个父提交,C^2是其第二个父提交,C^3是其第三个父提交.
波浪线~用于返回父提交之前并选择上一代提交,给定一个提交C,C~1是其第一个父提交,C~2是其第一个祖父提交,C~3是第一个曾祖父提交。
如C^和C~两种简写形式分别等同于C^1和C~1
C^^与C^1^1相同,也可以写做C~2
==>git log
git log跟git log HEAD是一样的,输出每一个可从HEAD找到的历史记录中的提交日志消息
git log commitId //那么这个日志将从该提交开始回溯输出
git log master
git log -1 -p commitId //打印一次提交的patch
git show commitId //可以使用它来查看某个提交
git log --stat //列出改变情况
git show-branch //查看分支
gitk //查看分支工具
git log ^dev ^topic ^bugfix master //选择在master分支但不在dev、topic或bugfix分支上的所有提交
双句点(..)形式就表示一个范围,如“开始..结束”,不包括开始,但包括结束
topic..master依旧代表在master分支但不在topic分支的那些提交
A ...B (三个句点)则表示A 和B 之间的对称差
==>git branch
git blame //命令可以告诉你一个文件中的每一行最后是谁修改的和哪次提交做出了变更
git branch branchname //创建一个分支 从当前分支的HEAD创建一个新的分支 默认之后的提交将会提交到新分支
git branch //查看本地分支
git branch -a //查看所有分支包括远程分支
git show-branch命令提供比git branch更详细的输出,按时间以递序的形式列出对一个或多个分支有贡献的提交。
git show-branch branchname //-r显示远程追踪分支,-a显示所有分支
git checkout branchname //检出到新的分支 可以通过使用-f选项强制Git执行检出。
git checkout -m branchname //,Git通过在你的本地修改和对目标分支之间进行一次合并操作,尝试将你的本地修改加入到新工作目录中.
git checkout -b new-branch //当你想创建一个新的分支并同时切换到它
git branch -d brancnname //从版本库中删除分支,Git阻止你删除当前分支。
==>git diff
git diff //显示工作目录和索引之间的差异
git diff HEAD //工作目录与HEAD
git diff --cached //索引与HEAD
git diff commitId //这个形式命令会显示工作目录和给定提交间的差异
git diff --cached commitOId //这条命令会显示索引中的变更中和给定提交中的变更之间的差异,如果省略commit 这一项,则默认为HEAD
git diff commit1 commit2 //如果你任意指定两个提交,这条命令会显示它们之间的差异
git diff master branchname //显示两个分支的不同,结果为对master的操作能转变到branchname
git diff master..branchname //显示两个分支的不同
git diff --stat master~5 master //限制只显示前5次提交的差异
git diff --stat master~5 master Documentation //只显示文件的修改情况,不显示详细修改
git diff master~5 master Documentation/git-add.txt //只查看一个文件的修改情况
git diff -S"string" master~50 //-S"string "选项用来在master分支最近50个提交中搜索包含string 的变更
==>git merge
git checkout branch
git merge other_branch //将other_branch合入到branch。当Git无法自动合并时,你需要在所有冲突都解决后做一次最终提交。
git log --graph --pretty=oneline --abbrev-commit //查看可视化提交
当出现合并冲突的时候,应该无一例外地使用git diff命令来调查冲突的程度。如果你对冲突解决很满意,你就应该用git add命令来把文件添加到索引中,并为合并提交而暂存它。最后终于到了用git commit命令来提交合并。
git diff HEAD git diff --ours //显示相对你的版本的更改
git diff MERGE HEAD git diff --theirs //显示相对于另一版本的更改
git log的选项如下:
--merge:只显示跟产生冲突的文件相关的提交。
--left-right:如果提交来自合并的“左”边则显示<(“我们的”版本,就是你开始的版本),如果提交来自合并的“右”边则显示>(“他们的”版本,就是你要合并到的版本)。
-p:显示提交消息和每个提交相关联的补丁
git log --merge --left-right -p //此命令将显示这两部分历史中的所有提交,并显示每次提交引入的实际变更
git reset --hard HEAD //这条命令立即把工作目录和索引都还原到git merge命令之前
git reset --hard ORIG_HEAD //引进一个新的合并提交,后放弃
git checkout -m //你已经把冲突解决方案搞砸了,并且想再返回到尝试解决前的原始冲突状态
==>git reset
git reset --soft commitId //--soft会将HEAD引用指向给定提交。索引和工作目录的内容保持不变,只改变一个符号引用的状态使其指向一个新提交。
git reset --mixed commitId //--mixed会将HEAD指向给定提交。索引内容也跟着改变以符合给定提交的树结构,但是工作目录中的内容保持不变。--mixed是git reset的默认模式。
git reset --hard commitId //这条命令将HEAD引用指向给定提交。索引的内容也跟着改变以符合给定提交的树结构。此外,工作目录的内容也随之改变以反映给定提交表示的树的状态。
git reflog //记录版本库中引用变化的历史
==>git cherry-pick
git cherry-pick commitId //git cherry-pick命令通常用于把版本库中一个分支的特定提交引入一个不同的分支中
git cherry-pick X..Z //git cherry-pick允许在一条命令里选择并应用一个范围的提交。这在从一条开发线移植或移动一大串提交到另一分支的时候相当方便
git cherry-pick --abort //放弃本次操作
git cherry-pick --contine //解决冲突后继续提交
==>git revert
git revert commitId //撤销某次提交 git revert的常见用途是“撤销”可能深埋在历史记录中的某个提交的影响。
git checkout -- path/to/file.c //从索引中检出file.c
==>git commit --amend
git commit --amend //改变当前分支最近一次提交的最简单方法之一,最频繁的用途是在刚做出一个提交后修改录入错误
git commit --amend --author "Bob Miller
==>git rebase
git checkout topic
git rebase master topic //特性分支topic已经向前移植到了master分支
git rebase命令也可以用--onto选项把一条分支上的开发线整个移植到完全不同的分支上。
git rebase --continue //如果发现冲突,rebase操作会临时挂起进程以便你可以解决冲突。一旦所有冲突都解决了,并且索引已经更新了,就可以用git rebase --continue命令恢复变基操作.
git rebase --skip //在检查变基冲突的时候,如果你决定这个提交是没有必要的,你就可以通过git rebase --skip来通知git reabse命令跳过这个提交,移动到下一个提交。
git rebase --abort //如果你认为不应该进行变基操作,就可以用git rebase --abort来中止操作,并把版本库恢复到发出git rebase命令之前的状态
git rebase -i commitId或 git rebase -interactive commitId//此命令允许你修改一个分支的大小,然后把它们放回原来的分支或者不同的分支。
会打开一个文本编辑器,提交最初是按照从最老到最新排序的,每个提交前都有个动词pick(拾取),如果你现在离开编辑器,每个提交将按顺序拾起,并应用到目标分支,然后提交。
==>git stash
git stash save //保存当前的目录和索引 将保存当前索引和工作目录的状态,并且会将之清除以便再次匹配当前分支的头
git stash save "WIP: Doing real work on my stuff" //加上一些日志
git stash pop //恢复之前保存的目录和索引 将在当前工作目录和索引中还原最近一次save操作的内容
git stash drop //来将状态从储藏栈中删除
在一个pop操作成功后,Git会自动将储藏状态栈中保存的状态删除。也就是说,一旦应用,储藏的状态将会丢弃。然而,当需要解决
冲突时,Git将不会自动丢弃状态,以防你想要尝试不同的方法或还原到不同的提交。一旦你清理了合并冲突并希望继续,你就应该使用git stash drop来将状态从储藏栈中删.
git stash apply //如果你只是想重新创建一个已经保存在储藏状态中的上下文,又不想把它从栈中删除那么就使用git stash apply,之后再使用git stash drop来手动删除
git stash list //命令按保存时间由近及远的顺序列举出储藏栈。
git stash show //命令可以显示给定储藏条目相对于它的父提交的索引和文件变更记录。git diff的所有选项也适用于git stash show
git stash show -p stash@{1} //查看stash@{1}的详细改变
--include-untracked参数以便它也储藏新的未被追踪的文件以及余下的修改,这将确保在拉取时工作目录是完全干净的
--all选项将收集所有未跟踪的文件以及在.gitignore 和exclude 文件中明确忽略的文件。
git stash branch branchname //命令基于储藏条目生成时的提交,会将保存的储藏内容转换到一个新分支。
==>git reflog 每次把分支头移动到不同的提交时,它都会记录
git config core.logAllRefUpdates true //命令启用引用日志
git config core.logAllRefUpdates false //禁用引用日志。
git reflog show //查看引用日志
git reflog branchname //查看分支的引用日志
git reflog delete //命令来删除单个条目
git reflog expire //命令直接让条目过期并被立即删除
引用日志都存储在.git/logs 目录下
git log // 查看提交日志
==>git clone
git init //命令创建一个新的空版本库,该新版本库可以发展成开发版本库或裸版本库
git clone命令会创建一个新的Git版本库,基于你通过文件系统或网络地址指定的原始版本库
git clone命令,原始版本库中存储在refs/heads/ 下的本地开发分支,会成为新的克隆版本库中refs/remotes/ 下的远程追踪分支。原始版本库中refs/remotes/ 下的远程追踪分支不会克隆。
git clone --bare //创建一个裸的版本库,不带--bare 表示创建一个开发版本库
git clone public_html my_website //用git clone创建public_html 版本库的副本
git clone url //从网络上克隆
==>git remote
git remote命令创建、删除、操作和查看远程版本库
git fetch //远程版本库抓取对象及其相关的元数据
git pull // git fetch类似,但合并修改到相应的本地分支
git push //转移对象及其相关的元数据到远程版本库。
git ls-remote remote_name//显示一个给定的远程版本库(在上游服务器上)的引用列表
refspec souce:destination
git URL:
file:///path/to/repo.git //远程版本库在本地文件系统
git://example.com/path/to/repo.git
git://example.com/~user/path/to/repo.git
ssh://[user@]example.com[:port]/path/to/repo.git
ssh://[user@]example.com/path/to/repo.git
ssh://[user@]example.com/~user2/path/to/repo.git
ssh://[user@]example.com/~/path/to/repo.git
[user@]example.com:/path/to/repo.git
[user@]example.com:~user/path/to/repo.git
[user@]example.com:path/to/repo.git
http://example.com/path/to/repo.git
http://example.com/path/to/repo.git
git remote add remotename URL //添加远程版本库
git remote update //会从每个remote指定的版本库中检查并抓取新提交
git remote update remote_name //从指定远程本部库检查并抓取提交
git remote show remote_name //查看远程版本库
git remote rm remote_name //从你的本地版本库中删除给定的远程版本库及其关联的远程追踪分支
git remote prune //命令可以用来删除你的本地版本库中那些陈旧的(相对于实际的远程版本库)远程追踪分支。
git remote update --prune //remote 命令首先从远程版本库获得更新,然后一步删除陈旧的追踪分支。
git remoterename oldname newname //用了更改远程版本库名
git remote set-url origin git://repos.example.com/stuff.git //更新或更改远程版本库的URL
git config命令和直接编辑.git/config 文件
git checkout --track remote_name/branch_name //
git log origin/master..master //查看哪些提交在master而不在origin/master中
git push remote_name branch_name //在远程版本库中创建新分支
git push remote_name branch_name:branch_name //在远程版本库中创建新分支
git push remote_name branch_name:refs/heads/branch_name //在远程版本库中创建新分支
git push remote_name :branch_name //推送使用只有目标引用的refspec(即,没有源引用)导致目标引用从远程版本库中删除。为了指明该引用是目标,冒号分隔符必须显式指定
git push remote_name --delete branch_name //删除远程分支
重命名远程分支怎么样,简短的回答是用新名称创建新上游分支,然后删除旧分支。
git branch new_name remote_name/old_name //在已经存在的旧提交上创建新分支
git push remote_name new_name //创建新远程分支
git push remote_name :old_name //删除旧远程分支
==>git format-patch
git format-patch //会生成email形式的补丁
特定的提交数,如-2;
提交范围,如master~4..master~2;
单次提交,通常是分支名,如origin/master。
git format-patch --root end -commit //为所有提交生成补丁,且包括初始的根提交,直到一个给定的结尾提交,那么可以使用--root选项
git format-patch -o dir //-o 选项实现生成补丁到指定目录
git send-email //会通过简单邮件传输协议(Simple Mail TransferProtocol,SMTP)来发送一个Git补丁
git send-email -to [email protected] 0001-A.patch
git apply 命令是补丁应用过程的工作主力。它接受git diff或者diff风格的输出,然后将其应用到当前工作目录的文件 当git apply结束时,工作目录下的文件就留在修改的状态
git am patchfile//会应用邮件消息中的补丁 gitam会在当前分支上创建提交
git am -3 /tmp/patches/ * //三路重建
==>git hooks
git help hooks来查看在当前版本的Git中可用的钩子。
前置(pre)钩子会在动作完成前调用。要在变更应用前进行批准、拒绝或者调整操作,可以使用这种钩子
后置(post)钩子会在动作完成之后调用,它常用来触发通知(如邮件通知)或者进行额外处理,如执行构建或关闭bug。
==>git submodule
gitlink则是Git用来直接指向另一个Git库所使用的机制。
git submodule update //更新子模块
创建.gitmodules 文件,手动或者通过git submodule add命令均可
git submodule add命令会在.gitmodules文件中新添加一个条目,然后使用新添加的版本库的副本来填充新的Git版本库。
git submodule init命令将.gitmodules 文件中的设置复制到.git/config 文件中
git submodule update命令来真正更新文件,使用.git/config 中的地址抓取子模块的内容,并在分离的HEAD指针状态下检出上层项目的子模块记录引用。
git submodule status //总结这个项目的所有子模块的提交引用和脏状态。
git submodule summary //展示每个子模块当前状态相对于提交状态间变化的补丁。
==>git svn clone
git svn clone //从svn中克隆代码到本地git版本库
git svn dcommit //向原来的SVN版本库提交更改
git svn fetch //从SVN中取回最新的版本
git svn rebase //自动推断出你的分支基于git-svn,从SVN将分支取回,同时将你的分支变基到它上面。
==>filter-branch
git rev-list master -- date.c //找到date.c 文件都有哪些历史版本
git add -p file // 要交互地暂存数据块(从而进行提交)很简单,只需要在git add命令后加上-p选项。
git fsck //将所有对象的集合与通过遍历基于引用的提交图得到的对象的集合进行对比,你就能找出所有“未引用”对象。
git fsck --no-reflog reflog //只能通过reflog找到的对象,就被认为也是“悬挂的”。
常用技巧:
(1)对脏目录进行变基
git stash //清理脏的工作目录
git rebase -i commitId //变基处理
git stash pop //恢复脏目录
(2)删除版本库中的临时文件
git filter-branch --tree-filter 'rm -f *~' -- --all
(3)修改垃圾回收的时间
git config --global gc.reflogExpire "6 months" //修改reflog过期时间,默认90天
git config --global gc.reflogExpireUnreachable "60 days" //当reflog条目在当前分支下不可达时,一定时间限制的条目会被git reflog expire命令删除,默认30天
git config --global gc.pruneexpire="1 month" //修改不可达对象在对象库里的持续时间。默认值为两周。
(4)从上游变基中恢复
git branch save-origin-master origin/master //重命名你旧的上游分支。在fetch之前,这么是非常重要的。因为这个步骤才能对新的上游历史记录进行干净的fetch。
从上游fetch,以恢复当前的上游内容。一条简单的git fetch命令就足够了
使用cherry-pick或rebase命令,把你的提交从重命名的分支变基到新的上游分支里。如:git rebase --onto origin/master save-origin-master master。
清理并删除临时分支。试试使用这条命令:git branch -D save-origin-master。
(5)定制Git命令
写下你的命令或脚本,命名以前缀git-开头,存到在你的~/bin 目录,或shell PATH里能找到的其他地方。
git-top-check 命名的脚本可以用 git top-check执行
(6)快速查看变更
git whatchanged --since="three days ago" --oneline //查看一个分支的提交
git whatchanged ORIG_HEAD..HEAD --oneline Makefile //查看一个文件修改提交
(7)移除为跟踪的文件
git clean //可以从你的工作树中移除未追踪的文件
未追踪的目录相对来说稍稍比纯文本文件更有价值一些,会保留在原地,除非使用-d选项。
除非通过-x选项明确要求,不然Git不会把这些被忽视的文件清理掉。
-X选项会导致相反的行为,即只有明确地被Git忽视的文件才会被删除
(8)git grep查找
git grep -i loeliger //查找文件中‘loeliger’的内容
git grep -l grep-git //查找文件grep-git
-i代表不区分大小写的搜索,-l代表一个只列出匹配的文件名的列表,-w代表字匹配,等等
(9)更新和删除ref
git update-ref someref SHA1 //someref 代表要更新成新的SHA1 值的分支或引用
git update-ref -d someref //删除一个引用
git update-ref //直接改变一个引用
(10)跟踪移动的文件
git log –-follow --name-only file //添加--follow选项会使它追溯到重命名之前, 添加--name-only选项,使Git也随着文件的重命名时而显示它的名字