尚硅谷Git学习笔记
Git是一个免费的、开源的分布式版本控制系统,可以快速有效地处理从小型到大型的项目。
- Git介绍:分布式版本控制 vs 集中式版本控制
- Git安装:基于官网版本2.31.1
- Git命令:基于开发案例常用Git命令
- Git分支:分支特性 分支建立 分支转换 分支合并 代码合并冲突
- GitHub:创建远程库,代码推送Push,代码拉取Pull,代码克隆Clone,SSH免密登录,Idea集成GitHub
- Gitee码云:码云创建远程连接,码云连接github进行代码复制和迁移
- GitLab:GitLab服务器的搭建和部署,Idea集成GitHub
第一章 Git概述
Git易于学习,体积小,性能高,具有廉价的本地库,方便暂存区域和多个工作流分支等特性。
何为版本控制:记录文件内容的变化以便将来查阅特定版本修订情况。
集中式:单一的集中管理的服务器。问题:单点故障问题。
分布式:服务器在断网情况下也可以进行开发,每个客户端保存的也都是整个完整的项目。
发展史:Linus
工作区:存放代码的路径位置,写代码-- git add --暂存区:临时存储-- git commit -- 本地库,历史版本(删不掉)--git push--远程库
代码托管中心(远程库):①局域网:GitLab。②:互联网:GitHub、Gitee
第二章 Git安装
第三章 Git常用命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m "日志信息" 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
设置用户名和邮箱之后可以在Windows用户目录下找到一个.gitconfig文件的设置结果。这里设置的用户签名和将来登录GitHub或其他代码托管中心的账号没有任何关系。
- 初始化本地库:
git init
会在当前文件夹下生成.git配置文件。 - 查看状态:
git status
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
当前文件夹下生成一个hello.txt文件之后
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
- 添加到暂存区
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
再次查看状态
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt
删除掉暂存区的文件,但是不会删除本地工作区的文件
$ git rm --cached hello.txt
rm 'hello.txt'
再次查看状态
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
- 提交本地库
基本语法:
git conmmit -m "日志信息" 文件名
$ git commit -m "the first commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
[master (root-commit) d030090] the first commit
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
查看一下提交后的状态
$ git status
On branch master
nothing to commit, working tree clean
查看版本信息
$ git reflog
d030090 (HEAD -> master) HEAD@{0}: commit (initial): the first commit
上面的d030090就是版本号,HEAD指针指向master版本,指向的是当前版本。 或者查看详细日志
$ git log
commit d030090a846d9a7c13b105de6ff459edc1720f29 (HEAD -> master)
Author: zhouda <zhouda1998@qq.com>
Date: Thu Apr 7 22:05:02 2022 +0800
the first commit
对本地工作区的文件进行修改,vim hello.txt
修改(添加了一行文件)之后再次查看状态:
会看到红色提示:已经修改并且还没有提交。
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
再次添加到暂存区并且查看状态
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: hello.txt
再次提交并且查看状态,并查看版本信息
# 提交
$ git commit -m "the second commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory
[master 0a565f4] the second commit
1 file changed, 2 insertions(+), 1 deletion(-)
# 查看状态
$ git status
On branch master
nothing to commit, working tree clean
# 查看版本
$ git reflog
0a565f4 (HEAD -> master) HEAD@{0}: commit: the second commit
d030090 HEAD@{1}: commit (initial): the first commit
- 历史版本:基本语法
git reflog
或者详细信息git
- 版本穿越 查看到版本号之后版本穿越
# 查看版本号
$ git reflog
0a565f4 (HEAD -> master) HEAD@{0}: commit: the second commit
d030090 HEAD@{1}: commit (initial): the first commit
# 穿越
$ git reset --hard 0a565f4
HEAD is now at 0a565f4 the second commit
# 查看
$ git reflog
0a565f4 (HEAD -> master) HEAD@{0}: reset: moving to 0a565f4
0a565f4 (HEAD -> master) HEAD@{1}: commit: the second commit
d030090 HEAD@{2}: commit (initial): the first commit
# 此时再次查看该文件就是穿越版本之后的文件
cat hello.txt
从本地工作目录中可以看到在路径.git\refs\heads\
下的master
文件内容就是当前文件的提交版本号。Git版本切换底层就是移动HEAD指针。
第四章:Git分支操作
什么是分支:为同时推进多个任务,为每个任务可以单独创建一个分支,分离出来的分支不会影响主分支。分支可以理解为副本,一个分支就是一个单独的副本,分支的底层是指针的引用。
分支命令
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
当开了另外一个hot-fix
分支,在hot-fix
分支上进行了修改并提交,但是在master
分支上没有做修改,当处于master
分支的时候合并hot-fix
分支就会直接覆盖当前master
分支。
冲突合并:两个分支在同一个文件的同一个位置有不同的修改。git无法替我们决定使用哪个,必须人为决定新代码的内容。
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (master)
$ cat hello.txt
this is a demo
1
2
3
4
5
6
7
8 master change
9
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (master)
$ vim hello.txt
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (master)
$ git add hello.txt
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (master)
$ git commit -m "master change2" hello.txt
[master 42960c2] master change2
1 file changed, 1 insertion(+), 1 deletion(-)
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
这里会出现问题,两个分支都进行了更改
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix)
$ git merge master
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
分支上不同的内容会被标记出来,HEAD
和=
之间的内容表示当前的分支的内容,=
和>
之间是要合并分支的内容,必须手动的删掉多余的信息,只保留一份。例如只保留:8 master change hot-fix change
和9 hot-fix change
,其余从第七行多余的符号全部删掉。
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix|MERGING)
$ cat hello.txt
this is a demo
1
2
3
4
5
6
7
<<<<<<< HEAD
8 master change hot-fix change
9
=======
8 master change
9 hot-fix change
>>>>>>> master
手动修改后:
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix|MERGING)
$ vim hello.txt
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix|MERGING)
$ cat hello.txt
this is a demo
1
2
3
4
5
6
7
8 master change hot-fix change
9 hot-fix change
手动修改之后仍然需要add和commit,只是:commit不需要再加上文件名,否则会报错。
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix|MERGING)
$ git add hello.txt
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix|MERGING)
$ git commit -m "合并冲突之后commit不能再加文件名"
[hot-fix b200cfd] 合并冲突之后commit不能再加文件名
该操作的底层也是对文件的指针操作。head指针指向分支,master指向版本。
第五章:Git团队协作机制
- 团队内协作 如有成员A和成员B: A的本地库---push---远程库---clone---B的本地库更改后---push---远程库---pull---A的本地库
- 团队外协作 如有团队A和B:
A的远程库代码a---fork---B的远程库a---clone---B的本地库修改a'---push---B的远程库a'---pull request ---经A审核之后---merge---A的远程库a'
第六章:GitHub操作
在github创建远程库
- 创建远程库别名 链接太长了取一个别名代替
git remote -v
查看当前所有远程地址别名git romote add 别名 远程地址
起一个别名代替远程地址
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix)
$ git remote add git-demo https://github.com/zhouda98/git-demo.git
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (hot-fix)
$ git remote -v
git-demo https://github.com/zhouda98/git-demo.git (fetch)
git-demo https://github.com/zhouda98/git-demo.git (push)
- 推送本地代码到远程库
git push 别名/链接 分支名
然后再输入账号即可。github上刷新页面就能看到上传的代码。
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (master)
$ ll
total 1
-rw-r--r-- 1 zhouda 197121 74 Apr 11 16:24 hello.txt
zhouda@LAPTOP-IEFFHFDS MINGW64 /f/Git/Git-demo2 (master)
$ git push git-demo master
fatal: unable to access 'https://github.com/zhouda98/git-demo.git/': OpenSSL SSL_read: Connection was reset, errno 10054
也可以直接在网站上做出修改然后提交
- 拉取远程库到本地
git pull 链接/别名 分支
拉取之后就是最新同步的代码
- 克隆远程仓库到本地
git clone 远程地址
克隆代码不需要登陆账号(公共库具有读权限)
- 拉取代码
- 初始化本地git环境
- 创建别名
git remote -v
- 邀请加入团队
- 选择合作者
更改之后:
git status
,添加暂存区git add hello.txt
,提交本地库git commit -m "lhc commit" hello.txt
,push到远程库:git push 远程库链接
。登录提交可能没有权限,需要库主设置。
库主账号目录下,settings,manage access, invite a collaborator,添加用户名,复制邀请函pending invite发送给被邀请人
被邀请人:拿到邀请链接之后接受。重新从本地进行推送git push 远程连接
。
库主进行拉取git pull git-demo master
- 跨团队协作 精确搜索:username/库名 团队外成员 fork
- 直接在网页修改并提交,只是提交到自己当下的账号下。
- 团队外成员页面拉取请求:pull requests,new pull request,creater pull request,填写提交的信息create pull request。
- 团队内成员刷新就会有pull request请求,点击链接即可。
- 团队内成员检查代码之后可以merge完成修改,成为最新的代码。
- SSH免密登录 HTTPS链接,还可以用SSH链接
- win家目录,用户目录下,右键
git bash here
- 生成.ssh文件夹:
ssh-keygen -t rsa -C 账号邮箱
- 敲三次回车会产生一个.ssh文件夹里面有公钥.pub和私钥
- 将公钥内容复制粘贴到settings ssh and GPG keys
- new ssh key 写上title名,粘贴.pub的内容
测试:
- 打开git命令行
- 网页端复制ssh链接
- git命令行:
git pull ssh链接 master
- 保存链接
- vim hello.txt
- git add hello.txt
- git commit -m "yyy commit" hello.txt
- git push ssh链接 master
第七章集成git到ide
忽略文件: 创建一个xxx.ignore文件
*.class
*.log
- 用户家目录下:新建文本文档:git.ignore
- 粘贴要忽略的规则
- 在gitconfig文件中引用忽略配置文件
[user]
name = zhouda1998
email = zhouda1998@qq.com
[core]
excludesfile = "C/user/zhouda/git.ignore"
- 该目录需要的是斜线而不是win的反斜线
定位git程序