一、Git基本介绍
1、Git结构
2、本地库和远程库
2.1团队内部协作
pull与clone的区别:
-
从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库,叫做clone.(clone是将一个库复制到你的本地,是一个本地从无到有的过程,其中包含了本地初始化的操作)
-
从远程服务器获取到一个branch分支的更新到本地,并更新本地库,叫做pull.(pull是指同步一个在你本地有版本的库内容更新的部分到你的本地库)
-
git clone是远程操作的第一步,通常是从远程主机克隆一个版本库
$ git clone ## 该命令会在本地主机生成一个目录,与远程主机的版本库同名 如果要是制定不同的目录名,可以将目录名作为git clone 命令的第二个参数。 eg:$ git clone #版本库网址# #本地目录名# git clone支持多种协议,除了http(s),还有ssh,git,本地协议。
-
git pull 作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
eg:$ git pull ##远程主机(origin) #远程分之(next)#:#本地分之(master)# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。 eg:$ git pull #远程主机(origin)# #远程分之(next)# 相当于1. $ git fetch origin 2.$git merge origin/next
2.2跨团队协作
二、Git命令行操作
1、本地库初始化
创建文件夹WeChat
Y@SYY MINGW64 /e/Git
$ mkdir WeChat
进入WeChat,进行本地初始化
Y@SYY MINGW64 /e/Git/WeChat
$ git init
Initialized empty Git repository in E:/Git/WeChat/.git/
查看显性文件、隐藏文件
Y@SYY MINGW64 /e/Git/WeChat (master)
$ ll #查看显性文件
total 0
Y@SYY MINGW64 /e/Git/WeChat (master)
$ ls -la #查看隐藏文件
total 4
drwxr-xr-x 1 Y 197121 0 Oct 22 09:39 ./
drwxr-xr-x 1 Y 197121 0 Oct 22 09:37 ../
drwxr-xr-x 1 Y 197121 0 Oct 22 09:39 .git/
查看.git/目录
Y@SYY MINGW64 /e/Git/WeChat (master)
$ ll .git/
total 7
-rw-r--r-- 1 Y 197121 23 Oct 22 09:39 HEAD
-rw-r--r-- 1 Y 197121 130 Oct 22 09:39 config
-rw-r--r-- 1 Y 197121 73 Oct 22 09:39 description
drwxr-xr-x 1 Y 197121 0 Oct 22 09:39 hooks/
drwxr-xr-x 1 Y 197121 0 Oct 22 09:39 info/
drwxr-xr-x 1 Y 197121 0 Oct 22 09:39 objects/
drwxr-xr-x 1 Y 197121 0 Oct 22 09:39 refs/
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
2、设置签名
2.1形式
用户名:syy
email地址(随便设置,可以不存在):1204201145@qq.com
2.2作用
-
区分不同开发人员的身份
-
这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关
系
2.3命令
-
项目级别/仓库级别:仅在当前本地库范围内有效:
关键字:git config user.name 用户名
git config user.email 邮箱
Y@SYY MINGW64 /e/Git/WeChat (master) $ git config user.name syy Y@SYY MINGW64 /e/Git/WeChat (master) $ git config user.email 1204201145@qq.com
信息保存位置:./.git/config文件
Y@SYY MINGW64 /e/Git/WeChat (master) $ cat .git/config [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [user] name = syy email = 1204201145@qq.com
-
系统用户级别:登录当前操作系统的用户范围
关键字:git config --global user.name 用户名
git config --global user.email 邮箱
Y@SYY MINGW64 /e/Git/WeChat (master) $ git config user.name syy_glb Y@SYY MINGW64 /e/Git/WeChat (master) $ git config user.email 1204201145_glb@qq.com
信息保存位置:~/.gitconfig文件
Y@SYY MINGW64 /e/Git/WeChat (master) $ cat ~/.gitconfig [filter "lfs"] clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f process = git-lfs filter-process required = true [user] name = syy_glb email = 1204201145_glb@qq.com
注意:进入系统路径 cd ,代表系统
Y@SYY MINGW64 /e/Git/WeChat (master)
$ cd ~
Y@SYY MINGW64 ~
$ pwd
/c/Users/Y
-
级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别
的签名 。
如果只有系统用户级别的签名,就以系统用户级别的签名为准 。二者都没有不允许的权限限制
3、基本操作
3.1状态查看
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git status
On branch master #当前分支
No commits yet #本地仓库
nothing to commit (create/copy files and use "git add" to track) #缓存区
查看工作区、暂存区状态
3.2添加文件
关键字:git add [file name]
将工作区的“新建/修改”添加到暂存区
Y@SYY MINGW64 /e/Git/WeChat (master) #编辑并创建文件
$ vim good.txt
Y@SYY MINGW64 /e/Git/WeChat (master)
$ cat good.txt #查看文件内容
123456
i love u
do u know that
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git add good.txt #提交文件
warning: LF will be replaced by CRLF in good.txt.
The file will have its original line endings in your working directory
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git status #查看缓存区状态
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: good.txt
3.3提交
关键字:git commit -m “commit message” [file name]
将暂存区的内容提交到本地库
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git commit -m "This is my first commit for the new file:good.txt" good.txt
warning: LF will be replaced by CRLF in good.txt.
The file will have its original line endings in your working directory
[master (root-commit) e81d234] This is my first commit for the new file:good.txt #提交信息
1 file changed, 3 insertions(+)
create mode 100644 good.txt
Y@SYY MINGW64 /e/Git/WeChat (master) #缓存区已清空
$ git status
On branch master
nothing to commit, working tree clean
3.4查看历史记录
关键字:git log (可以显示所有的记录)
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git log
commit c40cd8e1800b3e8b9bb7e91dfcac13fd08e489d7 (HEAD -> master)
Author: syy <1204201145@qq.com>
Date: Fri Oct 22 10:49:07 2021 +0800
This is a change.
commit e81d2342afc55955e5441a86f8d6e079d73a09a9
Author: syy <1204201145@qq.com>
Date: Fri Oct 22 10:38:06 2021 +0800
This is my first commit for the new file:good.txt
拓展:单行查看log(若是进行了回退操作,只能显示之前的记录)
git log --pretty=oneline
git log --oneline
git reflog:可以查看回退步数,HEAD@{2}表示回退2步即可回到当前版本。
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git log --pretty=oneline
c40cd8e1800b3e8b9bb7e91dfcac13fd08e489d7 (HEAD -> master) This is a change.
e81d2342afc55955e5441a86f8d6e079d73a09a9 This is my first commit for the new file:good.txt
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git log --oneline
c40cd8e (HEAD -> master) This is a change.
e81d234 This is my first commit for the new file:good.txt
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git reflog
04e5a05 (HEAD -> master) HEAD@{0}: commit: insert aaaaaabbbbb
c40cd8e HEAD@{1}: commit: This is a change.
e81d234 HEAD@{2}: commit (initial): This is my first commit for the new file:good.txt
3.5前进后退
本质:操作head指针
-
基于索引值操作(推荐)
git reset --hard 局部索引值
Y@SYY MINGW64 /e/Git/WeChat (master) $ git reflog 04e5a05 (HEAD -> master) HEAD@{0}: commit: insert aaaaaabbbbb c40cd8e HEAD@{1}: commit: This is a change. e81d234 HEAD@{2}: commit (initial): This is my first commit for the new file:good.txt Y@SYY MINGW64 /e/Git/WeChat (master) $ git reset --hard c40cd8e HEAD is now at c40cd8e This is a change. Y@SYY MINGW64 /e/Git/WeChat (master) $ cat good.txt 123456 i love u do u know that i know that
-
使用~符号:只能后退
git reset --hard HEAD~n:表示后退n步
-
3.6删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库。
关键字:git rm 文件
找回操作:git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD
3.7比较文件差异
- git diff [文件名]
将工作区中的文件和暂存区进行比较
- git diff [本地库中历史版本] [文件名]
将工作区中的文件和本地库历史记录比较
不带文件名比较多个文件
4、分支管理
4.1分支好处
同时并行推进多个功能开发,提高开发效率 。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
4.2分支操作
-
创建分支
关键字:git branch 分支
Y@SYY MINGW64 /e/Git/WeChat (master) $ git branch hot-fix
-
查看分支
关键字:git branch -v
Y@SYY MINGW64 /e/Git/WeChat (master) $ git branch -v hot-fix 5650d7c this is a test.txt * master 5650d7c this is a test.txt
-
切换分支
关键字:git checkout 分支
Y@SYY MINGW64 /e/Git/WeChat (master) $ git checkout hot-fix Switched to branch 'hot-fix'
-
合并分支
第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
第二步:执行 merge 命令
git merge
Y@SYY MINGW64 /e/Git/WeChat (hot-fix) $ git checkout master Switched to branch 'master' M good.txt Y@SYY MINGW64 /e/Git/WeChat (master) $ git merge hot-fix Already up to date. Y@SYY MINGW64 /e/Git/WeChat (master) $ cat good.txt 123456 i love u do u know that i know that aaaaaaa --edit by hot-fix
-
解决冲突
冲突的表现
冲突的解决 :
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存退出
第三步:git add [文件名]
第四步:git commit -m “日志信息”
注意:此时 commit 一定不能带具体文件名
-
5、Git原理
5.1哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下
几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆
Git 底层采用的是 SHA-1 算法。
Git 就是靠这种机制来从根本上保证数据完整性的。
5.2git保存版本的机制
5.2.1集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本
文件和每个文件随时间逐步累积的差异。
5.2.2git的文件管理机制
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前
的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,
Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的
工作方式可以称之为快照流。
6、GitHub使用
6.1创建远程库地址别名
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git remote add origin https://github.com/SUYAOYANG/TEST01.git
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git remote -v
origin https://github.com/SUYAOYANG/TEST01.git (fetch)
origin https://github.com/SUYAOYANG/TEST01.git (push)
6.2推送
git push [别名] [分支名]
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git push origin master
6.3克隆
git origin [远程地址]
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git clone https://github.com/SUYAOYANG/TEST01.git
6.4拉取
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
6.5跨团队协作
先fork
别人的仓库,再提交自己的文件,然后点击pull request
来提交自己的合并请求(其中会commit
上自己的想法),别人看到了就可以在pull request
这里跟你进行聊天沟通,并且还可以看到你commit了什么文件,做了什么修改,最终如果通过的话,别人就点击merge
来合并代码。
分支名]**
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git push origin master
6.3克隆
git origin [远程地址]
Y@SYY MINGW64 /e/Git/WeChat (master)
$ git clone https://github.com/SUYAOYANG/TEST01.git
6.4拉取
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
6.5跨团队协作
先fork
别人的仓库,再提交自己的文件,然后点击pull request
来提交自己的合并请求(其中会commit
上自己的想法),别人看到了就可以在pull request
这里跟你进行聊天沟通,并且还可以看到你commit了什么文件,做了什么修改,最终如果通过的话,别人就点击merge
来合并代码。