GIT使用教程大全书
作者:GL
极力推荐廖学峰的GIT使用教程:https://www.liaoxuefeng.com/wiki/896043488029600
关于介绍网上一大堆,不作过多介绍,具体可以参考https://www.cnblogs.com/Sungeek/p/9152223.html
个人理解:GIT解决SVN的过于集中式管理的缺点,说明:并不是说SVN不好,而是根据实际使用场景选择 GIT还是SVN,这两个不过是工具罢了,既然是工具就是为了提高生产效率的,可以根据具体需要选择合适自己的才是最好的,好比说,你杀个鸡,本来用菜刀就可以解决,你非得去集市买把牛刀,回来磨好了再杀这只鸡,高效的解决问题,提升生产效率才是最终目的。
个人建议:使用git作为版本管理工具。
要想理解git的工作原理,理解工作区、缓存区和分支至关重要。
关于工作区、缓存区和分支的个人理解:仅供参考 以生活中的例子举例,便于理解。 相信大家都有过去某商场X楼去吃饭的经历,尤其是在情人节等重大节日^_^,情侣们在这一天纷纷出动,郎才女貌,甚是养眼,逛完商场累了一天了想找个地方吃饭,这时候,X楼是餐饮层,但是人数是相当的多,怎么办,这时候肯定要排队,先去叫个号吧,假设所有餐馆共用一个排队叫号机并且只有叫到了才能选择去哪家餐馆吃饭!每对情侣想吃饭前必须在此机器上叫号排队! ----------------------------------------------------------------------- 工作区:某商场X楼整个餐饮层 缓存区:所有餐馆共用的排队叫号机 分支:餐馆
解释关系:
至此,相信大家理解了工作区、缓存区和分支的关系。 细心的朋友可能会问了:如果我是“南京往事”旁边的“北京故事”餐馆,也想“见”这对情侣怎么办? 回答:这位同学问的很OK,这就涉及到了git中的合并分支概念了,具体详情参考网上信息,这里不作过多解释,能理解以上三者的关系其它都好办了!如果一定要见这对情侣,假如“北京故事”老板很有钱,当场买下“南京往事”餐馆合并过来不就能见到了这对情侣了吗!这时候“南京往事”就真的变成“往事”了,择情处理或者保留或者删除!再假如还有个更有钱的老板,把整层楼的餐馆都买下来了包括“北京故事”,“北京故事”也真的变成“故事”了,这个老板合并了该商场的所有餐馆,那么整层楼在餐馆吃饭的情侣都对他所在的餐馆“可见”,这个老板如果做的再大点甚至可以合并其他商场的餐馆,越来越大,最后上市了(git中发布版本),后续其它故事读者自行脑补吧!^_^ 声明:上面的生活案例仅供作为理解GIT的工作区、缓存区和分支关系的参考! |
官网https://git-scm.com/download/ 下载相应OS版本的git
一路按照默认(可以根据自己需要设置),直至安装成功,具体安装细节参考网上https://www.cnblogs.com/ximiaomiao/p/7140456.html
检查是否安装成功——右击菜单出现 ,即安装成功。
本章节主要介绍git的常用命令以及使用场景,关于更加全面详细的git命令可以参考:
https://gitee.com/liaoxuefeng/learn-java/raw/master/teach/git-cheatsheet.pdf
GIT常用命令
命令 |
介绍 |
注意事项 |
git version |
查看当前git版本 |
|
git config user.name |
查看当前git用户名 |
|
git config user.email |
查看当前git使用邮箱 |
|
git config --global user.name "Your Name" |
设置全局git用户名 |
注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。 |
git config--global user.email "[email protected]" |
设置全局git邮箱 |
|
git init |
初始化git本地仓库,会在此文件夹下生成.git隐藏文件夹,里面存了本仓库的所有元数据信息,类似于”小本本”,记录该git本地仓库的”一举一动” |
|
git status |
查看状态 |
|
git diff |
查看修改新旧对比 |
|
git diff HEAD -- XXXX |
查看资源XXXX工作区和版本库里面最新版本的区别 |
|
git log |
查看日志 |
|
git log -p -X git show -X |
查看最近X次提交的内容差异 |
|
git log --pretty=oneline |
将每条日志信息在一行显示,解决日志眼花缭乱,看起来更加舒服 |
|
git log --pretty=oneline --abbrev-commit |
查看所有提交commit的日志 |
|
git reflog |
查看当前所有日志信息 |
|
git log --graph |
查看分支合并的日志信息图 |
|
git show |
最近一次提交的信息 |
|
git show XXXX(commitid ) |
显示某个commitid 的具体内容 |
|
git add XXXX |
将XXXX资源加入缓存区/暂存区,等待提交 |
可以多次add,一次commit。
|
git add --all |
修改或新增的文件全部加入缓存区 |
|
git commit -m "描述本次提交资源的关键信息" |
将缓存区/暂存区中的资源一并提交 |
|
git checkout -- XXXX |
资源XXXX将在工作区中进行的修改,全部撤销 或者理解是 用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。 |
|
git reset HEAD XXXX |
将已经放到缓存区中的资源XXXX的放回工作区,即重置缓存区中XXXX资源。 |
不添加 |
git reset --hard HEAD^/commit_id |
回退到某个相对当前的某个版本或者指定commit_id的版本回退 |
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100 |
git rm XXX |
删除已经提交到版本库中的资源 |
确实从版本库中删除该资源,使用 1、git rm XXX 删除 2、git commit -m "XXXX" 提交删除 |
git remote add origin git@server-name:path/repo-name.git |
关联一个远程仓库 |
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git; 关联后,使用命令git push -u origin master第一次推送master分支的所有内容; 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改; 分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是
拒绝干活的!当有网络的时候,--《再把本地提交推送一下就完成了同步》,真是太方便了! |
git remote rm origin |
删除一个远程仓库 |
|
git remote/ git remote -v |
查看远程仓库的详细信息 |
显示可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。 |
git push -u origin master |
推送本地仓库已经commit的内容到远程仓库 |
后续可以不用加参数了直接 git push
在关联远程仓库后提交push代码前需要先将远程仓库的中代码pull一次!
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
|
git pull origin branchname |
拉取远程仓库某个分支代码到本地该分支更新最新代码 |
|
git pull --rebase origin master |
拉取远程仓库的内容到本地仓库 |
后续可以直接 git pull |
git clone git@server-name:path/repo-name.git |
克隆一个远程仓库到本地 |
可以不用在本地git init初始化了
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
|
git branch |
查看当前分支 |
|
git branch XX |
创建分支 |
在创建分支的时候要将在分支上做的修改放缓存区并提交,不能都留在工作区中,否则所有分支都能可见 |
git checkout XX |
切换到分支 |
|
git checkout -b XX |
创建并切换到分支 |
这个命令相当于: git branch XX + git checkout XX |
git branch -d XX |
删除分支XX |
|
git branch -D XX |
强制删除分支XX |
|
git push origin :branchname |
删除远程仓库上的分支 |
|
git merge XX |
合并分支 |
|
git merge --no-ff -m "描述" XX |
普通模式合并,合并后的历史有分支,能看出来曾经做过合并 |
|
git checkout -b 本地分支名称 origin/远程分支名称 |
使用该方式会在本地新建分支,并自动切换到该本地分支 |
|
git fetch origin 远程分支名称:本地分支名 |
使用该方式不会主动切本地分支,只会多建立一个本地分支并和远程分支关联. |
|
git stash |
将当前处理现场储存起来,去处理其他事情,后面恢复后继续在此继续工作!相当于将当前现场保护起来,其它人看不到! |
git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug |
git stash list |
查看所有被隐藏的的“现场” |
|
git stash apply |
恢复现场,stash内容并不删除,你需要用git stash drop来删除 |
|
git stash pop |
恢复的同时把stash内容也删了 |
|
git stash apply stash@{0} |
恢复指定的stash |
|
git cherry-pick commitid |
复制某个提交到当前分支 |
|
git tag v1.0 |
打标签 |
默认标签是打在最新提交的commit上的。
|
git tag |
查看标签 |
|
git tag v0.9 f52c633 |
根据commitid打标签 |
创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除 |
git push origin v1.0 |
推送某个标签到远程 |
|
git push origin --tags |
一次性推送全部尚未推送到远程的本地标签 |
|
git show tagName |
查看标签详细信息 |
|
git tag -a v0.1 -m "version 0.1 released" 1094adb |
对标签添加描述信息 |
|
git tag -d v0.1 |
删除标签 |
|
git push origin :refs/tags/v0.9 |
删除远程标签 |
|
git config --global alias.X XXXX |
将git中的命令XXXX配置成别名X |
后面直接使用git 别名实现同样效果 如: $git config --global alias.logcomit "log --pretty=oneline --abbrev-commit" 将查看所有提交日志配成git logcomit |
|
|
|
|
|
|
GIT使用串烧
场景/需要 |
使用 |
注意事项 |
回退到某个版本,该版本号记不清了,且是很早之前提交的了。 |
用git reflog找到该版本提交的commitid,然后git reset --hard commit_id 回退到该版本 |
|
修改了某个资源,并加入到了缓存区,在对该文件进行修改,此时如果没有再次加入缓存区,那么缓存区中保存的仅仅是第一次加入缓存区的资源,此时提交,分支中仅仅保存的是第一次加入缓存区中的,因此需要再次add,然后commit.也可以两次一块commit,但是必须两次add. |
git add XXX git add XXX git commit -m “XXXX” |
|
关于回退操作 |
||
1、没有commit提交 |
||
(1)还没有放到缓存区 |
git checkout -- XXXX 撤销资源 |
|
(2)已经放到缓存区了 |
1、已经提交到缓存区后,在工作区又做了修改,用git checkout -- XXXX撤销的是在工作区中做的修改 2、如果连缓存区中的也一块撤销,则 第一步:git reset HEAD file 把暂存区的修改放回到工作区 第二步:git checkout -- file 还原原来修改 |
|
2、已经commit提交 |
||
已经提交commit了还想回退操作,只能用版本回退方式了 |
git reflog 查看希望回退的版本号后, 用git reset --hard HEAD^/commit_id 回退即可。 |
|
关于删除操作 |
||
1、已经commit了的,确实要从版本库中删除该文件 |
(1)git rm file 在git中删除 (2)git commit -m "XXXX" 提交删除 |
|
2、没有commit的 |
|
|
(1)没有加入到缓存区 |
本地删除即可,无法进行撤销 |
|
(2)已经加入到缓存区 |
本地删除,可以撤销。
git checkout -- file 撤销的是加入缓存区后的XXXX资源状态
git rm XXXX |
|
2、没有commit的,另一种情况是删错了 |
因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本,git checkout -- file git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原” |
|
关于配置远程仓库 |
||
1、本地已经git init了一个仓库 |
直接添加远程仓库:git remote add origin git@server-name:path/repo-name.git
|
git push -u origin master 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把
本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 |
2、本地没有仓库,即没有git init |
可以克隆远程仓库 git clone [email protected]:michaelliao/XXX.git |
|
有的小伙伴又要问了,一个本地库能不能既关联GitHub,又关联码云呢? 答案是肯定的,因为git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。 使用多个远程库时,我们要注意,git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。 关联两个远程库:github 和 码云
|
$git remote add github [email protected]:michaelliao/learngit.git
$git remote add gitee [email protected]:liaoxuefeng/learngit.git |
如果要推送到GitHub,使用命令: git push github master
如果要推送到码云,使用命令: git push gitee master |
解决冲突 |
手动解决并重新提交 |
|
有时候在某个分支上进行开发工作,还没结束,但是这时候需要切换到另外一个分支处理一个紧急任务,怎么办?
|
git stash将当前现场隐藏起来,等到处理完任务后再恢复现场接着干活,起到保护现场的作用 |
|
加入在修复BUG后,在其它分支上也需要打这个补丁,怎么办? 只需要将修复BUG的那次提交复制过来即可 |
git cherry-pick XXXX 将修复BUG的那次提交号复制过来即可 |
|
正在分支上进行工作时,突然来一个任务修复BUG |
先隐藏当前工作: $ git stash将当前处理现场储存起来,去处理其他事情,后面恢复后继续在此工作,类似于藏起来! git status查看工作区,就是干净的(除 非有没有被Git管理的文件),因此可以放心地创建分支来修复bug
查看隐藏: $git stash list 回到分支查看被隐藏的列表
恢复隐藏两个办法: 1、一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除; 2、另一种方式是用git stash pop,恢复的同时把stash内容也删了:
复制特定提交到当前分支: $git cherry-pick (提交号)4c805e2 能复制一个特定的提交到复制到当前分支 |
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick |
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了? 有木有更简单的方法? 有! 同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。
|
Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支: git cherry-pick XXXX 将提交的XXXX复制过来 |
Git自动给dev分支做了一次提交,注意这次提交的commit是1d4b803,它并不同于master的4c805e2,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。 |
当创建一个分支后,突然发现不需要了,想删除,用git branch -d XX 删除不了,因为git要求必须要合并,怎么办? |
git branch -D XX 强制删除 |
|
多人协作开发,使用git |
因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to
这就是多人协作的工作模式,一旦熟悉了,就非常简单。 |
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。 |
发布版本时,需要打一个标签,后面根据该标签取出来就可以用了 |
标签也是版本库的一个快照。
git tag v1.0 |
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。 |
有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办? |
首先git log --pretty=oneline --abbrev-commit 找到需要打标签的提交ID, 然后 git tag v0.9 f52c633 根据提交ID打标签
|
|
有时候想拉取某个标签的内容,怎么办? |
git checkout -b branch_name tag_name 创建一个分支并拉取改标签内容 |
|
如果标签已经推送到远程,要删除远程标签 |
先删除本地标签 git tag -d v0.9
然后删除远程标签 git push origin :refs/tags/v0.9
|
|
删除本地文件后 Git从远程仓库重新获取 |
1、$git fetch --all 2、$git reset --hard origin/master 3、$git pull |
|
|
|
|
忽略特殊文件 有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。 |
参考 https://www.liaoxuefeng.com/wiki/896043488029600/900004590234208 |
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件
名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:
https://github.com/github/gitignore
$touch .gitignore windows下创建.gitignore文件 |
配置别名 |
git config --global alias.co checkout
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
参考 https://www.liaoxuefeng.com/wiki/896043488029600/898732837407424 |
|
git 退出Vim模式 下连按两下大写的ZZ esc、w、q退出 |
|
|
搭建自己的远程仓库 |
参考https://www.liaoxuefeng.com/wiki/896043488029600/899998870925664 |
|
配置文件放哪了? |
每个仓库的Git配置文件都放在.git/config文件中:别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。 |
|
终于到了期末总结的时刻了!
经过几天的学习,相信你对Git已经初步掌握。一开始,可能觉得Git上手比较困难,尤其是已经熟悉SVN的童鞋,没关系,多操练几次,就会越用越顺手。
Git虽然极其强大,命令繁多,但常用的就那么十来个,掌握好这十几个常用命令,你已经可以得心应手地使用Git了。
友情附赠国外网友制作的Git Cheat Sheet,建议打印出来备用:
Git Cheat Sheet
现在告诉你Git的官方网站:http://git-scm.com,英文自我感觉不错的童鞋,可以经常去官网看看。什么,打不开网站?相信我,我给出的绝对是官网地址,而且,Git官网决没有那么容易宕机,可能是你的人品问题,赶紧面壁思过,好好想想原因。
如果你学了Git后,工作效率大增,有更多的空闲时间健身看电影,那我的教学目标就达到了。
谢谢观看!