一. Git原理
1. Git中数据的保存方式
- Git 像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。
- 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
2. Git数据存储结构
- 在进行提交操作时,Git 会保存一个提交对象(commit object),该提交对象会包含一个指向暂存内容快照的指针,作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。
- 当使用 git commit 进行提交操作时,Git 会先计算每一个子目录的校验和, 然后在 Git 仓库中这些校验和保存为树对象。随后,Git 便会创建一个提交对象, 它除了包含上面提到的那些信息外,还包含指向这个树对象的指针。 如此一来,Git 就可以在需要的时候重现此次保存的快照。
- 做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。
3. Git的数据状态
Git存在3种数据状态:
- 已修改(modified):修改了文件,但还没保存到数据库中。
- 已暂存(staged):对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- 已提交(committed):数据已经安全地保存在本地数据库中。
使用git status
命令可以查看数据处于哪个状态
Git 操作,几乎只往 Git 数据库中添加数据。很难使用 Git 从数据库中删除数据,也就是说 Git 几乎不会执行任何可能导致文件不可恢复的操作。
二. Git基本使用
1. 基本配置
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
如果想要检查你的配置,可以使用 git config --list 命令来列出所有 Git 当时能找到的配置。
$ git config --list
user.name=John Doe
user.email=johndoe@example.com
2. 创建Git仓库
- 在已存在目录中初始化仓库:
1.先进入需要版本控制的目录
2.执行git init
3.执行完后会创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件 - 远程克隆已有仓库
1.执行git clone
命令,如:git clone https://github.com/libgit2/libgit2
2.这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹, 从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。
3. 将内容添加到下一次提交中
git add
命令有多种功能:
- 跟踪新文件
- 把已跟踪的文件放到暂存区
- 合并时把有冲突的文件标记为已解决状态等
4. 提交更新
git commit
命令会提交暂存区的文件。(如果已修改或新建的文件还没有 git add 过,提交的时候不会记录这些尚未暂存的变化。)
Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit
加上 -a
选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:
5. 查看提交历史
git log
命令用于查看提交历史
若要查看每次提交所引入的差异,可使用git log -p
6. 撤销
git reset HEAD <file>...
命令可以撤销被暂存的文件
git checkout -- <file>...
命令可以撤消对文件的修改,将文件还原成上次提交时的样子
7. 远程仓库的使用
- 查看远程仓库:
git remote
会列出指定的每一个远程服务器的简写。 (origin为克隆的仓库服务器的默认名字) - 从远程仓库中抓取:
git fetch <remote>
会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看(并不会自动合并或修改你当前的工作)。
git pull
命令来自动抓取后合并该远程分支到当前分支 - 推送到远程仓库:
git push <remote> <branch>
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。 当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。 你必须先抓取他们的工作并将其合并进你的工作后才能推送。
8. 打标签
- 附注标签:
git tag -a v1.4 -m "my version 1.4"
,-a为标签号,-m为存储在标签中的信息 - 轻量标签:
git tag v1.4-lw
,只需提供标签名,无需添加额外信息 - 列出标签:
git tag
- 查看与标签信息对应的提交信息:
git show v1.4-lw
- 共享标签:默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样,执行命令
git push origin <tagname>
三. Git分支
- 使用分支意味着可以把从开发主线上分离开来,以免影响开发主线。
- Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,已经有一个指向最后那个提交对象的 master 分支
0. 为什么要使用分支
1)临时分支解决紧急问题
开发某个网站
- 为实现某个新的用户需求,创建一个分支。
- 在这个分支上开展工作。
正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理:
- 切换到你的线上分支(production branch)。
- 为这个紧急任务新建一个分支,并在其中修复它。
- 在测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支。
切换回你最初工作的分支上,继续工作。
2)长期分支
只在 master 分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。 他们还有一些名为 develop 或者 next 的平行分支,被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,它们就可以被合并入 master 分支了。 这样,在确保这些已完成的主题分支能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布。
1. 分支创建
git branch testing
命令会在当前所在的提交对象上创建一个指针。- HEAD指针用于指示当前在哪一个分支上,通过
git log --oneline --decorate
命令可以查看HEAD指针的位置
2. 分支切换
git checkout testing
命令可以将HEAD移动到指定的分支,此时再提交就只会移动当前分支
此时如果再切换至master(git checkout master
),就会使 HEAD 指回 master 分支,且将工作目录恢复成 master 分支所指向的快照内容。 如果再做修改,项目将始于一个较旧的版本。 本质上来讲,这就是忽略 testing 分支所做的修改,以便于向另一个方向进行开发。
注:如果要恢复至之前的版本可使用git check out <提交版本hash>
命令
3. 分支合并
如果要合并不同的分支,首先需要切换回旧版本,然后使用git merge
操作合并不同分支,如:
$ git checkout master
$ git merge hotfix
即将master分支合并至hotfix分支
如果旧版本不是指定分支的直接祖先,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的公共祖先(C2),做一个简单的三方合并。
和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。
如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,就会产生合并冲突。此时 Git 会暂停下来,等待你去解决合并产生的冲突。解决完冲突后即可完成合并。
4. 跟踪远程分支
在使用本地分支时,可以指定本地分支跟踪哪一个远程分支,这样在抓取数据时就会自动从该远程分支进行抓取
推送数据时,通过git checkout -b <branch> <remote>/<branch>
命令指定推送到哪一个分支
四. GitHub
1. 项目贡献
- 如果想要贡献代码给开源项目,可以点击项目页面右上角的**“Fork”按钮**,来派生这个项目。派生项目后GitHub 会在你的空间中创建一个完全属于你的项目副本,且你对其具有推送权限。
- 将自己的代码修改推送到派生出的项目副本中,并通过创建拉取请求(Pull Request)告知原作者接收自己的代码
- 项目的拥有者和贡献者可以在此讨论相关修改,直到项目拥有者对其感到满意,并且认为这些修改可以被合并到版本库。
- 当你派生了一个 GitHub 仓库之后,你的仓库会独立于原仓库而独立。 特别地,当原仓库有新的提交时,GitHub 会通知你:
This branch is 5 commits behind progit:master.
(本分支落后 progit:master 5 个提交。)
- 此时可以从远程仓库抓取代码并与自己的分支合并
2. 邀请新成员
- 如果你想与他人合作,并想给他们提交的权限,你需要把他们添加为 “Collaborators”,在 “Settings” 中可以添加新成员。这样做会给他们 “推送” 权限,就是说他们对项目和 Git 版本库都有读写的权限。
3. IDEA整合GitHub
- 创建本地仓库:VSC -------> Import into Version Control -------> Create Git Repository
- 配置远程仓库:右键项目-------> Git-------> Repository------->Remotes------->输入远程仓库的URL
- 通过右上角的按钮进行pull和commit and push操作
- 也可以直接使用Terminate终端通过Git命令进行操作