Git基础与实战
一、起步
1、分布式版本控制系统
代码存在服务器仓库上,任何一处都是对服务器的镜像,每一次克隆操作都是对代码仓库的备份。
2、Git怎么保存文件?
(1)当提交更新或保存项目状态时,Git会对全部文件创建快照
Git 更像是把数据看作是对小型文件系统的一系列快照。
在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。
为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
Git 对待数据更像是一个 快照流。
(2)几乎所有操作都在本地执行
Git有本地仓库,在本地磁盘上就有项目的完整历史,不需外连到服务器去获取历史,所以大部分操作看起来瞬间完成。
3、Git的三种状态
-
已修改(modified):修改了文件,还没保存到数据库
-
已暂存(staged):对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
-
已提交(committed):数据已经安全地保存在本地数据库中
4、Git的三个阶段
三种状态对应了项目的三个阶段:工作区、暂存区、Git仓库
工作区:从Git仓库的某个版本独立提取出来的内容,放在磁盘上使用和修改
暂存区:是一个文件,保存了下一次将要提交的文件列表信息
Git仓库:用来保存项目的元数据和对象数据库的地方,执行clone时复制的就是这里的数据
5、基本的Git工作流程
(1)在工作区中修改文件
(2)将想要提交的下次更改选择性地暂存,只会将更改的部分加入到暂存区
(3)提交更新,找到暂存区的文件,将快照永久性存储到Git仓库
Git仓库中保存的是已提交状态;文件已修改并放入暂存区,属于已暂存状态;如果自上次检出后,做了修改但没放到暂存区就属于已修改状态
6、安装Git
7、Git配置
用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
--global只要运行一次,之后无论做什么都会使用这些信息
二、Git基础
主要任务:配置并初始化一个仓库(repostory)、开始或停止跟踪(track)文件、暂存(stage)或提交(commit)修改,如何向远程仓库推送(push)以及如何从仓库拉取(pull)文件
1、获取Git仓库
两种获取Git仓库的方法:
(1)在已存在目录中初始化Git仓库;
空目录:
在 macOS 上:
$ cd /Users/user/my_project
$ git init
以上操作会创建一个.git的子目录,包含了初始化的Git仓库中所有必须文件,此时项目中的文件还没有被跟踪
已存在文件的目录:
追踪这些文件并进行初始化提交,git add指定要跟踪的文件,git commit进行提交
(2)从其他服务器克隆一个已存在的Git仓库
git clone操作执行的是创建远程仓库镜像,克隆仓库的命令是 git clone <url>
Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议
2、每次记录更新到仓库
本地有一个真实项目的Git仓库,并从这个仓库中检出了所有文件的工作副本
工作目录下的每一个文件不外乎有两种状态:已跟踪或未跟踪,已跟踪的文件是被纳入版本控制的文件,
(1)检查当前文件状态
git status
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
工作目录很干净,说明自上次提交后未更改
(2)跟踪新文件
git add
只要在 Changes to be committed 这行下面的,就说明是已暂存状态。
(3)暂存已修改的文件
出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新要用git add命令
git add命令总结:开始跟踪新文件、把已跟踪的文件放到暂存区
(4)修改已暂存的文件
需要再次执行git add
(5)状态展览
git status
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记
-
修改文件后已暂存:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: ***
-
修改文件后未暂存:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory)
modified: ***
(6)查询未暂存的文件修改了那些部分
-
git diff:比较的是工作区中当前文件和暂存区快照之间的差异
-
git diff --staged / git diff --cached:已暂存文件与最后一次提交的文件差异
(7)提交更新
git commit
在此之前,务必使用git status查看是否有文件还没git add过
在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行,如下所示:
$ git commit -m "Story 182: Fix benchmarks for speed"
提交时记录的时放在暂存区域的快照,每次提交操作都是一次快照,已经被纳入了版本管理,可以回到这个状态或者进行比较。
(8)跳过使用暂存区域
git commit -a:Git会自动把所有已经跟踪过的文件暂存起来一起提交,跳过git add步骤
-a选项使本次提交包含了所有修改过的文件
(9)移除文件
git rm:从git中移除某个文件,就必须从已跟踪文件清单中清除(从暂存区移除),并会连带从工作目录中删除指定的文件
下一次提交时,已删除的文件就不会被纳入版本管理。如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项-f,用于防止误删尚未添加到快照的数据,这样的数据不能被Git恢复。
git rm --cached:从Git仓库中删除,但依然保留在当前工作目录中,即想让文件保留在磁盘,但并不想让Git继续跟踪。
(10)移动文件
git mv:在git中重命名某个文件
$ git mv README.md README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
git可以看到重命名的文件renamed
git mv 相当于以下三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
3、查看提交历史
git log: 查看提交历史
git log 会按照时间先后顺序列出所有的提交,最近的排在最上面
两个常用的选项:
-p:会显示每次提交所引入的差异
-n:n是提交次数,只显示最近n次提交
4、撤销操作
(1)git commit --amend:第一次提交后重新提交
提交后发现漏掉文件或是提交信息写错了,可以使用--amend重新提交
该命令会将暂存区中的文件提交
最终只有一次提交,第二次的提交会代替第一次提交的结果
(2)git reset:取消暂存
使用git reset HEAD <file>命令之后文件就是未暂存的状态
(3)git checkout --:撤销对文件的修改
git checkout 会用最近提交的版本覆盖它,之前在本地修改的记录都会消失
注意:在Git中任何已提交的东西几乎都可以恢复,然而未提交的东西丢失后很可能再也找不到了
(4)git reset --hard 版本号:恢复到之前的版本
5、远程仓库的使用
(1)git remote:查看远程仓库
$ git remote
origin
git remote会列出指定的每一个远程服务器的简写,若已克隆了仓库,可以看到origin,这是Git 给你克隆的仓库服务器的默认名字
-v:会显示需要读写远程仓库使用的Git简写与其对应的URL
(2)git remote add:添加一个新的远程Git仓库
git remote add <shortname> <url>
shortname可以给远程Git仓库指定一个间写用来代替url
(3)git fetch:从远程仓库中抓取
$ git fetch <remote>
访问远程仓库,从中拉取当前没有的数据,会拥有远程仓库所有分支的引用,可以随时合并或查看
(4)git push:推送到远程仓库
git push <remote> <branch>
推送到远程仓库的某个分支
(5)git remote show:查看某个远程仓库
git remote show <remote>
(6)git remote rename:远程仓库重命名
git remote rename <pre-name> <tar-name>
(7)git remote remove:远程仓库移除
6、Git分支
(1)git checkout -b:新建分支并切换到新建的分支上
(2)git checkout:切换分支
(3)git merge:合并分支
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
HEAD 所指示的版本(也就是当前分支所在的位置)在这个区段的上半部分(======= 的上半部分),而被合并的分支所指示的版本在 ======= 的下半部分
解决完冲突之后再执行git add来将其标记为冲突已解决
三、实战
1、Git流程
2、常用demo
(1)拉取远程分支代码合并到本地
//查询当前远程的版本
$ git remote -v
//获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch])
$ git fetch origin master [示例1:获取远端的origin/master分支]
$ git fetch origin dev [示例2:获取远端的origin/dev分支]
//查看版本差异
$ git log -p master..origin/master [示例1:查看本地master与远端origin/master的版本差异]
$ git log -p dev..origin/dev [示例2:查看本地dev与远端origin/dev的版本差异]
//合并最新代码到本地分支
$ git merge origin/master [示例1:合并远端分支origin/master到当前分支]
$ git merge origin/dev [示例2:合并远端分支origin/dev到当前分支]
//解决冲突
$ git add file
(2)提交本地代码到远程
//添加文件
$ git add file
//提交暂存区代码及说明原因
$ git commit -m "***"
//查看远程分支
$ git branch -a
//推送到远程分支
$ git push origin branch
每一步操作前都运行git status查看当前状态
3、总结
在日常使用中,在多数情况下根据执行后的提示就可以知道下一步的操作,解决困难上网搜索即可
#Graviti#