Git教程
廖雪峰-git教程学习总结
本地文件版本管理
创建:git init
添加:git add file_name
提交:git commit –m ‘’注释”
查看状态:git status
查看最近修改:git diff file_name
查看提交日志:git log
回滚:git reset –hard HEAD^ #回到上一个版本
git reset –hard 版本号 #返回到指定的版本号
工作区和暂存区:
把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
撤销修改:git checkout – readme.txt
撤销可以分为两种情况:
一种是对工作区修改的撤销:git checkout – file_name
第二种是对已经提交到暂存区的修改的撤销:git reset HEAD file_name; 这个操作把暂存区的修改撤销掉(unstage),重新放回工作区,然后就可以撤销工作区的修改了。
删除文件:
修改操作的删除:rm file_name
远程仓库
先创建本地库,再创建远程库,然后将本地库关联远程库,并向远程库推送。
添加远程仓库与推送
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。
首先在git上创建有对应的远程库;
然后将本地库链接到远程库:
git remote add origin git@github.com:michaelliao/learngit.git;
最后将本地库推送到远程库:
git push -u origin master
SSH警告
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告;这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
克隆
知道远程库地址后可以通过如下指令实现克隆:
git clone git@github.com:michaelliao/gitskills.git
分支管理
基本分支操作
创建分支,然后切换到dev分支
git checkout –b dev
合并分支
git merge dev
合并了之后就可以删除dev分支了:git branch –d dev
解决冲突
用带参数的git log也可以看到分支的合并情况:git log --graph --pretty=oneline --abbrev-commit
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
–no-ff方式的git merge 就是:在非Fast forward模式下merge:
git merge --no-ff -m “merge with no-ff” dev
查看分支历史:通过下面的指令可以查看分支历史,
git log --graph --pretty=oneline --abbrev-commit
bug分支
注意:当要切换到另一个分支时,当前分支的内容要么被提交到暂存库和版本库,要么使用git stash 储藏现场;总之必须要保存,否则无法切换分支。
当在一个分支的工作进行到一半,还无法加入到暂存库和版本库时,出现突发状况,在某一个分支上有一个bug需要修复,那么需要保护当前分支上的修改,但又不能提交到暂存区和版本库,因此可以通过:git stash来储藏工作现场,等以后恢复现场。
首先储藏现场:
git stash #用于保存无法add和commit的当前状态(现场)
然后切换到右bug的分支:
git checkout master
创建bug分支:
git checkout –b issue-101
修改bug,并提交:
合并bug分支:
切换回原来的工作分支:
使用git stash pop 恢复现场
Feature分支
软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
多人协作
推送分支
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote;用git remote -v显示更详细的信息。
推送分支:git push origin branch_name
抓取分支
多人协作时,大家都会往master和dev分支上推送各自的修改。
当伙伴修改了dev,你也修改了dev,小伙伴比你早推送dev,那么你再推送dev就会推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送。
直接git pull 也会失败,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
git branch --set-upstream-to=origin/dev dev
小结
查看远程库信息,使用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,如果有冲突,要先处理冲突。
Rebase
在git pull后,也就是将本地的分支的修改和远程对应分支的修改合并
使用git rebase 就可以调整本地的提交历史线。
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。