CS100 bonus reciation -- How to use git

From Chaofan Li

【GeekHour】一小时Git教程

Git

  • 免费
  • 开源
  • 分布式管理版本控制系统

Repository

left

purpose -- why use git?

right

purpose -- why use git?

20241014153647

cooperation in SI100B

tell a story

  • 有一天小李和小刘CS100大作业组队,他们要写一个植物大战僵尸的游戏。

  • 他们约好一个人写植物,一个人写僵尸,写完自己的part就用微信把plant.c文件和zombie.c文件用微信传过去看看能不能work

  • 小李下载了小刘写的zombie.c,然后发现不能work,然后改了自己写的plant.c然后微信传给小刘

  • 小刘下载了小李的plant.c以后又发现自己少写了个僵尸,补上以后正准备给小李时候收到了来自他的plant.c,然后替换了plants.c到最新版本以后发现又不能和自己新写的一起work了,于是他把自己zombie.c发过去让小李改好自己的plants.....

bad ending

  • 此时小李已经感到有些生理不适了,但他还是按着最新的zombie.c改好了自己的plant.c并微信发过去
  • 但是小刘是个完美主义者,他一定要把自己的僵尸弄好看点于是又弄了一版zombie.c然后发给lcf让他提交
  • 提交时候小李手滑没弄错了版本,把初代zombie.c用zip压缩后提交了
  • 当然这个zip编译都编译不了的,两人天神下凡怒砍一个B,小刘对这次合作非常生气,删掉了小李的好友

(以上故事纯属虚构)

协作 - 分布式和集中式

飞书&金山协作&集群内协作 - 集中式

20241014160010

集中式 - 下载

编辑之前从云端下载,编辑之后实时上传:需要时刻保持和云端的连接

20241014160103

git - 分布式

20241014174304

git

20241014174325

git

20241014174539

20241014174646

20241014174708

git 安装

git下载连接

用终端里面的git -v去检测是否安装好

git config

为了识别是谁编辑上传的文件,需要绑定好git的用户名和邮箱(和后面的github用户名邮箱一致)

git config --global user.name "Heaticy"
git config --global user.email "1712371381@qq.com"

邮箱的双引号可以省略

这两个命令在一台电脑上只需要执行一次即可

新建仓库-Repository

仓库:把你当前工作区的文件目录设置为一个仓库,git会记录你整个目录下的文件版本改动

  • 方式一:git init:从本地创建
  • 方式二:git clone:从云端复制现有的仓库

工作区域和文件状态-工作区

20241014180332

工作区:资源管理器里面看到的文件夹

工作区域和文件状态-暂存区

20241014180526

暂存区:写了一部分代码,临时保存,可以随时轻易回退一个版本的临时区

工作区域和文件状态-本地仓库

本地仓库:记录了所有文件的版本改动,和版本信息

20241014180639

工作区域和文件状态-工作区域

20241014180836

工作区域和文件状态-文件状态

20241014180950

terminal-git (git init)

PS E:\gitpre> git init
Initialized empty Git repository in E:/gitpre/.git/

terminal-git (git add)

我们先创建一个a.c文件,然后把他加入暂存区

PS E:\gitpre> git add a.c
PS E:\gitpre> git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   a.c

如果git add后面加.则是把所有工作区所有的文件加入暂存区,.表示所有的文件

PS E:\gitpre> git add .

terminal-git (git commit)

然后上传至本地仓库,-m后的引号内容为提交信息

PS E:\gitpre> git commit -m "first commit"
[master (root-commit) bf9079d] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.c

当然不加-m在linux,mocOS上也可以,则是使用vim等编辑器来添加提交信息

git commit -a -m "first commit"

可以把已经追踪的文件加入暂存并提交,但是得先add

terminal-git (git log)

1b793dbe4532f70cb1b9bec6005354b49ebbba2e 是提交ID

PS E:\gitpre> git log
commit 1b793dbe4532f70cb1b9bec6005354b49ebbba2e (HEAD -> master)
Author: Heaticy <1712371381@qq.com>
Date:   Mon Oct 14 18:39:03 2024 +0800

    fist commit

用git oneline可以获得更简洁的信息

PS E:\gitpre> git log --oneline
1b793db (HEAD -> master) fist commit

terminal-git

20241014184522

terminal-git(git reset)(回溯)

  • git reset --soft 回退到某个版本,保留工作区和暂存区
  • git reset --hard 回退到某个版本,丢弃工作区和暂存区
  • git reset --mixed(默认)回退都某个版本,保留工作区,丢弃暂存区

terminal-git (git reset --soft)

创建一个新文件叫1.txt

20241014185418

然后提交

PS E:\gitpre> git commit -m "add 1.txt"
[master 8665890] add 1.txt
 1 file changed, 1 insertion(+)
 create mode 100644 1.txt

terminal-git (git reset --soft)

PS E:\gitpre> git log
commit b0c1dee188f1659236f57df625391f4b07de5dbc (HEAD -> master)
Author: Heaticy <1712371381@qq.com>
Date:   Mon Oct 14 18:54:56 2024 +0800

    add 1.txt

commit 1b793dbe4532f70cb1b9bec6005354b49ebbba2e
Author: Heaticy <1712371381@qq.com>
Date:   Mon Oct 14 18:39:03 2024 +0800

    fist commit

terminal-git (git reset --soft)

PS E:\gitpre> git reset --soft 1b793db
PS E:\gitpre> ls   #查看工作区,工作区没变
    目录: E:\gitpre
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/10/14     18:52              3 1.txt
-a----        2024/10/14     18:26              0 a.c

PS E:\gitpre> git ls-files #查看暂存区,暂存区没变
1.txt
a.c

PS E:\gitpre> git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   1.txt

所以说这时候就只有本地仓库状态变了,回溯到了commit之前

terminal-git (git reset --mixed)

PS E:\gitpre> git reset --mixed 1b793db
PS E:\gitpre> ls     #查看工作区,工作区没变
    目录: E:\gitpre
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/10/14     18:52              3 1.txt
-a----        2024/10/14     18:26              0 a.c
PS E:\gitpre> git ls-files   #查看暂存区,暂存区被清空了
a.c
PS E:\gitpre> git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        1.txt

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

所以说这时候就只有本地仓库状态变了,回溯到了add之前

terminal-git (git reset --hard)

PS E:\gitpre> git reset --hard 1b793db
HEAD is now at 1b793db fist commit
PS E:\gitpre> ls                       


    目录: E:\gitpre


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/10/14     18:26              0 a.c


PS E:\gitpre> git ls-files
a.c

工作区回溯到那个版本,暂存区也清空,全部回到你修改文件之前

terminal-git (git reset --hard)

PS E:\gitpre> git reset --hard 1b793db
HEAD is now at 1b793db fist commit
PS E:\gitpre> git log
commit 1b793dbe4532f70cb1b9bec6005354b49ebbba2e (HEAD -> master)
Author: Heaticy <1712371381@qq.com>
Date:   Mon Oct 14 18:39:03 2024 +0800

    fist commit

用了hard以后git log都没后面版本的记录了

但你若是还记得前面版本号的话还是可以回去的

PS E:\gitpre> git reset --hard b0c1dee188f1659236f57df625391f4b07de5dbc 
HEAD is now at b0c1dee add 1.txt

git diff

  • 提交之前,可以看看自己这一版改了啥

20241014190923

git diff

  • 提交之前,可以看看自己这一版改了啥
PS E:\gitpre> git diff
diff --git a/1.txt b/1.txt
index 9d07aa0..183adcd 100644
--- a/1.txt
+++ b/1.txt
@@ -1 +1,2 @@
-111
\ No newline at end of file
+111^M
+222
\ No newline at end of file

git diff

PS E:\gitpre> git diff b0c1dee188 1b793db
diff --git a/1.txt b/1.txt
deleted file mode 100644
index 9d07aa0..0000000
--- a/1.txt
+++ /dev/null
@@ -1 +0,0 @@
-111
\ No newline at end of file

git diff

HEAD~表示上一个版本,HEAD表示当前版本
HEAD~2表示前两个版本

PS E:\gitpre> git diff HEAD~ HEAD        
diff --git a/1.txt b/1.txt
new file mode 100644
index 0000000..9d07aa0
--- /dev/null
+++ b/1.txt
@@ -0,0 +1 @@
+111
\ No newline at end of file

git diff

第三个参数填文件名也可以

PS E:\gitpre> git diff HEAD~ HEAD 1.txt
diff --git a/1.txt b/1.txt
new file mode 100644
index 0000000..9d07aa0
--- /dev/null
+++ b/1.txt
@@ -0,0 +1 @@
+111
\ No newline at end of file

.gitignore

git应该忽略哪些文件?

  • 系统或者软件自动生成的文件
  • 编译产生的中间文件和结果文件
  • 运行时生成日志文件、缓存文件、临时文件
  • 涉及身份、密码、口令、秘钥等敏感信息文件
  • .o .class .env .vscode .DSstore .zip

.gitignore

20241014192555

20241014192812

注册github

github是个存代码和仓库的网站,如果多人协作,则需要把本地仓库上传至云端(github,gitee等)

配置ssh

ssh是一个远程连接协议,可以让你的git和github云端之间连接,从而可以从本地上传github

ssh-keygen

然后一直回车

配置ssh

20241014193353

20241014193417

20241014193428

公钥一般在C:\Users"你的用户名".ssh\id_rsa.pub里面,你需要打开隐藏的文件

20241014193527

关联仓库

20241014193808

20241014193826

20241014193846

20241014193912

git clone &git push&git pull

PS E:\gitpre> git add .
PS E:\gitpre> git commit -m "remove return 0"
[master c6ebc7c] remove return 0
 1 file changed, 1 deletion(-)
PS E:\gitpre> git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 28 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 273 bytes | 273.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/Heaticy/gitpre.git
   af2427b..c6ebc7c  master -> master

git clone

20241014194333

git clone

PS D:\> git clone git@github.com:Heaticy/gitpre.git
Cloning into 'gitpre'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 14 (delta 2), reused 14 (delta 2), pack-reused 0 (from 0)
Receiving objects: 100% (14/14), done.
Resolving deltas: 100% (2/2), done.

git branch

20241015011121

git branch

PS E:\gitpre> git branch
* main
PS E:\gitpre> git branch dev
PS E:\gitpre> git checkout dev
Switched to branch 'dev'
PS E:\gitpre> git branch
* dev
  main
  PS E:\gitpre> git add .
PS E:\gitpre> git commit -m "dev first commit"
[dev e93eddb] dev first commit
 1 file changed, 6 insertions(+)
PS E:\gitpre> git push
fatal: The current branch dev has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin dev

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.

PS E:\gitpre>  git push --set-upstream origin dev
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 28 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 337 bytes | 337.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'dev' on GitHub by visiting:
remote:      https://github.com/Heaticy/gitpre/pull/new/dev
remote:
To https://github.com/Heaticy/gitpre.git
 * [new branch]      dev -> dev
branch 'dev' set up to track 'origin/dev'.

git marge

  • 合并
PS E:\gitpre> git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
PS E:\gitpre> git merge dev
Updating 76d5eb1..e93eddb
Fast-forward
 a.c | 6 ++++++
 1 file changed, 6 insertions(+)
PS E:\gitpre> git branch
  dev
* main
PS E:\gitpre> git push

20241015012627

git marge

  • 合并冲突

A和B 协作

最开始main下面没有return

A加了return 0
B加了return 1

A先push,B后push

Bpush的时候则显示合并冲突

提交则需要手动修改文件去解决冲突

而使用vscode可以更好帮你去快速解决冲突

git marge

20241015134711

vscode git

vscode上面的git比terminal稍微friendly一些

20241015003441

vscode git

20241015004016

vscode git

修改

20241015004421

diff(比较)

暂存区和工作区比较

20241015004858

vscode git

暂存

1728924449198

提交

在第一行输入提交信息,这个时候不是卡了,而是等待你保存这个文件,然后关闭

20241015010500

上传

点击同步更改即为git push

CS100 bonus reciation -- How to use git

From Chaofan Li