What is it?
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
工作流程:
- 克隆Git资源作为你的工作目录
- 可以在你克隆的资源进行修改
- 如果有修改,可以更新远程Git资源
- 检查修改是否正确
- 提交你的更改
- 错误提交可以撤回
菜鸟教程上的图:
*
一些名词概念
工作区 : 当然是你电脑上的目录
暂存区 : 暂时存储你的修改,也叫做stage||index,一般存在.git目录下的index文件,所以也可叫索引区
版本区 : 也就是你工作目录下的隐藏文件: .git
菜鸟上的工作图:
从左到右、上到下的箭头可以看出:
- 第一条:可以通过
git add
命令将工作目录中的文件添加到暂存区 - 第二条:可以通过
git commit
命令将暂存区的目录提交到版本库,同时master指向暂存区的目录树 - 第三条:可以通过
git checkout
. 或者checkout --<文件名字>
将暂存区的一个或者所有的文件替换工作区的文件。 - 第四条:可以通过
git reset HEAD(相当于master)
将HEAD代表的分支指向的目录树替换掉暂存区的目录树 - 第五条:可以通过
git rm --cached
来删除暂存区的文件 - 第六条:可以通过
git checkout HEAD <file>
将HEAD指向的master分支的全部或部分文件替换暂存区和工作区的目录
常用操作
How to create a 仓库?
- 进入一个目录打开git bash 或者cd 进去
- 执行初始化操作,在当前目录生成隐藏文件.git
git init
也可以指定目录作为git仓库
git init newrepo
- 然后添加将一些文件交给git控制
git add <文件名>
- 然后你就可以提交你的修改啦
git commit -m "写一些备注"
当然也可以指定提交缓存区的特定文件
git commit 1.txt 2.txt 3.txt -m "写一些备注"
但注意,缓存区必须有这些文件,不然提交个寂寞
提交完成以后,它就存到你的本地仓库里啦!
提交到远程仓库之前的操作
你尽可以去github哪里注册账号,创建一个仓库,或者可以去国内的gitee注册,我比较喜欢gitee,因为我英文不好 :D
首先当然是创建你的远程仓库
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201215210331578.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvZGluZ19kZWxpdmVy,size_16,color_FFFFFF,t_70
下一步就是设置权限了
在本地设置你全局个人信息,这样上传给远程仓库的时候就知道你是谁
git config --global user.name “潘立杰”
git config --global user.emali “1261349543@qq.com”
然后还要设置哪些人可以上传到你的仓库
例如我就设置了两个用户
打码的就是很重要的公钥,将他绑定到你的本地,那么如何绑定呢?执行下面一个语句
$ ssh-keygen -t rsa -C “1261349543@qq.com”
然后注意看输出的结果,里面有生成文件的位置:
找到以后打开它,copy里面的东西,粘贴在将你在gitee的
标题可以设置成具体的用户比如1261349543@qq.com这样好区分
准备工作就完成了
如何贡献自己的代码呢?
首先,你是不是要找到远程仓库(remote)?
之前,你可以看看有没有绑定了远程仓库:
git remote -v
一开始肯定没有的,不然还添加做什么,之前,刚刚创建好的仓库有一个密钥(SSH)
把它复制出来:
添加远程仓库:
git remote add mygitee SSH
这里的mygitee是一个别名,随你怎么取,但是后面的SSH就是创建仓库时我让你复制的那串,别说你忘记复制,那就再回去复制一遍。
git remote -v
看当你本地绑定哪些远程仓库
当你的仓库有了写东西以后,也就是提交(commit)了以后,就可以推送(push)到远程仓库gitee:
git push mygitee master
mygitee是你刚才绑定的远程仓库, master是分支,这个后面再介绍
以上就是推送(上传)过程-
再深入看看什么是分支branch?
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
这样解释肯定模糊,实例操作感受感受:
我们默认实在master分支里,可以当主分支
先创建一个分支:
git branch testing
切换到指定分支:
git checkout testing
你可能回想这样操作:
创建的同时切换到新分支:
git checkout -b testing
先说怎么删除:
git branch -d testing
下面用一个实例展示一下:
先再空文件夹创建仓库:
创建两个文本文件:
touch test1.txt
touch test2.txt
此时是两个空文件:
先添加到缓存区:
git add test1.txt test2.txt
看看缓存状态:
git status -s
A说明有两个新添加(add)文件
将test1.txt 和test2.txt这两个文件提交到自己的本地仓库:
git commit -m “master分支第一次提交”
接下来开始了:创建一个分支,并切换过去:
git checkout -b testing
看看自己当前都有啥分支
git branch
星号绿色代表当前所在的分支
这时候我在这个分支创建另一个文件test3.txt
touch test3.txt
这时候看看缓存区状态:
??代表你还没有对test3.txt进行操作
这时候我们添加到缓存区:
git add test3.txt
再看状态就是之前的绿A了
这时我们也提交到本地仓库的testing分支中:因为我们现在本来就在testing分支中,所以直接提交就ok了:
git commit -m “testing分支第一次提交”
准备工作已经就绪,这时候切换回我们原来的master主分支中:
git checkout master
你会神奇地发现:
在testing分支创建的test3.txt,不见了!你在切换回testing分支中你会发现,哎,又出来了,这是啥呢?
当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
说人话就是:不管你在testing分支中怎么操作,只要切回master,工作目录就会还原成你master最后一次提交的状态,
我在切换testing之前,我提交了一次,也就是新添加了两个文件,它会生成一个快照,记录你当前的状态,当你从其他分支回来的时候,会恢复成那个快照,也就是那个时候的状态。
使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。各个分支互不影响
ok!
但我们最终希望某些分支的工作进度合并到我们主分支上:
这时候就要合并分支了:把testing分支合并到当前所在的分支:
branch merge testing
就像我现在是在master分支:把testing合并过来,要记得我们在testing分支创建了一个test3.txt,这时候master分支是没有这个文件的:
当你执行合并指令后,你发现哎,test3.txt出来了。真tm神奇!
但是,我们不应该只是合并文件,内容也要合并.
在此之前,合并之后我还想切换回testing是不可以的,留着也没啥用了,把他删掉:
git branch -d testing
接下来我们手动修改test2.txt里面的内容:再次添加test2.txt到缓存区,再提交commit:
我们重新再创建testing分支,然后再次创建test3.txt,记得提交commit
我们在test2.txt中手动添加内容:
这时候我们将修改添加后提交到本地仓库
git add test2.txt
git commit -m “添加test2.txt到testing分支”
回到主分支:进行合并testing分支:
git checkout master
git merge testing
这时候可以看到test3.txt重新出现,意料之中,再看看test2.txt里面的内容,要记得我们在master和testing分支中都添加了内容:
内容是合并了,但是感觉不太好看.但怎么办呢,只能老老实实修改啦
打开文件进行编辑
vim test2.txt
按下i键进入编辑模式, 修改结束后按下Esc退出编辑模式 然后输入:wq 回车,退出文件编辑
cat test2.txt可以看看文件内容:
看看工作区状态:
git status -s
这时候添加修改好的test2.txt到缓存区,然后把所有的修改提交到仓库就ok啦
怎么才算代码搬运工,当然是下载
下载(克隆)远程仓库
git clone <reop>
也可以下载到指定目录
git clone <reop> <directory>
例如可以克隆的时候重命名文件夹
git clone git://github.com/schacon/grit.git mygrit
当然还有比较高级的方法:
。。。。
设置一些自己的信息
配置用户信息
git config --global user.name "xxxx" git config --global user.email "xxxx@xxx.xxx"
去掉–global 的话只对当前的仓库有效
提交自己代码
退回指定版本
默认格式:git reset [–soft | --mixed | --hard] [HEAD]
/- -hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交,谨慎使用 –hard 参数,它会删除回退点之前的所有信息/
/- -mixed参数将缓存区的文重置为上一次提交的状态/
/- - soft 参数退回到某个版本
返回到上一次版本
git rest --soft HEAD
返回到指定版本
git rest --soft HEAD
返回上上上个版本
git reset --hard HEAD~3
HEAD 表示当前版本
HEAD^ 表示上一个版本
。。。。以此类推(也可以用~)
大冬天写这玩意真冷,手僵了。