Git安装
windows安装git
在电脑管家上搜索git,一路安装即可
linux安装git
yum install git
Git初始化设置
git config --global user.name "andy"
git config --global user.email "1065374672@139.com"
因为git是分布式版本控制系统,所以机器自报家门,global表示本机上所有的git仓库使用这个配置
创建版本库
版本库就是一个仓库,是一个文件夹,这个文件夹里面所有的文件否可以被git管理起来
- 创建仓库
mkdir learngit
cd learngit
pwd
/e/home/git
pwd命令用于显示当前目录。在我的Mac上,这个仓库位于 /e/home/git
- 通过git init将这个文件夹变成Git可以管理的仓库
git init
- 新建一个readme.txt文件
Git is a version control system.
Git is free software.
- 用命令git add ,把文件添加到仓库
git add readme.txt
- 用命令git commit ,把文件提交到仓库
git commit -m '写备注,什么操作'
# 注:初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
使用命令git add <file>,注意,可反复多次使用,添加多个文件;
使用命令git commit -m <message>,完成。
时光机穿梭
1 版本回退
-
用git log查看提交的历史记录
git log命令显示从最近到最远的提交日志如果嫌输出信息太多,看得眼花缭乱的,可以试试加上
--pretty=oneline参数:git log --pretty=oneline 26f886758584eee35dbf9d27c1d33b13c42c3c74 (HEAD -> master) 哈哈哈哈 be1d085963d62092e326afb6c455b41c70b31463 new add 1df0a86cb7a638b07d61f699a5bb8689926ba405 wrote a readme file -
版本回退就是HEAD
# 想回退到上一个版本就是
git reset --hard HEAD^
# 哪想回退到哪一个版本就在HEAD后面就在后面加上多少个^
# 要是要回退10个版本
git reset --hard HEAD^^^^^^^^^^
- 回退版本之后后悔了git refolg
# git reflog用来记录你的每一次命令
git reflog
26f8867 (HEAD -> master) HEAD@{0}: reset: moving to 26f8867
1df0a86 HEAD@{1}: reset: moving to HEAD^^
26f8867 (HEAD -> master) HEAD@{2}: commit: 哈哈哈哈
be1d085 HEAD@{3}: commit: new add
1df0a86 HEAD@{4}: reset: moving to HEAD^
5e38a0e HEAD@{5}: commit: append GPL
1df0a86 HEAD@{6}: commit (initial): wrote a readme file
终于舒了口气,从输出可知,append GPL的commit id是1094adb,现在,你又可以乘坐时光机回到未来了。
git reset --hard 26f8867 # 回到哈哈哈哈
# 注
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
2 工作区和暂存区
工作区
就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:
版本库
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
暂存区
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
3 管理修改
因为Git跟踪并管理的是修改
# 查看工作区和版本库里面最新版本的区别
git diff HEAD -- readme.txt
如果不用git add到暂存区,那就不会加入到commit中
4 撤销修改
git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git reset HEAD readme.txt
Git同样告诉我们,用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
小结
又到了小结时间。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
5 删除文件
rm text.txt # 删除文件库里面的文件
git rm text.txt # 删除版本库里面的文件,不要忘记git commit
# git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
git checkout -- test.txt
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
远程仓库
1 设置远程仓库
Git是分布式版本控制系统
第一步: 创建ssh
- 创建github账号,上面的项目都是开源的,想要私有的话就需要交点保护费
- 用户主目录下 再看看这个目录下有没有
id_rsa和`id_rsa.pub这两个文件,有的话跳过下一步 - win+r 复制ssh-keygen -t rsa -C "youremail@example.com",然后一路回车
id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第二步: 将公钥添加到github中
点击用户头像-->settings-->SSH and GPG keys--> 填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
# 注
github允许添加多个keys,有多个电脑,只需要添加多个keys就可以实现代码的推送
2 添加远程仓库
现在本地有一个仓库,想要在github中创建一个仓库,实现两个仓库之间的同步,这样就可以让其他人通过仓库来协作开发
在github中创建一个仓库
点击加号-->New repository-->填写Repository name 其他的保持默认-->点击create Repository
创建一个仓库之后,这个仓库是空的,按照仓库里面的提示在本地git中将本地仓库和远程仓库同步
# 连接远程仓库
git remote add origin https://github.com/andygouyong/learngit.git
# 将本地仓库代码同步到远程仓库
git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
后面有了修改之后,提交代码使用如下方式
git push origin master
# 注
小结
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了
3 从远程仓库克隆
上面的操作是先有本地仓库,后创建远程仓库的关联方式
现在从零开发最好的方式就是先创建远程仓库,然后从远程仓库克隆
创建远程仓库步骤
点击加号--> New repository --> 填写Repository name ,勾选 Initialize this repository with a README
--> create repository
这样,我们点击新建的仓库会发现中有一个REAME.md的文件,这个文件可以填写有关仓库的一些介绍
从远程仓库clone代码
git clone git@github.com:andygouyong/gitskills.git
# 注
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
分支管理
1 git checkout
创建分支的目的就是实现协同开发,每个人一个分支,互不影响
[]: www.liaoxuefeng.com/wiki/896043… "点我 思密达"
创建dev分支,并且切换到dev分支
git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令
$ git branch dev # 创建新的分支
$ git checkout dev # 切换分支
用git branch 查看当前分支
$ git branch
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。
我们可以在dev分支上正常提交,对我们的代码进行更改
提交之后,我们可以发现dev分支上有提交的数据,但是主分支上没有,这个时候我们就要合并分支
在主分支上合并分支 git merage dev
git merage dev # 合并分支
git branch -d dev # 删除分支
2 switch
我们注意到切换分支使用git checkout,而前面讲过的撤销修改则是git checkout --,同一个命令,有两种作用,确实有点令人迷惑。
实际上,切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支:
创建并切换到新的dev分支,可以使用:
$ git switch -c dev
直接切换到已有的master分支,可以使用:
$ git switch master
使用新的git switch命令,比git checkout要更容易理解。
# 注
小结
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
3 解决冲突
合并之后有冲突的话,手动修改代码
用git log --graph命令可以看到分支合并图。
4 多人协作
- 查看远程库信息,使用
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,如果有冲突,要先处理冲突。
标签管理
1 创建标签
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
命令git tag可以查看所有标签。
2 操作标签
命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
Gitee
- ssh-keygen -t rsa -C "15837699890@139.com" 生成公钥
- 在gitee中填写公钥
- 在gitee中创建仓库
- git clone ssh地址