尚硅谷Git课程 | Git(idea版本) 笔记
文章目录
- 尚硅谷Git课程 | Git(idea版本) 笔记
- 工作机制
- 代码托管中心
- git安装(看视频)
- Git常用命令
- 设置用户签名
- 初始化本地库
- 查看状态
- 添加暂存区
- 提交本地库
- 查看git历史版本
- 修改文件
- 版本穿梭
- Git分支操作
- 分支的好处
- 查看分支
- 创建分支
- 切换分支
- 分支合并
- 冲突合并
- Git团队协作机制
- GitHub操作
- 常用命令
- 创建远程库别名
- 推送本地分支上的内容到远程仓库
- 拉取远程库内容
- 克隆
- 邀请加入团队
- 跨团队操作
- SSH免密登录
- IDEA集成GIT
- 配置Git忽略文件
- IDEA集成Github
- 自建代码托管平台-GitLab
工作机制
工作区:指的是存放代码目录的位置
暂存区:将工作区的代码添加到暂存区,暂存区里面的代码是临时存储,暂存区的代码可以删掉,没有历史版本
本地库:暂存区提交本地库,本地库就会生成对应的历史版本,无法删除
代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。代码可以从本地库推送到远程库,使用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 版本号 | 版本穿梭 |
设置用户签名
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。
查看用户签名
$ cat ~/.gitconfig
初始化本地库
git init
查看使用ll
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo
$ git init
Initialized empty Git repository in D:/java-02P/git-demo/.git/
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ ll
total 0
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ ll -a
total 8
drwxr-xr-x 1 77 197121 0 Feb 8 12:23 ./
drwxr-xr-x 1 77 197121 0 Feb 8 12:23 ../
drwxr-xr-x 1 77 197121 0 Feb 8 12:23 .git/
查看状态
查看状态:git status
分支在master下面,没有可以提交的内容
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
linux和git的命令使通用的
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ vim hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ cat hello.txt
hello xiaoqi
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ ll
total 1
-rw-r--r-- 1 77 197121 13 Feb 8 12:26 hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ 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)
红色的hello代表还在工作区,没有追踪过文件
添加暂存区
添加暂存区:git add
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ 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
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ 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进行删除
提交本地库
git commit -m “日志信息” 文件名
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git commit -m "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) f9284ae] first commit
1 file changed, 1 insertion(+)
create mode 100644 hello.txt
f9284ae:版本号
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git status
On branch master
nothing to commit, working tree clean
是一个干净的本地库
查看git历史版本
git reflog 查看版本信息
git log 查看版本详细信息
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git reflog
f9284ae (HEAD -> master) HEAD@{0}: commit (initial): first commit
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git log
commit f9284ae3b530f1924583d445246a984374768d05 (HEAD -> master)
Author: xiaoqi <719189161@qq.com>
Date: Wed Feb 8 12:34:49 2023 +0800
first commit
修改文件
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ vim hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ 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")
修改hello.txt,查看状态,提示已经修改但是还有add到暂存区
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ 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
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: hello.txt
add暂存区
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git commit -m "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 decaa94] second commit
1 file changed, 4 insertions(+)
commit
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git reflog
decaa94 (HEAD -> master) HEAD@{0}: commit: second commit
f9284ae HEAD@{1}: commit (initial): first commit
查看发现有两个版本
版本穿梭
git reset --hard 版本号
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git reflog
ef15874 (HEAD -> master) HEAD@{0}: commit: third commit
decaa94 HEAD@{1}: commit: second commit
f9284ae HEAD@{2}: commit (initial): first commit
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git reset --hard decaa94
HEAD is now at decaa94 second commit
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git reflog
decaa94 (HEAD -> master) HEAD@{0}: reset: moving to decaa94
ef15874 HEAD@{1}: commit: third commit
decaa94 (HEAD -> master) HEAD@{2}: commit: second commit
f9284ae HEAD@{3}: commit (initial): first commit
可以查看文件里面的版本号
.\git-demo\.git\refs\heads
Git分支操作
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
不同的分支,可以并行开发迭代
分支的好处
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支
git branch -v
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git branch -v
* master decaa94 second commit
(*代表当前所在的分区)
创建分支
git branch 分支名
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git branch hot-fix
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git branch -v
hot-fix decaa94 second commit
* master decaa94 second commit
hot-fix 热修分支
切换分支
git checkout 分支名
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
修改文件
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ vim hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git status
On branch hot-fix
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")
add和commit
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git add hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git commit -m "hot-fix frist commit" hello.txt
[hot-fix 5a03f23] hot-fix frist commit
1 file changed, 7 insertions(+)
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git status
On branch hot-fix
nothing to commit, working tree clean
查看文件发现有两个指针
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git reflog
5a03f23 (HEAD -> hot-fix) HEAD@{0}: commit: hot-fix frist commit
decaa94 (master) HEAD@{1}: checkout: moving from master to hot-fix
decaa94 (master) HEAD@{2}: reset: moving to decaa94
ef15874 HEAD@{3}: commit: third commit
decaa94 (master) HEAD@{4}: commit: second commit
f9284ae HEAD@{5}: commit (initial): first commit
切换到master分支之后,可以发现hello.txt中的内容没有发生改变
分支合并
git merge 分支名 ,把制定的分支合并到当前分支上
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git merge hot-fix
Updating decaa94..5a03f23
Fast-forward
hello.txt | 7 +++++++
1 file changed, 7 insertions(+)
合并完毕之后发现hot-fix分支上的hello.txt替换掉了master上的
没有产生冲突的原因是,master上的文件没有发生修改,hot-fix上的文件是基于master修改的,所以可以合并成功
冲突合并
冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。
冲突产生的表现:后面状态为 MERGING
现在master分支上进行修改
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ vim hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git add hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git commit -m "master 4 commit" hello.txt
[master 4ad9fd9] master 4 commit
1 file changed, 1 insertion(+), 1 deletion(-)
切换到hot-fix
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git checkout hot-fix
Switched to branch 'hot-fix'
修改分支上的hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ vim hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git add hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git commit -m "hit-fix second commit" hello.txt
[hot-fix 3fa92d6] hit-fix second commit
1 file changed, 2 insertions(+), 2 deletions(-)
切换回到master
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (hot-fix)
$ git checkout master
Switched to branch 'master
合并失败,产生了代码冲突
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git merge hot-fix
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
MERGING:正在合并中的状态
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master|MERGING)
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: hello.txt
no changes added to commit (use "git add" and/or "git commit -a")
打开hello文件发现等号前面的为master分支的内容,后面为hot-fix内容
需要自己手动将这些内容进行取舍,使用dd删除一行
add和commit操作
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master|MERGING)
$ git add hello.txt
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master|MERGING)
$ git commit -m "merge"
[master 45f5e0a] merge
执行提交(注意:此时使用 git commit 命令时不能带文件名)
修改完毕
master、hot-fix 其实都是指向具体版本记录的指针。当前所在的分支,其实是由 HEAD决定的。所以创建分支的本质就是多创建一个指针。
HEAD 如果指向 master,那么我们现在就在 master 分支上。
HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上。
所以切换分支的本质就是移动 HEAD 指针。
Git团队协作机制
团队内
跨团队协作
GitHub操作
常用命令
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
创建远程库别名
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git remote -v
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git remote add git-demo https://github.com/Anianqi/git-demo.git
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git remote -v
git-demo https://github.com/Anianqi/git-demo.git (fetch)
git-demo https://github.com/Anianqi/git-demo.git (push)
远程库别名既可以获得fetch也可以push推送
推送本地分支上的内容到远程仓库
git push 别名 分支
$ git push git-demo master
拉取远程库内容
git pull 远程库地址别名 远程分支名
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git pull git-demo master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 651 bytes | 108.00 KiB/s, done.
From https://github.com/Anianqi/git-demo
* branch master -> FETCH_HEAD
45f5e0a..b650e2b master -> git-demo/master
Updating 45f5e0a..b650e2b
Fast-forward
hello.txt | 1 +
1 file changed, 1 insertion(+)
查看本地库状态
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git status
On branch master
nothing to commit, working tree clean
本地库是干净的,说明拉取直接提交本地库
这样远程库和本地库的代码是同步的
克隆
git clone 地址
克隆之前拿到代码的连接
克隆代码不需要账号密码
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo02
$ git clone https://github.com/Anianqi/git-demo.git
Cloning into 'git-demo'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 21 (delta 4), reused 17 (delta 3), pack-reused 0
Receiving objects: 100% (21/21), done.
Resolving deltas: 100% (4/4), done.
地址为远程仓库地址,克隆结果:初始化本地仓库
小结:clone 会做如下操作。1、拉取代码。2、初始化本地仓库。3、创建别名
邀请加入团队
在github库的setting中进行邀请操作,就可以让成员push代码
使用不同的账号进行推送和拉取操作
跨团队操作
使用fork和pull request的方式完成
SSH免密登录
我们可以看到远程仓库中还有一个 SSH 的地址,因此我们也可以使用 SSH 进行访问。
使用加密的方式生成ssh
-C 描述
rsa 非对称加密算法
ssh-keygen -t rsa -C 719189161@qq.com
获取公钥
cat id_rsa.pub
使用SSH协议pull代码
77@XIAOQI-1106 MINGW64 /d/java-02P/git-demo (master)
$ git pull git@github.com:Anianqi/git-demo.git master
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 1.25 KiB | 67.00 KiB/s, done.
From github.com:Anianqi/git-demo
* branch master -> FETCH_HEAD
Updating ea7db16..15b9455
Fast-forward
hello.txt | 1 +
1 file changed, 1 insertion(+)
git push ssh 分支
git pull ssh 分支
IDEA集成GIT
配置Git忽略文件
问题 1:为什么要忽略他们?
答:与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。
问题 2:怎么忽略?
创建忽略规则文件 xxxx.ignore(前缀名随便起,建议是 git.ignore)
这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig 文件引用,建议也放在用户家目录下
不同的idea版本可能和视频中的操作略微不一样
IDEA集成Github
可以使用口令和账号两种方式登陆
注意:push 是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致, push 的操作是会被拒绝的。也就是说,要想 push 成功,一定要保证本地库的版本要比远程库的版本高!因此一个成熟的程序员在动手改本地代码之前,一定会先检查下远程库跟本地代码的区别!如果本地的代码版本已经落后,切记要先 pull 拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!
自建代码托管平台-GitLab
内存有限 手动放弃