前言
阅读廖雪峰老师的git教程,在里面一步一步跟着走,学习到了很多,自己在总结一下,方便以后使用
git简介
git是目前世界上最先进的分布式版本控制系统
Git is a distributed version control system
是Linux作者使用Linus花了两周时间用C写了一个分布式版本控制系统。
集中式和分布式区别
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
git常用指令
创建版本库
git init
Initialized empty Git repository in your file address
将修改添加到本地暂存区
// 添加指定文件
git add <file>
// 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
git add .
// 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add -u
// 提交所有变化
git add -A
成功添加将不会有任何提示
将暂存区代码提交到当前分支
git commit -m"xxx"
提交成功后会显示
1 file changed, 0 insertions(+), 0 deletions(-)
分别代表修改了几个文件,几行插入与几行删除
对比工作区和当前分支文件差异
// 没有将修改提交到暂存区时 对比文件差异
git diff <file>
// 将修改提交(git add .)到了暂存区时,对比文件差异
git diff HEAD -- <file>
查看当前分支代码状态
git status
丢弃工作区修改
git checkout -- <file>
// 或 2.3以上的git版本可以使用
git restore <file>
丢弃暂存区修改
git reset HEAD <file>
// 或 2.3以上的git版本可以使用
git restore --staged <file>
版本回退
// git log拿到所有提交的日志 找到commit id
git log
// 复制commit id 前几位即可 git会自动寻找
git reset --hard <commit id>
直接回退到上一版本HEAD^
,上上一个版本就是HEAD^^
,以此内推
// 或者直接使用回退到上一版本
git reset --hard HEAD^
查看记录的所有命令
Git提供了一个命令git reflog
用来记录你的每一次命令,可以查看每一次commit
、reset
操作的commit id
和message
git reflog
链接远程仓库
// 第一步
git remote add origin <github address>
// 第二步把master分支推送到线上master分支并关联起来
git push -u origin master
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
克隆远程仓库
git clone <github address>
查看分支列表
git branch
创建分支
- 创建分支
git branch dev
- 切换分支
git checkout dev
// 高版本git
git switch dev
- 创建并切换到dev分支
git checkout -b dev
//高版本git
git switch -c dev
合并分支
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,使用--no-ff
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
使用Fast forward
方式
git merge <name>
使用--no-ff
方式
这种方式会自动生成一次commit记录
git merge --no-ff -m"xxx" <name>
删除分支
// 合并后删除
git branch -d <name>
// 没有合并强制删除
git branch -D <name>
日志消息
git log
// 日志消息一行展示
git log --pretty=oneline
// 图形化日志
git log --graph --pretty=oneline --abbrev-commit
储存暂存区和工作区差异
git bash
查看储存区储存列表
git stash list
释放储存区
-
一是用
git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除; -
另一种方式是用
git stash pop
,恢复的同时把stash内容也删了 -
第三种方式是通过
git stash list
拿到当前的存储列表,通过git stash apply stash@{0}
来切换对应储存列表
复制commit
在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 <commit id>
拉取线上仓库代码
- 拉取对应分支代码
git pull origin <name>
- 拉取对应分支代码并创建本地分支
git checkout -b <name> origin/<name>
推送代码到线上仓库
git push origin <name>
本地分支和线上分支建立关系
建立关系后,可以直接使用git pull
拉取线上当前分支代码,或直接使用git push
将本地代码推送到线上分支
git branch --set-upstream <name> origin/<name>
变基解决git的提交历史为一条干净的直线
rebase操作的特点:把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。
git rebase
创建标签
默认标签是打在最新提交的commit上的
git tag <tagName>
有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
git tag <tagName> <commit id>
还可以创建带有说明的标签,用-a
指定标签名,-m
指定说明文字,若不输入commit id
则默认打在最新提交的commit上
git tag -a <tagName> -m"xxx" <commit id>
展示标签
展示打了标签的commit具体信息
git show <tagName>
展示全部tag
git tag
推送标签到线上仓库
推送某个标签
git push origin <tagName>
推送全部
git push origin --tags
删除标签
删除本地标签
git tag -d <tagName>
删除线上仓库标签
git push origin :refs/tags/<tagName>
git配置别名
有没有经常敲错命令?比如git status
?status
这个单词真心不好记。
如果敲git st
就表示git status
那就简单多了,当然这种偷懒的办法我们是极力赞成的。
我们只需要敲一行命令,告诉Git,以后st
就表示status
:
git config --global alias.st status
这样子配置之后以后如果要使用git status
直接输入git st
就可以了
可以找到Git的配置文件去快速修改,在用户目录下的.gitconfig
中
[user]
name = your Name
email = your email
[core]
autocrlf = false
[color]
ui = true
[alias]
g = git
st = status
ch = checkout
co = commit
br = branch
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
mr = merge
sw = switch
pl = pull
ps = push
bs = branch --set-upstream
a = add
如果你想git
都懒得打,你可以在bash去输入这条语句
alias g=git
,这样子以后可以直接使用g st
来代替git status
结尾
这篇文章主要是总结了廖雪峰老师Git教程的内容,且主要是总结各个指令如何使用,如果你对git还不太熟练,请你一定要看看廖雪峰老师的这篇文章,里面从头都尾给你介绍了git的使用,并且会教会你在那些情况如何正确的使用git指令,看完之后肯定会受益匪浅。