简介
分布式的版本控制工具,
优势:
在任何地点(在上班的地铁 上)提交自己的代码和查看代码版本; 方便地开发分支。
常用命令
1. 初始化:
git clone:已经有一个远程的Git版本库,如:git clone git@192.168.XXX:source
git init和git remote
2. 基本命令
在任何Git命令后加上'--help'就会显示该命令的帮助文档,例如 'git log --help'你就可以看到命令'git log'的所有使用方法。
gitpull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'git pull origin master'就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于SVN的update
git add:是将当前更改或者新增的文件加入到Git的index中,这也是提交之前所需要执行的一步,例如'git add app/model/user.rb'就会增加app/model/user.rb文件到Git的index中. -u(所有修改的) -A(删除和新增的)
git rm:从当前的工作空间中和索引中删除文件,例如'git rm app/model/user.rb'
git commit:提交当前工作空间的修改内容,类似于SVN的commit命令,例如'git commit -m "story #3, add user model"',提交的时候必须用-m来输入一条提交信息 。 一次提交只干一件事情,或是改了一个bug,或是加入一个新功能git commit --amend (修改提交说明)
git push:将本地commit的代码更新到远程版本库中,例如'git push origin'就会将本地的代码更新到名为orgin的远程版本库中
git log:查看历史日志,如 git log--graph--decorate--all log --pretty=oneline --since='2 days ago' git log -p -1 '-p'表示查看修改的具体内容;'-n'其中n表示一个数字,这表示打印出具体的几个日志,例如 'git log -p -1 表示打印出当前最新的一次日志记录及具体修改内容;'--since="时间/日期"','--until="时间/日期"'表示你希望查找某个日期段的日志记录,例如'git log --since="2 days ago" --until="1 hourago"'就表示你希望查找两天前到一小时前的日志记录, --pretty=格式种类',其中格式种类有full、short、oneline,raw等,例如'oneline'就会将每条代码历史记录放在一行里,full显示作者和提交者,raw显示详细信息, --stat : 看到哪些文件改动 --graph:commit之间的关系,decorate 显示关联的tag,
git revert:还原一个版本的修改,必须提供一个具体的Git版本号,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本号都是生成的一个哈希值
git mv 改变了file 的名称和location时
git reset: 修改游标指向具体的ID。 --hard会破坏工作区未提交的改动
3. 独有命令
git branch:对分支的增、删、查等操作,例如'git branch new_branch'会从当前的工作版本创建一个叫做new_branch的新分支,'gitbranch -D new_branch'就会强制删除叫做new_branch的分支,'git branch'就会列出本地所有的分支
git checkout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如 'git checkout -b new_branch'就会创建并切换到new_branch的分支上去; 另一个功能是还原代码的作用,例如'gitcheckout app/model/user.rb'就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚
git tag:可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用 'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用 revert_version标签名,而不是哈希值了
git stash:当你不想提交当前完成了一半的代码,但是却不得不修改一个紧急Bug,那么使用'git stash'就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和版本库是完全一样的,等到修完Bug,再使用'git stash apply'将以前一半的工作应用回来。可以多次执行git stash,'git stash list'命令可以将当前的Git栈信息打印出来,你只需要将找到对应的版本号,例如使用'git stash apply stash@{1}'就可以将你指定版本号为stash@{1}的工作取出来,当你将所有的栈都应用回来的时候,可以使用'git stash clear'来将栈清空
git format-patch:当你想给一个开源项目(例如Rails)提交一段代码的时候,或者你想给小组成员展示一段你并不想提交的代码(不能直接push的时候),Git的'format-patch'命令良好的支持了这个功能。我来基本描述一下使用这个命令的步骤和方法:第一,利用branch命令创建一个分支;第二,修改你的代码;第三,在该分支上提交你的修改;第四,使用'git format-patch'命令来生成一个patch文件,例如:'git format-patch master --stdout > ~/Desktop/tmp.patch'就是将工作分支与master主干的不同,存放在'~/Desktop'文件夹下,生成一个叫做tmp.patch的文件(另一种简单的版本是利用diff命令,例如'git diff ..master > ~/Desktop/tmp.patch'),这样就生成了patch文件。那么别人就可以使用'gitapply'命令来应用patch,例如'git apply ~/Desktop/tmp.patch'就是将patch打在当前的工作分支上
4. 其他工具
git命令的自动提示
git citool:这是我个人使用率最频繁的一个工具,上一篇文章也提到了,Git可以本地提交代码,那么你自然可以本地修改你的提交了,这个工具就是可视化界面,用于修改你本地的提交。你可以用它来提交代码,可以用它来将你本地的修改追加在上一次提交的代码中,你还可以用它来修改你上次提交的信息等等。
gitk:是一个查看主干/分支情况的工具,它主要用于观察整个项目的分支状况,使用'gitk'命令就会出现一个图形化界面供你查看
第二章
1. 在客户处工作
2. 修改提交说明
git commit --amend(最新提交) 历史提交: gitrebase -i <commit-id>^
3. 提交了 不该有的文件(大文件):
Git rm --cached 文件名 git commit --amend
4. 工作进度保存
如果同时修改bug和加入新功能, gitstash git checkout -b 新分支;gitpush; git checkout 旧分支; gitstash pop
5. 无处不在的分页器
log 分页: q退出分页器, h显示帮助 空格上翻一页 b下翻一页 /pattern向下查找 ?pattern向上查找 n/N 代表向前向后继续寻找 g/G 第一行和最后一行
第四章:Git 初始化
git配置
1)当前姓名和邮件地址;
2)git命令的别名
3)开启颜色提示;
有两种方式: 修改 /etc/gitconfig文件(git config--global -e),使用config命令 git config --global alias.st status
git目录
工作区:git起作用的目录,其中.git文件所在是工作区的根目录。
git grep "工作区文件内容搜索"
第五章: git 暂存区
系统结构图
查看区别
git diff 工作区和index的差别
git diff HEAD :工作区和版本库的区别
git diff --cached : index和版本库的区别
git log --pretty=oneline 每个commit显示为一行,用于查看是否有提交
升级
git add (-u -A)工作区到index
git commit index到版本库
回退
git reset HEAD: index被版本库复写,工作区不影响
git rm --cached:删除index中文件,工作区不受影响
git checkout --file (.) index替换工作区内容,会清除工作区未添加到Index的改动
git checkout HEAD --file(.) : 版本库替换index和工作区文件
清楚工作区改动
1. git clean -fd :清除没有加入版本库的文件和目录 untracked;
2. git checkout . 用index刷新工作区
不要使用 commit-a
第七章 git重置
分支游标
gitreset : 将游标指向本分支任意一个存在的提交commit ID
用reflog挽救错误的重置
git reflog show master | head -5 查看master 分支 head向前的5个提交
git reset --hard master@{2} 回退到正确的(丢弃所有未提交的change)
深入了解reset命令
git reset -q [commit] --path : 使用指定的commit 重置index,不会改变工作区, 如git resetHEAD <path> 使用版本库head 重置index中特定文件
git reset --soft | --hard|--mixed|--merged|--keep -q commit : hard 会让HEAD指向commit ,使用版本库替换index和工作区。soft 只改变head指向。 mixed或不使用参数,则修改引用和index。 如git reset (add的逆操作) git reset --soft HEAD^ (引用回退到head^,撤销最新的提交)
实例:
git reset 使用head 重置index,工作区不影响
git reset --fileName 使用head重置index中指定文件,相当于gitadd的逆操作
git reset --soft HEAD^ 放弃最新的提交(对最新的提交和提交说明不满意)
git reset HEAD^ 工作区不变, 暂存区回退提交之前,引用也回退一次
第八章 git检出
深入了解checkout 命令
恢复文件 git checkout -q commit --path 主要用于工作区,reset用于index
切换分支 git checkout branch
创建分支 git checkout -m -b new_branch 【commit】
实例:
git checkout branch : head指针指向branch,并使用分支更新index和工作区
git checkout : 汇总显示 工作区、index和head的差异
git checkout branch --file : 用分支branch中的file 回复index和工作区,head不变
git checkout . git checkout --filename
第九章 恢复进度
简单实例
git clean -nd:测试删除本地没有被track的文件和目录 git clean -fd 开始删除
使用 git stash
保存和恢复工作进度,建议使用 apply和clear的组合
git stash save “message”:保存工作区和index
git stash list 查看保存的进度列表
git stash pop [--index][stash] 从最近保存(或指定的stash)的进度恢复, index表示index也要恢复
git stash -q apply: 不删除进度,其他和pop一样, q代表不提示
git stash clear:清除
git stash branch <branchname><stash>:根据stash内容创建分支
第十章 git基本操作
先来合个影
git tag -m "" <tag名称> : 为当前commit 打个tag
删除文件
rm *.txt 本地删除文件
git add -u : 将本地的改动(修改和删除)标记到index
git commit
恢复删除
git checkout HEAD^1 --welcome.txt
git add -A 将所有改动和新增文件添加到index
移动文件
git mv readme.txt readme 文件改名和移动
文件忽略
对某些目录或文件设为忽略后,执行git status不会track
.gitignore 起作用的范围是其所在目录和子目录,分为独享式和共享式:共享式是在工作目录,并提交到版本库实现;独享式通过 config指定外部文件实现,如 git config --global core.excludesfile /home/.gitignore
文件归档
对工作区建立压缩包,不包括忽略文件和临时文件: git archive -o latest.zipHEAD
第十一章 历史穿梭
查看历史提交、历史版本、进行差异比较
查看历史记录
git log --graph --pretty=oneline--stat
分析某一提交
git show <commitId> --stat | -p 查看该commit的提交
差异比较
git diff <commit1> <commmit2> --path : 显示不同commit下 path路径的差异
git diff <path1> <paht2> 提供对非工作区的支持
git diff branch1 branch2 对分支的比较
文件追溯
git blame : 针对文件执行 ,会逐行显示文件,在行首显示提交人和提交时间。 用于追溯是谁引入的bug
二分查找
git bisect: 用于定位引入bug的第一个版本
第十二章 改变历史
单步悔棋
git commit --amend -m "新message" 修改上次的提交说明
git checkout HEAD^ --file + git commit --amend -m "new commit" 对修改内容的反悔
多步悔棋
将本地版本库push到远端时,将多次提交合并为一次提交
git reset --soft <commitId> :回到最初的提交 + git commit 完成合并
回到未来(略)
更改某个历史版本,对后期版本都会影响
git rebase : 将指定范围的提交嫁接到另一个提交之上(有详细介绍)
丢弃历史
解决: 只保留最近的100次提交,抛弃之前的历史提交
反转提交
多人协同时,没法修改他人版本库,修正一个错误历史提交的方法是反转提交
git revert HEAD 相当于将HEAD提交反向再提交一次
第三篇 GIT和声
第十六章
pull中的合并
git pull =git fetch+ git merge
git merge 支持版本库之间、本版本库中多个分支的合并,格式 git merge 选项 <commit> 。
当执行merge 出现“mergefailed”,运行 git status 看到“unmerged”, 打开文件 <,=之间是当前分支(head)所更改的内容,=,>之间是要合并的内容。 修改文件后,使用add-u 和commit
合并四:树冲突
两个user对同一文件移动到不同的地方,形成的冲突
第十七章
三种里程碑:轻量级、带注释、带签名的里程碑
第十八章 Git分支
分支类型
release branch:主要用来修正bug
其中白色三角是 发布时的版本, 第三步是合并到主线
特性分支:将某个功能的开发和主线独立起来,适用于1)实验性功能开发;2)功能复杂,开发周期长的功能;3)容易冲突,影响其他人开发进度的模块。
当得知功能2不开发时, 提交F2.X 注销掉功能2代码,创建新分支,并使用cherry-pick将mainline上前期的2.1和2.2提交拣选到新分支。
卖主分支:针对第三方软件的定制,当第三方更新时,和现有代码的同步
分支命令
git branch 显示本地分支列表
git branch <branchname> <commid> // 从head或commit创建分支
git -d | -D branch branchName ; 删除分支, D代表强制删除,不检查是否合并到其他分支
git -m |-M branch newBranch 重命名分支
拣选操作
git cherry-pick commitId 拣选commitId到当前分支
第十九章 远程版本库
远程分支
git branch -r :查看远程分支
origin/master 代表远端的
当一个分支从 origin创建时,会建立与remote的track, 则执行pull 或push时不需要参数