一、git相关概念
1、git文件的三种状态
- committed 已提交 ,表示数据已经安全的保存在本地数据库中
- modified 已修改 ,表示修改了文件,但还没保存到数据库中
- staged 已暂存 ,表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
2、Git项目的三个工作区域:Git 仓库、工作目录以及暂存区域。
工作区 是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域 是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’’,不过一般说法还是叫暂存区域。
Git 仓库 是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
3、Git 工作流程
(1)在作目录中修改文件。
(2)暂存文件,将文件的快照放入暂存区域。(git add)
(3)提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。(git commit -m ‘’)
即:modified(工作目录)–>staged(暂存区域)–>committed(Git仓库)
工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。 我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。所以使用 Git 时文件的生命周期如下:
二、Git仓库配置
1、在自己的git上面创建一个名为text的仓库
2、在本地创建文件夹,打开Git Bash
3、创建一个名为text的文件夹,设置用户名称和邮件地址,作为一个标识。
4、git init
mkdir text
git config --global user.name "1623354901"
git config --global user.email 1623354901@qq.com
#git init 把这个目录变成git 可以管理的仓库
git init
# 一旦使用 --global 选项,那么该命令只需要运行一次,以后无论你在该系统上做任何事情,Git 都会使用那些信息。当想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global 选项的命令来配置。
这时候你当前testgit目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,不要手动改动这个目录里面的文件,否则,会把git仓库给破坏了
5、提交内容到仓库
在text目录下新建一个记事本文件 readme.txt 内容如下:11111111
(1)使用git add readme.txt将文件添加到暂存区
git add readme.txt
(2)使用命令git commit 将文件提交到仓库
git commit -m "readme.txt"
(3)通过 git status 查看状态,是否有文件未提交
修改readme.txt文件内容,再次使用git status查看结果
内容显示文件已经被修改,未被提交
git diff readme.txt
如上可以看到,readme.txt文件内容从一行11111111改成 二行 添加了一行22222222内容。检查内容修改无误后,就可以提交到仓库了,步骤和之前一样
git add readme.txt
git status
git commit -m 'readme.txt增加了22222222'
git status
6、版本回退
在readme.txt文件中加入一行33333333
添加到暂存区,并提交到仓库
查看历史记录
#显示从最近到最远的显示日志
git log
#将每次内容显示为一行
git log --pretty=oneline
版本回退
#回退到上一个版本
git reset --hard HEAD^
#回退到上上个版本
git reset --hard HEAD^^
#以此类推
#回退到前50版本
git reset --hard HEAD~50
#回退后再次回退到最新版本
git reset --hard版本号
#获取版本号方法
git reflog
7、提交多个文件
们在readme.txt再添加一行内容为4444444,接着在目录下新建一个文件为test.txt 内容为test,我们先用命令 git status来查看下状态,如下:
8、Git撤销修改和删除文件操作
(1)撤销修改
在readme.txt文件中增加内容5555555555
撤销此次操作方法
1>直接更改文件,add commit
2>恢复到上一个版本,使用git reset --hard HEAD^
3>gitcheck – file,丢弃工作区的修改
注意
readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态
另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态
例如,在文件中加入666666666,放到暂存区,在增加7777777777,不添加到暂存区,使用撤销命令,查看内容,只把内容7777777777撤销了
注意:命令git checkout – readme.txt 中的 – 很重要,如果没有 – 的话,那么命令变成创建分支了。
(2)删除文件
三、远程仓库
1、github上面注册github账号
2、创建SSH Key,在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:ssh-keygen -t rsa –C “youremail@example.com”
这时候在.ssh目录下看看有没有公钥(id_rsa.pub),私钥(id_rsa)
3、登陆github,打开settings中的SSH and GPG keys,在Key文本框里黏贴id_rsa.pub文件的内容。添加key,然后就能看到自己的key了
4、远程同步
(1)创建一个新的仓库,命名为test
然后设置同步
在本地仓库下运行
git remote add origin https://github.com/1623354901/test.git
#将本地仓库分支master内容推送到远程仓库中去
# -u:Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master
以后在本地再做了修改之后,通过
git push origin master
把本地master分支的最新修改推送到github上了
5、创建与合并分支
原理:廖雪峰网站分支部分里讲解的很详细
#创建分支
git checkout -b dev
#上边命令相当于
#git branch dev
#git checkout dev
#查看当前分支
git branch
git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:Creating a new branch is quick
然后提交:
git add readme.txt
git commit -m "branch test"
现在,dev分支的工作完成,我们就可以切换回master分支:
git checkout master
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
现在,我们把dev分支的工作成果合并到master分支上:
git merge dev
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
合并完成后,就可以放心地删除dev分支了:
git branch -d dev
6、解决冲突
新建一个分支feature1
git checkout -b feature1
修改readme.txt最后一行,改为:
Creating a new branch is quick AND simple.
在feature1分支上提交:
git add readme.txt
git commit -m "AND simple"
切换到master分支:
git checkout master
在master分支上把readme.txt文件的最后一行改为:
Creating a new branch is quick & simple.
git add readme.txt
git commit -m "& simple"
现在,master分支和feature1分支各自都分别有新的提交,变成了这样:
种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
直接查看readme.txt的内容:
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:Creating a new branch is quick and simple.
再提交
现在,master分支和feature1分支变成了下图所示:
用带参数的git log也可以看到分支的合并情况:
删除feature1分支
7、分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。