Git&Github的使用

版本控制工具拥有的功能

  • 协同修改

    多人并行不悖的修改服务器端的同一个文件

  • 数据备份
    不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态
    版本管理

  • 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空
    间,提高运行效率。这方面SVN 采用的是增量式管理的方式,而Git 采取了文件系统快照的方式

  • 权限控制
    对团队中参与开发的人员进行权限控制
    对团队外开发者贡献的代码进行审核——Git 独有

  • 历史记录
    查看修改人、修改时间、修改内容、日志信息
    将本地文件恢复到某一个历史状态

  • 分支管理
    允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率

集中式版本控制工具: 可能会出现单点故障
CVS、SVN、VSS……

分布式版本控制工具:
Git、Mercurial、Bazaar、Darcs……

Git 的优势

大部分操作在本地完成,不需要联网
完整性保证
尽可能添加数据而不是删除或修改数据
分支操作非常快捷流畅
与Linux 命令全面兼容

Git结构

Git&Github的使用

Git的安装

一直点击next 然后安装即可

Git和代码托管中心

代码托管中心的任务:维护远程库

局域网环境下:GitLab 服务器

外网环境下:GitHub 、码云

本地库和远程库

Git&Github的使用

跨团队协作
Git&Github的使用

将代码上传到Github

Git&Github的使用
先在我的电脑 找到一个路径,右键 点击 Git Bash here
Git&Github的使用
输入代码

生成 .git隐藏文件
git init
Git&Github的使用

工作区文件添加到暂存区
git add a.txt

将暂存区的文件提交到本地库
git commit -m “first commit” a.txt
first commit是本次提交的 信息,相当于代码里的注释

新建远程库地址的名字
git remote add test https://github.com/xx/Test.git

test为远程库地址的名字,https://github.com/xx/Test.git这个地址在GitHub上有,在 you repositories 里面,

Git&Github的使用
点击code
Git&Github的使用
HTTPS 里的地址 就是远程库地址

推送到远程库
git push test master

然后自动弹出的窗口 输入GitHub的账号和密码 只需输入一次

设置签名

目的:区分开发人员身份
建议使用系统用户级别的签名 能省事
用户名:
Email:
这里的签名和 远程库(Github)的不一样的

命令:
项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name tom
git config user.email [email protected]

系统用户级别:登陆当前操作系统的用户范围 (自己 x)
git config --global user.name tom
git config --global user.eamil [email protected]
优先级:项目级别优先于系统用户级别,二者都有 用项目级别;没有项目级别,用系统用户级别

项目级别 签名被 设置到 .git/config下
系统用户级别 ~/.gitconfig 下
~为Windows用户的主目录,打开c盘,用户,找到自己的账户

git status 查看工作区,暂存区的状态
git add 将工作区的 新建/修改 添加到 暂存区
git commit -m “commit message” 将暂存区的文件提交到本地库
新建的文件 要先git add,能撤回,修改的文件可以直接 commit 但是不能撤回

初始化本地库

生成 .git隐藏文件

[email protected] MINGW64 /e/Download/bbb
$ git init
Initialized empty Git repository in E:/Download/bbb/.git/

查看工作区/暂存区状态

[email protected] MINGW64 /e/Download/bbb (master)
$ git status
On branch master 在master分支上

No commits yet 还没有提交,即本地库里没有东西 (提交 是到本地库里)

nothing to commit (create/copy files and use “git add” to track) 没有文件可提交(即暂存区没有东西),(创建或复制文件,使用 git add 去追踪)

[email protected] MINGW64 /e/Download/bbb (master)
$ vim a.txt

[email protected] MINGW64 /e/Download/bbb (master)
$ git status
On branch master

No commits yet

Untracked files: 没有追踪的文件
(use “git add …” to include in what will be committed) 使用git add 去把要提交的文件包含进去到暂存区
a.txt 红色字体

nothing added to commit but untracked files present (use “git add” to track)

工作区文件添加到暂存区

[email protected] MINGW64 /e/Download/bbb (master)
$ git add a.txt
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory

[email protected] MINGW64 /e/Download/bbb (master)
$ git status
On branch master

No commits yet

Changes to be committed:
(use “git rm --cached …” to unstage) 删除添加到暂存区的文件
new file: a.txt 绿色

暂存区文件提交到本地库

[email protected] MINGW64 /e/Download/bbb (master)
$ git commit a.txt
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory
[master (root-commit) c578dbe] first commit 根提交,
1 file changed, 4 insertions(+)
create mode 100644 a.txt

[email protected] MINGW64 /e/Download/bbb (master)
$ git status
On branch master
nothing to commit, working tree clean

[email protected] MINGW64 /e/Download/bbb (master)
$ vim a.txt

[email protected] MINGW64 /e/Download/bbb (master)
$ git status
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed) 更新 将要提交的文件
(use “git restore …” to discard changes in working directory)取消在工作目录的修改
modified: a.txt 红色字体

no changes added to commit (use “git add” and/or “git commit -a”) 修改的文件 可以先add 再commit ,也可以直接commit

命令git restore readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

第一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

第二种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态

[email protected] MINGW64 /e/Download/bbb (master)
$ git add a.txt
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory

[email protected] MINGW64 /e/Download/bbb (master)
$ git status
On branch master
Changes to be committed:
(use “git restore --staged …” to unstage)
modified: a.txt

[email protected] MINGW64 /e/Download/bbb (master)
$ git commit -m “second commit” a.txt

查看历史记录

git log 太多了 ,多屏显示,空格键 往下看,q退出,b向上翻页
git log --pretty=oneline 只能显示当前版本和之前版本
git log --oneline 只能显示当前版本和之前版本
git reflog 显示所有的版本

[email protected] MINGW64 /e/Download/bbb (master)
$ git log --pretty=oneline
d4c15cc8cdcf32cf43faddabafc60e58303f2d40 (HEAD -> master) second commit
c578dbed28226b9dc7861689a877f5ace1a948b1 first commit
索引值

[email protected] MINGW64 /e/Download/bbb (master)
$ git log --oneline
d4c15cc (HEAD -> master) second commit
c578dbe first commit

[email protected] MINGW64 /e/Download/bbb (master)
$ git reflog
d4c15cc (HEAD -> master) [email protected]{0}: commit: second commit ,指针(HEAD)在此位置
c578dbe [email protected]{1}: commit (initial): first commit 需要指针移动一步 到此版本
局部索引值

前进后退历史版本

基于索引值操作(推荐使用)
git reset --hard c578dbe

使用^符号 只能往后(之前的版本)
git reset --hard HEAD^ 往后一步
git reset --hard HEAD^^ 往后两步

使用~符号 只能往后(之前的版本)
git reset --hard HEAD~2 往后两步

git help reset 查看命令
index file(暂存区) ,working tree(工作区)
soft 参数 仅仅在本地库移动HEAD指针,不变
mixed 参数 在本地库移动HEAD指针,重置暂存区,不变
hard 参数 在本地库移动HEAD指针,重置暂存区,重置工作区,变了
所以一般 直接用hard就好了

永久删除文件后 找回

先提交
git add aaa.txt
git commit -m “del” aaa.txt
git reflog
git reset --hard xxx 再回到之前没删除的版本 即可

或者 没commit 直接用
git reset --hard HEAD 或者 git reset --hard 指针的位置(被删除文件存在的版本)

工作区的文件与暂存区的文件比较

[email protected] MINGW64 /e/Download/bbb (master)
$ git diff a.txt
diff --git a/a.txt b/a.txt
index f68a1c0…935d5bf 100644
— a/a.txt
+++ b/a.txt
@@ -1,4 +1,4 @@
sss
sss
sss
-abc
+abccccccc

  • 删除(红色) ,+ 增加(绿色) ,在原来行的后面加上文字, 即先 - 后 +

git diff HEAD a.txt 工作区文件与本地库的当前版本比较
git diff HEAD^ a.txt 工作区文件与本地库当前版本的前一个版本比较
git diff HEAD[指针位置] 工作区文件与本地库历史版本比较
git diff 不加文件名,比较多个文件

分支管理

多条线同时推进多个任务
某个分支开发失败了,删除该分支
分支彼此独立
hot_fix 热修复,服务器不停

git branch -v 查看分支
git branch hot_fix 创建分支
git checkout hot_fix 切换分支
合并分支 切换到被合并的分支上,然后 git merge hot_fix, 把hot_fix的修改 合并到master上,hot_fix是先提交了的

解决冲突

master的修改和hot_fix的修改的地方一致,但改的内容不一样,然后合并 ,就产生冲突了
自己手动 修改即可
然后 git add 文件名
然后 git commit -m “xx” ,后面不能带文件名

Hash算法

验证文件
git 用这种机制来保证数据的完整性
git底层采用SHA-1算法

不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
输入数据确定,输出数据能够保证不变
哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
哈希算法不可逆

Git文件管理机制

快照, 提交对象 有一个hash值,里面有tree的hash值,tree里面有多个文件的hash值
文件没有修改,则保存链接指向之前的文件,有修改,对完整的文件进行快照
每个快照 有父节点

Git 把数据看作是小型文件系统的一组快照。每次提交更新时Git 都会对当前
的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,
Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git 的
工作方式可以称之为快照流
Git&Github的使用

Git分支管理机制

切换分支 相当于切换了 指针,效率高
Git&Github的使用
Git&Github的使用
不同分支在推进Git&Github的使用
Git&Github的使用

集中式版本控制工具的文件管理机制

Git&Github的使用
Filec中需要版本3的时候直接将 deta2 和deta1 和Filec合并一起即可

Git 的“提交对象”

Git&Github的使用

提交对象及其父对象形成的链条Git&Github的使用

Github

创建远程库 new repository

新建远程库别名(origin)
$ git remote add origin https://github.com/Chuang2-Hchen/Test.git

$ git remote -v 查看远程库的别名
origin https://github.com/x-x/Test.git (fetch) 取回
origin https://github.com/x-x/Test.git (push) 用来推送

$ git push test master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 225 bytes | 225.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

To https://github.com/x-x/Test.git

  • [new branch] master -> master

推送master
git push origin master

克隆

git clone 远程库地址

[email protected] MINGW64 /e/Download/cc
$ git clone https://github.com/x-x/Test.git
Cloning into ‘Test’…
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 205 bytes | 0 bytes/s, done.

[email protected] MINGW64 /e/Download/cc/Test (master)
$ vim a.txt

[email protected] MINGW64 /e/Download/cc/Test (master)
$ git add a.txt

[email protected] MINGW64 /e/Download/cc/Test (master)
$ git commit -m “cc commit” a.txt
[master 4be3f13] cc commit
1 file changed, 1 insertion(+)

邀请别人进入团队
此时 cc 不能push 到远程库,要先加入团队,才能push

git push test master 然后cc的GitHub账户登陆, 在bb的GitHub上的 repository -> Settings -> Collaborators 输出你要邀请的人的GitHub的账号, 点击 Add collaborator 然后点击 Copy invite link 发给对方,对方登陆GitHub后 ,访问该链接, 点击Accept invitation 就ok了

拉取

bb账户 抓取 远程库 git fetch test master
cat a.txt
但此时本地库的内容没有变化
然后 git checkout test/master
cat a.txt
内容变化了
git checkout master
cat a.txt
先看抓取下来的内容,然后再去合并起来
git merge test/master
然后
cat a.txt 内容变了

或者 直接 git pull test master
拉取 pull=fetch抓取+merge 合并

tors 输出你要邀请的人的GitHub的账号, 点击 Add collaborator 然后点击 Copy invite link 发给对方,对方登陆GitHub后 ,访问该链接, 点击Accept invitation 就ok了

拉取

bb账户 抓取 远程库 git fetch test master
cat a.txt
但此时本地库的内容没有变化
然后 git checkout test/master
cat a.txt
内容变化了
git checkout master
cat a.txt
先看抓取下来的内容,然后再去合并起来
git merge test/master
然后
cat a.txt 内容变了

或者 直接 git pull test master
拉取 pull=fetch抓取+merge 合并

协同开发 冲突