Linux基础 第五讲 Git

1.Git教程

AcWing代码托管平台

Git可视化学习网站-游戏

Git大全 - 教程综合


1.1 Git基本概念

Git 是一个版本控制工具,可以记录我们每次提交到 Git 中的版本,便于版本控制;上传到云端可以对本地的Git版本进行存档,以及进行多人协作开发。

Git是用树的结构来维护所有的版本记录,最开始节点是一个空的根节点。

HEAD根节点会始终指向最新提交的那个节点

概念

工作区:仓库的目录

暂存区数据暂时存放的区域类似于工作区写入版本库前的缓存区

工作区、暂存区都是独立于各个分支的。

版本库:存放所有已经提交到本地仓库的代码版本。

版本结构:树结构,树中每个节点代表一个代码版本。


1.2 Git常用命令

个人开发最最最最常用的4个git命令!!!只使用master分支即可

git pull git add . git commit -m "xxx" git push


协作开发会用到的命令!!

Git全局配置

在使用Git服务之前,你需要进行全局配置

git config --global user.name xxx:设置全局用户名

git config --global user.email xxx@xxx.com:设置全局邮箱地址

设置的信息记录会存储在~/.gitconfig文件中

开始使用的流程,

注意!!!github的默认分支名为main

1
2
git branch -M main # 修改本地的分支名(master --> main)
git push -u origin main # 将本地分支上传至云端
image-20230708003343580

Git常用操作

你需要新建一个项目目录 eg. project/

git init:将当前目录配置成git仓库,信息记录在隐藏的.git文件夹中

目录里的文件被修改后,需要将文件从工作区添加到暂存区并进行持久化

git add XXX:单独将XXX文件添加到暂存区,可添加多个文件或目录,用空格隔开

这两个命令,通常一起使用

git add .将所有待加入暂存区的文件加入暂存区

git commit -m "这次提交的备注信息"将暂存区的内容提交到当前分支,进行持久化

git status查看当前仓库状态

git diff XXX:查看XXX文件的工作区相对于暂存区对应的文件的差异

git diff HEAD: 显示工作区与当前分支最新commit提交之间的差异

git log查看当前分支的所有版本,按q退出查看状态

git log --onelinegit log --pretty=oneline:让日志格式化显示在一行

HEAD会指向最后一次持久化操作的节点,即HEAD指向最新的版本

git log --stat:显示 commit 历史,以及每次 commit 发生变更的文件


删除/撤销命令

git rm --cached XXX将文件从仓库索引目录中删掉,不希望管理这个文件

(将本地文件删除的话,git rm XXX,提交commit后,再git push

git restore --staged XXX将XXX从暂存区里移除,文件内容不会被修改

git restore XXX可将暂存区的文件回滚

git checkout — XXXgit restore XXX:将XXX文件尚未加入暂存区的修改全部撤销,类似ctrl+z


代码回滚

git reflog:查看HEAD指针的移动历史(包括被回滚的版本)

git reset --hard HEAD^ git reset --hard HEAD~:将代码库回滚到上一个版本

  • git reset --hard HEAD^^:往上回滚两次”^^”,以此类推

  • git reset --hard HEAD~100:往上回滚100个版本

  • git reset --hard 版本号:回滚到某一特定版本(版本号是用git log 看到的commit前7位字符)


创建/合并分支

git checkout -b branch_name创建并切换到branch_name这个分支

git branch branch_name创建新分支branch_name

git checkout branch_name切换到branch_name这个分支

git branch:查看所有分支和当前所处分支

git branch -r : -r,remote 查看所有远程分支

git branch -a: -a,all 查看所有分支,包括本地分支和远程分支

git merge branch_name将分支branch_name合并到当前分支上

(若分支合并后有冲突,需要自己手动解决)

git branch -d branch_name删除本地仓库的branch_name分支

git pull将远程仓库的当前分支与本地仓库的当前分支合并,从云端拉回本地

  • git pull origin branch_name:将远程仓库的branch_name分支与本地仓库的当前分支合并

ps: 多人协作开发同一个分支时,
第一个人push提交后,第二个人也push提交了会有冲突,需要第二人先pull新版本后,合并本地修改冲突后,再push自己的代码。


远程仓库

你需要再远程仓库创建一个仓库,并配置SSH将主机的公钥填写至远程仓库中。

git remote add origin SSH克隆的地址 :将本地仓库关联到远程仓库

连接gitlab时,进行git clone时,出现fatal: remote origin already exists.

需要先git remote remove origin,然后再关联远程仓库

git push -u :(第一次需要-u,upstream上传流,以后不需要),git push将当前分支推送到远程仓库

  • git push origin branch_name将本地的某个分支推送到远程仓库

git clone git@git.acwing.com:xxx/XXX.git将远程仓库XXX下载到本地,比如用另一台电脑开发

git push --set-upstream origin branch_name:设置本地的branch_name分支对应远程仓库的branch_name分支

git push -d origin branch_name删除远程仓库的branch_name分支

(git branch -d branch_name删除本地仓库的branch_name分支)

git branch --set-upstream-to=origin/branch_name1 branch_name2

将远程的branch_name1分支与本地的branch_name2分支对应,两分支名最好相同

git checkout -t origin/branch_name 将远程的branch_name分支拉取到本地


Stash栈操作

使用 Stash 将我们目前工作区和暂存区中未提交的修改添加进去。等处理完一些线上的问题再把刚才的工作的文件从 Stash 中弹出来继续开发,

git stash:将工作区和暂存区中尚未提交的修改存入栈中

git stash apply:将栈顶存储的修改恢复到当前分支,但不删除栈顶元素

git stash drop:删除栈顶存储的修改

git stash pop:将栈顶存储的修改恢复到当前分支,同时删除栈顶元素

git stash list:查看栈中所有元素


1.3 其他

小Tips:

让vscode不显示git修改的文件

问题所在:在项目最外层文件夹git init了,产生了一个.git文件。
解决方法:在终端进入最外层文件夹,输入命令:rm -rf .git ,删除git相关配置文件


2.作业

1
2
homework 5 create  # 可以重新创建所有lesson_5的作业
homework 5 test # 可以评测lesson_5的所有作业

注意: 本次作业的10个题目不是独立的,每个题目会依赖于前一个题目,因此评测时如果当前题目错误,则不再评测后续题目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
创建好作业后,先进入文件夹/home/acs/homework/lesson_5/,然后:

(0) 在当前目录下创建文件夹homework,并将homework目录配置成git仓库。后续作业均在homework目录下操作;

(1) 创建文件readme.txt,内容包含一行:111;
将修改提交一个commit;

(2) 在readme.txt文件末尾新增一行:222;
将修改提交一个commit;

(3) 创建文件夹:problem1和problem2;
创建文件problem1/main.cpp。文件内容为下述链接中的代码:https://www.acwing.com/problem/content/submission/code_detail/7834813/;
创建文件problem2/main.cpp。文件内容为下述链接中的代码:https://www.acwing.com/problem/content/submission/code_detail/7834819/;
将修改提交一个commit;

(4) 删除文件夹problem2;
创建文件夹problem3;
创建文件problem3/main.cpp。文件内容为下述链接中的代码:https://www.acwing.com/problem/content/submission/code_detail/7834841/;
将readme.txt中最后一行222删掉,然后添加一行333;
将修改提交一个commit;

(5) 在https://git.acwing.com/上注册账号并创建仓库,仓库名称为homework;
将本地git仓库上传到AC Git云端仓库;

(6) 创建并切换至新分支dev;
在readme.txt文件中添加一行444;
将修改提交一个commit;
将dev分支推送至AC Git远程仓库;

(7) 切换回master分支;
在readme.txt文件中添加一行555;
将修改提交一个commit;

(8) 将dev分支合并到master分支;
手动处理冲突,使readme文件最终内容包含4行:111、333、555、444;
将修改提交一个commit;

(9) 将master分支的版本库push到AC Git云端仓库;
登录myserver服务器(4. ssh作业中配置的服务器);
创建并清空文件夹:~/homework/lesson_5/;
将AC Git云端仓库clone到~/homework/lesson_5/中;

作业打卡地址

待完成~~


3.参考资料

Linux基础课及讲义 - AcWing

Linux基础课 - 第 5 讲 Git - by Toggle

Linux笔记 5 - Git - by 溯光