git学习笔记
系统的学习了一下廖雪峰老师的git教程。
参考
简介
git是世界上最先进的分布式版本控制系统。
git是linux之父linus大神花了两个星期用c写的。。。
安装
windows:
直接下载gitbash:https://git-scm.com/downloads
linux/macos
1 | sudo apt-get install git #debian/ubuntu安装 |
使用
配置名称和邮件
创建版本库
1 | #linux和macos没问题,提醒一下windows不要使用cmd/powershell,使用gitbash |
仓库中.git目录用来跟踪管理版本库,不要修改!
在非空目录下 git init
也可
把文件添加到版本库
git仅可以跟踪文本文件的变动,对于二进制文件仅可以知道其改动了。
ps:二进制文件非常多,包括office三兄弟
文本文件使用utf-8编码
切勿使用新建记事本文件,记事本为utf-8 with BOM编码,若使用notepad++则改为utf-8 without BOM编码
命令
- git仓库中新建一个readme.txt文件:
git add
命令把文件添加到仓库
git commit
把文件提交到仓库
为什么Git添加文件需要 add
, commit
一共两步呢?因为 commit
可以一次提交很多文件,所以你可以多次 add
不同的文件,比如:
即add一次可以add一个或者多个文件,而commit则一次性把add的文件提交
- 重命名文件名
小结
初始化一个Git仓库,使用 git init
命令。
添加文件到Git仓库,分两步:
- 使用命令
git add
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m
,完成。
回滚
修改readme.txt文件为:
运行 git status
可以看到仓库状态和哪些文件被修改了。
运行 git diff
查看修改了什么内容
再提交
看状态
版本回退
git log
查看历史记录
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline
参数:
或者
最近4次的记录
图形化显示
commit id是SHA1计算出来的16进制大数(为防止冲突)
版本回退:
当前版本为 HEAD
,上一个版本为 HEAD^
, 上100个版本为 HEAD~100
回退上一个版本:
退回特定版本:
版本回退仅仅是吧HEAD指针指向当前版本
git reflog
用来记录每一条git命令,可以用来找以前的commit id
小结:
HEAD
指向当前版本- 版本回退命令:
git reset --hard commit-id
git log
查看提交历史,以便决定回退到哪个版本git reflog
查看历史命令,以便决定回退到哪个版本
工作区和暂存区
版本库中有一个叫stage的暂存区、master分支和HEAD指针
git add
就是把文件添加进暂存区
git add
是把暂存区文件提交到当前分支
若之后未对工作区做任何修改,则工作区clean
此时版本库变为:
总结:
Git管理的文件分为:工作区,版本库,版本库又分为暂存区stage和暂存区分支master(仓库)
工作区>>>>暂存区>>>>仓库
git add
把文件从工作区>>>>暂存区,git commit把文件从暂存区>>>>仓库,
git diff
查看工作区和暂存区差异,
git diff --cached
查看暂存区和仓库差异,
git diff HEAD
查看工作区和仓库的差异,
git add
的反向命令git checkout,撤销工作区修改,即把暂存区最新版本转移到工作区,
git commit
的反向命令git reset HEAD,就是把仓库最新版本转移到暂存区。
修改管理
git跟踪的是修改而不是文件。
第一次修改完一个文件后 git add
,再第二次修改这个文件,然后再 git commit
,只会提交第一次修改,故而git跟踪的是修改而不是文件。现在要提交第二次修改只需要: git add
这个文件,再 git commit
就行了,或者第一次修改完了不要急着 git add
,等着两次修改完了一起 git add
git commit
。
撤销修改
git checkout -- filename
:将文件咋工作区的修改完全撤销
作用是让这个文件回到最近一次 git commit
或者 git add
时候的状态:
一种是 readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是 readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git reset HEAD filename
可以把暂存区修改撤销
git reset
既可以回退版本也可以吧暂存区修改回退到工作区
小结
情况一:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file
。
情况二:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD
,就回到了场景1,第二步按场景1操作。
情况三:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用版本回退。
情况四:如果已经push到了远程仓库,完蛋。
简而言之:
没有
git add
时,用git checkout -- file
回退到与版本库最新版一致已经
git add
时,先git reset HEAD
回退到1.,再按1. 操作已经
git commit
时,用git reset
回退版本推送到远程库,GG
删除文件
- 先直接删除文件
- 使用
git rm
从版本库中删除该文件 git commit
提交更改
若误删文件,则用 git checkout -- filename
从版本库中恢复到工作区
远程仓库
我一般使用github
本地git仓库和github仓库的传输通过ssh加密,故而本地要创建ssh key:
一路回车既可,无需设置密码
~/.ssh/
下面有有 id_rsa
和 id_rsa.pub
两个文件
登录github-setting-add ssh key,填写title,粘贴pub里的内容到上面,点击add key。
GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
github仓库为公开,不要提交敏感信息
可以搭建git服务器保护代码
搭建git服务器
以ubuntu/debian为例:
1 | sudo apt-get install git # 服务器安装git |
管理公钥:
小团队管理:把团队中每个人的公钥收集起来放到服务器的 /home/git/.ssh/authorized_keys
文件里就可以。
大团队管理:使用gittosis。
git不支持权限管理!!!
添加远程仓库
- 先在github上创建一个新的仓库
- 本地仓库
git remote add origin git@github.com:herotiga/Python-100-Days.git
- 第一次推送本地文件到远程仓库:
git push -u origin master
- 以后只需要
git push origin master
ssh警告
第一次使用git clone or git push连接github会有警告
小结
- 关联远程仓库:
git remote add origin git@github.com:herotiga/learngit.git
- 关联后,使用
git push -u origin master
第一次推送master分支 - 之后每次只需要
git push origin master
从远程仓库克隆
注意:克隆下来的是一个目录
一般使用ssh,添加了ssh key之后无需输入密码。而https需要输入密码。
小结
git clone
将项目克隆下来,一般使用ssh(除非公司内部只能使用https)。
分支管理
创建分支
以上命令等同于:
查看当前分支
当前分支前面会有*
或者
合并分支
删除分支
切换分支
小结
1 | git branch # 查看分支 |