目录
1、对于Git的理解
Git是一个分布式版本管理系统!!!
与Git密不可分的是仓库,仓库在电脑中的表现形式为文件夹;这里demo文件夹就是一个Git仓库;
打开文件夹里面有1个txt文件和1个.git文件夹(如果看不到是隐藏了,打开隐藏即可);
Git里面有三个概念,工作区、暂存区(stage)和仓库;
工作区简单点理解就是这个文件夹中除了.git文件夹以外的部分,这里是readme.txt文件;
暂存区(stage)和仓库为了便于理解可以把它看作是.git文件夹,实际上.git文件夹是Git用来管理这个仓库的;
2、安装Git
1、安装Git,去官网下载安装包,直接百度Git就可以出来;
2、安装完成后鼠标右击后会发现集成了下面两个命令; Git Bash 是Linux操作,Git GUI是图形化操作,一般我们使用Git Bash,这也是本文中介绍的;值得注意的是,当在哪个文件夹中点击,当前的Git路径就是哪个,所以我们可以在任何我们想要的地方创建Git仓库;
3、使用Git
3.1 一些必备的Linux命令
mkdir demo 创建demo文件夹;
cd 改变文件路径;
touch readme.txt 创建readme.txt文件;
pwd 显示当前路径;
3.2 提交一个文件到仓库
Git init --初始化仓库; 将demo文件夹初始化成一个Git仓库;
打开readme.txt文件,写入两句话
git is a distributed version control system.
git is a free system.
使用cat <file> 命令可以查看文件内容;
git status --查看当前Git的状态,能更好的指导我们下一步操作;
可以看到readme.txt文件未被追踪,可以使用git add <file>去添加;
git add --将工作区的文件添加到暂存区(stage);
这里可以看到git的状态发生了变化,文件已经被add到暂存区(stage)但是没被提交;
现在我们使用git commit 命令进行提交,-m是一个备注,就是记录我们这次改变做了什么,这里是新建了一个文件;
然后我们查看一下Git的状态,没有东西提交,工作树是干净的,提交完成;
现在让我们看一下demo文件夹;
有一个绿色的对号,提交完成;
修改readme.txt,添加一句话:git is fast.
文件夹的状态发生了变化,使用git status查看一下Git的状态;
可以看到,readme.txt文件被修改,使用add <file> 添加到暂存区,这和我们上面第一次提交文件的步骤是一样的;
总结:Git提交文件需要先add添加到暂存区,然后再commit提交,commit后面要写提交信息;当文件发生改动时,要再次执行add和commit;
3.3 撤销和删除
接上一步操作,修改了readme.txt文件但是没有add,查看一下Git的状态
这里有两个提示:
使用 add <file> 添加到暂存区;
使用 git restore <file> 放弃修改;
使用git restore命令并查看文件内容;
可以看到放弃了修改;然后我们重新修改再add到暂存区并查看Git状态;
可以看到已被添加到暂存区(stage)
提示可以使用git restore --stage <file> 来撤销操作;
使用该命令
可以看到又回到了add之前的状态;
如果再commit之后还能修改吗?让我们试一下
再提交之后查看Git状态,没有撤销命令的提示,所以再commit之后是不能进行撤销的;那么如果commit了不想要的文件到仓库了怎么办?只能delete了;
删除文件,主要工作区文件和commit到仓库的文件;
使用rm <file> 删除工作区文件,这是Linux命令;
使用git rm <file>删除git仓库中的文件,需要注意的是,再git rm之后要commit;
新建一个test.txt文件并提交到Git仓库;
使用git rm <file> 进行删除;
查看Git状态,提示删除;
提示可用git restore --staged <file> to unstage, 这和前面撤销add的命令一样,这也就解释了为什么再git rm之后还要commit,这一步只是提交到了暂存区;
然后我们commit到仓库;
总结:在commit之前都可以进行撤销操作,可根据界面的提示进行操作;
撤销:
未add:git restore <file> 或着 git checkout -- <file>;
add后:git restore --stage <file> 或者 git reset HEAD <file>;
删除:
工作区:rm <file>;
仓库:git rm <file>, 之后还要进行commit;
3.4、Git的一些其他操作
使用git diff <file>查看文件更改了什么,diff即difference
在readme.txt文件中再加一句话; 可以很清楚的看到我们对readme.txt进行的操作;
使用git log查看进行的所有操作,如果不能退出可以按键盘上的Q键;
从开始到现在我们提交的所有操作都可以看到;如果嫌麻烦,可以使用精简版的命令
git log --pretty=oneline
注意每次提交都有一长串字母+数字,这是commit id,它是一串16进制的是数字,可以理解为每一个版本的版本号,通过它可以找到对应的版本,有点类似于指针。使用git reset 可以回退到上个版本,git reset --hard HEAD^ --回退一个版本,HEAD^^ --回退两个,回退100个--HEAD~100; // HEAD是一个仓库的指针,它指向哪,当前就显示什么(拙见);
查看现在的readme.txt文件内容;
readme.txt中的内容也发生了变化,回退到了3个版本之前,现在的readme.txt是3个版本之前的了,能不能回到现在呢?当然可以,前面说了commit id --唯一的版本号
使用 git reset -- hard <commit id> // commit id 不用全部输入完,只输入前几位就行,因为它们很难相同,系统会自动进行查找;
可以看到又变了回来,并且readme.txt中的内容也发生了改变,这就是版本管理系统,可以随时随地的看到任何一个历史版本;这里有一个问题,如果commit id 找不到怎么办?往前翻,但是如果你clear了,那就是个bad news了;别急,毕竟它是Git,
使用git reflog 命令;
commit id 又出来了;
总结:使用git reset --hard <commit id>可以查看不同的提交版本,git reflog可以查看已清除的commit id;
3.5、分支
前面进行的操作中,我们经常会见到一个东西 HEAD -> master,head指向的是master(主分支)这个分支;在工作中我们可以创建自己的分支,然后合并到项目的主分支上面去,我们自己的分支和主分支之间是互不干扰的;有点类似于分组做小组作业我们做自己的部分,然后最后整合到一起,彼此之间都互不影响;
创建分支
git checkout -b <branch name> 或者 git switch -c <branch name>
// 创建并切换分支,它相当于git branch <branch name>, git checkout <branch name>两句命令;
切换分支
git checkout <branch name> 或者 git switch <branch name>
可以看到顺利的创建并且切换;
使用git branch 可以查看仓库的所有分支,但前所在分支前面有一个*;
之前我们的操作都是在master分支上面进行的,现在我们在dev分支上面进行操作;
在readme.txt文件中添加一句话,然后add commit;
然后切换到master分支并查看realme.txt文件的内容;
可以看到我们刚才添加的内容并没有出现;由此可以看出dev分支和master分支是互不影响的,那么如何将dev分支上面的操作合并到master主分支上面呢?
使用git merge <branch> // 将指定分支内容合并到当前分支;
再次查看readme.txt内容;
可以看到内容发生了变化;
注意:merge 合并分支有两种模式
一种是Fast-forward(默认模式),这种是直接将HEAD指针指向dev,删除分支后就会去掉分支信息;
一种是关闭Fast-forward(no-ff),这种模式在git后会产生一个新的commit;
使用git log --graph 可以看到分支图合并;
git log --graph --pretty=oneline --abbrev-commit 简化提交信息;
可以看到HEAD直接指向了master和dev;
这里我们先删除dev分支;
使用git branch -d <branch name> 删除;
重新创建一个分支并且重新提交一个test.txt的文件,然后使用关闭Fast-forward模式合并;
使用git merge --no-ff -m "merge with no-ff" dev
因为会产生一次新的提交,所以有-m备注信息;
查看分支合并图;
能够清楚的看到做出了合并,而Fast-forward看不出来;
如果两个分支提交的文件都发生了变化呢?
在这里我们分别在master分支和dev2分支上面更改readme.txt文件并commit;
现在我们分别在两个分支上面对readme.txt文件进行了修改,现在尝试合并;
提示自动合并readme.txt文件,有冲突,要先处理冲突然后再提交;
我们先查看一下readme.txt文件的内容
可以看到最后一句话有冲突,我们手动修改;
按照上面的提示是进行commit的操作,但是再commit之前是需要add的,所以我们要进行add操作,如果不知道怎么做我们可以查看一下git的状态;
这时Git告诉我们有未合并的路径,可以使用git merge --abort 放弃合并或者使用git add <file>标记解决方案;
使用git add <file>提交
使用 commit结束合并;
合并完成,然后我们看一下合并的分支图;
合并情况类似于no-ff;
因为两次操作针对的都是test.txt文件,但是修改后test.txt文件不同,所以需要我们进行处理;
目前为止进行的所有操作都在Git本地仓库,并没有推送到GitHub或者gitee,下面将推送到gitee;
先从远程克隆一个仓库,clone的目的就是把本地仓库和gitee中的仓库关联起来;
test文件夹就是从远程克隆的仓库;
使用git push origin <branch name> 可以推送到远程仓库的指定分支;
gitee中就会出现推送;
使用git remote 查看远程仓库中的分支,只能看到master分支;
从GitHub或者gitee中clone仓库时只会clone master主分支,别的分支需要自己对应起来;
使用git switch -c <branch name> origin/<branch name>;
提示成功和远程的dev分支对应起来;
发现本地仓库中的内容也发生了改变,这些就是远程仓库中的dev分支的内容;
新建一个readme.py文件并推送到dev分支;
gitee中的dev分支中也出现了readme.py 文件;
使用git stash 可以隐藏当前的工作状态,可以先处理一些紧急的事情;
当前状态时待commit,使用git stash
使用git stash list 可以看到当前隐藏了几个;
使用git stash apply 可以恢复但是不删除stash隐藏的内容,删除用git stash drop;
使用git stash pop可以在应用后直接删除;
总结:使用git stash可以隐藏当前的工作状态;当同一个文件再不同的分支上面都发生了修改时,可能会导致合并冲突,这时需要我们手动修改,然后在提交;push到远程仓库也是一样,如果本地仓库中的文件和远程仓库中的文件发生冲突,要先git pull抓取最新的提交然后手动修改冲突后再push;
4、Git常用命令总结
git init 初始化文件夹为Git仓库;
git clone <gitee or github> 从远程clone仓库到本地;
git add <file> 提交指定文件到暂存区;
git add . 提交所有文件到暂存区;
git commit -m "备注信息" 提交到本地仓库;
git status 查看Git状态;
git checkout --<file> / git restore <file> 撤销文件修改;
git reset HEAD <file> / git restore --staged <file> 撤销提交到暂存区的文件;
rm <file> 删除工作区中的文件;
rm -r <directory name> 删除工作区中文件夹;
git rm <file> 删除本地仓库中文件;
git diff <file> 查看文件更改内容;
git log 查看提交日志;
git log --graph 查看分支合并图;
git reflog 每一次命令的记录;
git reset --hard HEAD^ 回退一个版本;HEAD^^ 回退两个版本 ……;
git reset --hard <commit id> 前进到指定版本;
git branch 查看仓库分支;
git branch name 新建一个分支,但是不切换;
git checkout <branch name> / git switch <branch name> 切换分支;
git checkout -b <branch name> / git switch -c <branch name> 创建并切换分支;
git branch -d <branch name> 删除分支;
git merge <branch name> 将指定文件夹合并到当前文件夹;
git merge --no-ff -m "merge with no-ff" <branch name> 以普通模式合并;
git cherry-pick <commit id> 复制一个特定的提交到当前分支;
git stash 保存当前工作状态;
git stash list 查看隐藏的工作状态;
git stash apply 恢复但是不删除隐藏的工作状态;
git stash drop 删除隐藏的工作状态;
git stash pop 恢复后自动删除隐藏的工作状态;
git remote 查看远程仓库信息;
git push origin <branch name> 推送到远程指定分支;
git checkout -b <branch name> origin/<branch name> 创建远程分支到本地仓库;
git push origin --delete <branch name> 删除远程分支;
git pull 抓取远程最新提交;
git rebase 将未push的分支整理成一条直线;
5、最后
本篇博客是我自己的一个学习回顾,本次学习的是廖雪峰老师的Git教程,想要更深入的了解可参考廖老师的教程,这里附上链接:https://www.liaoxuefeng.com/wiki/896043488029600
除此之外,gitee后面也提供了很多的Git学习入口。