GeekHour-一小时Git教程-笔记

学习地址

【GeekHour】一小时Git教程

学习记录

1
2
3
4
# 查看工作区的文件
ls
# 查看暂存区中的文件
git ls-files
BASH

07.使用git diff 查看差异

语法
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
# 查看 工作区和 暂存区的差异,这也是默认的比较内容
git diff
# 查看 工作区和 版本库的差异
git diff HEAD
# 查看 暂存区和 版本库的差异
git diff --cached
# 比较特定版本之间的差异:使用的时候在git diff后面加上要比较的版本的提交ID即可
git diff 5af90b8 3jdi34o2



# 还可以用HEAD标识当前分支的最新提交
git diff 5af90b8 HEAD
#(常用)用HEAD~或者HEAD^表示当前版本的上一版本,那么查看当前版本和上一版本的差异就可以写成:
git diff HEAD~ HEAD
git diff HEAD^ HEAD
#HEAD~后加上具体数字表示HEAD前几个版本
git diff HEAD~2 HEAD
# 上述命令后可以加上文件名,只查看特定文件的差异
git diff HEAD~2 HEAD file1.txt



# 比较分支之间的差异
git diff <branch name> <branch name>

BASH

08.使用git rm删除文件

git rm的优势

可以使用git rm file1.txt来直接删除工作区和暂存区的文件,比较方便
而不用git rm也可以,就是先rm file1.txt在执行git add .麻烦一点。

语法
1
2
3
4
# 删除文件
git rm <file>
# 把文件从暂存区中删除,但保留在当前工作区中
git rm --cached <file>
APPLESCRIPT

09.使用.gitignore忽略文件

应该忽略哪些文件


在.gitignore中添加文件名后,运行git status会发现该文件不再被git所自动追踪

在.gitignore里添加忽略前已经被添加到版本库中的文件,在.gitignore文件添加忽略后, 仍然会被追踪,比如文件内容发生了变化

语法
  • 在gitignore中添加文件的名字表示不追踪
  • 在gitignore中还可以添加文件夹的名字

举例说明

1
2
3
4
5
6
7
8
mkdir temp
git status #这时会显示nothing to commit,因为git默认不追踪空文件夹的

touch temp/file1.txt
git status #这次会提示file1.txt需要commit

#将文件夹添加进版本管理,注意文件夹都是以斜线/结尾!
echo temp/ >> .gitignore
BASH
.gitignore文件匹配规则

举例说明

11.SSH配置和克隆仓库

实践
配置SSH

这里可以参考我的SSH配置笔记2.设置SSH密钥登录教程
然后在github上添加本机的SSH公钥
https://github.com/settings/keys

创建仓库

直接在github上new respority

然后使用ssh方式git clone下来即可

关联clone下来的本地和远程仓库-通过git push和git pull
语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 首先clone远程仓库
git clone git@remote-address/respority-name.git

# 然后执行各种中间操作
git add... git commit...

# 确定本地仓库修改后,推送变更到远程仓库
git push <远程仓库名> <远程分支名>:<本地分支名>
# 如果本地仓库的分支名称和远程仓库的名称相同,写一个就可以了
git push <远程仓库名> <分支名>

# 只执行git push 表示推送到名为origin,分支为main的远程仓库
git push
# 之后若要同步他人对远程仓库的变更,执行
git pull <远程仓库名> <远程分支名>:<本地分支名>
# 只执行git pull 表示从名为origin,分支为main的远程仓库拉取
git pull
BASH


我们在git commit之后,改变的是本地的仓库,要推送到远程仓库去,需要使用git push,使用git pull拉取别人的修改。

实践

12.关联已经存在的本地仓库和远程仓库

语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 添加远程仓库,<shortname>表示表示远程仓库的别名,一般默认 origin 也可以取别的名字代替,url即为远程仓库地址。
git remote add <shortname> <url>

# 添加完远程仓库后,使用该命令查看当前仓库对应的远程地址
git remote -v

# 指定本地分支名称
git branch -M <branch-name>

# 通过git push -u建立远程仓库和本地仓库的关联
git push -u<远程仓库名> <远程分支名>:<本地分支名>
# 如果本地仓库的分支名称和远程仓库的名称相同,写一个就可以了
git push -u<远程仓库名> <分支名>
# 使用-u建立本地仓库和远程仓库的追踪关系后,之后可以执行git push 表示推送到名为origin,分支为main的远程仓库
git push
# 之后若要同步他人对远程仓库的变更,执行
git pull <远程仓库名> <远程分支名>:<本地分支名>
# 只执行git pull 表示从名为origin,分支为main的远程仓库拉取
git pull
BASH
和上面第11点里关联clone下来的本地和远程仓库的区别
  • clone下来的的仓库是来自于已经存在的远程仓库,两者之间本就已经存在联系
  • 已经存在的本地仓库则和远程仓库没有关联,因此需要手动创建关联。
  • 在12点里因为是本地仓库关联远程分支,需要使用git push -u手动建立追踪关系,而在11点里则使用git push就行。

    git-push用法:-u参数

    1. 加 -u 的效果:
    • 使用 git push -u <remote> <branch>,会将本地分支与远程分支关联起来。
    • 建立追踪关系后,后续在该分支上推送或拉取时,不需要再指定远程分支,可以直接使用简单命令:
      git pull git push
      而不需要显式指定 git push origin branch
      示例
      git push -u origin main
      效果
    • 将本地 main 分支推送到远程仓库的 main 分支。
    • 本地分支 main 与远程 origin/main 建立了追踪关系。
    • 之后在本地 main 分支,可以直接运行:
      git pull git push
    2. 不加 -u 的效果:
    • 使用 git push <remote> <branch>,仅推送本地分支到远程对应分支,但不建立追踪关系
    • 后续每次 pushpull 都需要显式指定远程分支。
      示例
      git push origin main
      效果
    • 将本地 main 分支推送到远程仓库的 main 分支。
    • 不会建立追踪关系。
    • 之后每次推送或拉取时,都需要指定远程分支:
      git pull origin main git push origin main
    3. 如何查看追踪关系

    使用 git branch -vv 命令可以查看本地分支与远程分支的关联情况。
    示例

    1
    2
    3
    $ git branch -vv 
    * main a1b2c3d [origin/main] Initial commit
    * feature d4e5f6g [origin/feature] Added new feature
    MAXIMA

    这里可以看到 mainfeature 分支分别追踪了 origin/mainorigin/feature

    4. 什么时候需要用 -u
    • 首次推送新分支:在第一次将本地分支推送到远程分支时,建议使用 -u,方便后续操作。
    • 关联已有分支:如果本地分支已经存在,但没有追踪远程分支,可以用 -u 来建立关联。
    5. 为已存在的分支建立追踪关系

    如果忘记加 -u,可以手动建立追踪关系:
    git branch --set-upstream-to=origin/main main

实践
首先在github上创建一个仓库

注意,为了看到提示界面,记得在创建仓库的时候不要勾选”Add a README FILE”,不然会无法看到以下界面:

其中主要看第二段:

解释如下:

1
2
3
4
5
6

git remote add origin git@github.com:Ethan-Aric/first-repo.git
# 指定本地分支名称为main,一般本地分支默认为main,所以这句可以省略掉
git branch -M main
# 把本地的main分支和远程仓库关联起来
git push -u origin main
BASH

16.分支简介和基本操作

什么是分支

多人共同协作开发时,在原有的一条主线上可以分支出另一条分支供他人开发,同时不耽误主线的进度,这条分支可以起到多种功能,例如

  • bug修复
  • 合入新的pr
  • 添加新的feature
分支的特点
  • 每个分支都有自己独立的提交记录和工作区,在主线节点创建分支时,该分支具有原有节点的工作区内容,但此时没有提交记录。
语法

  • 分支间切换需要使用git switch 进行,创建分支后,并不会自动切换到新创建的分支上,可以用switch切换过去
  • 切换分支后,原有工作区内容也会随着切换到当前工作区的样子
  • git merge合并分支后面跟的branch-name表示要被合并的分支名,执行merge后branch-name分支会被合并到当前正在的分支上,所以我们在合并分支前要先切换分支。
  • 上面删除分支中-d用在git merge之后,如果还未执行merge操作是无法用-d删除的,此时可以用-D强制删除。

17.解决合并冲突

语法

18.回退和rebase

语法
1
git rebase <branch name>
BASH
什么是rebase

除了merge以外,还有一种方法可以把不同分支的内容整合到一起,这就是rebase。rebase意思是“变基”。

rebase的效果

原分支如下:

执行rebase后:

可以看到,正如rebase的含义所示,git rebase main表示以main分支为基,所以main分支不变,把dev分支和main分支的相同祖先节点之后的提交记录裁剪到了main分支的后面。而git rebase dev则是把main分支的提交记录裁剪到了dev分支后面。

rebase和merge的区别,如何区分使用
区别
  • merge一般在main分支上执行,而rebase可以在任一分支上执行。
区分使用
  • git merge的特点
    优点:不会破坏原分支的提交历史,方便回溯和查看
    缺点:会产生额外的提交节点,分支图比较复杂。
  • git rebase的特点
    优点:不会新增额外的提交记录,形成线性历史,比较直观和干净
    缺点:会改变提交历史,改变了当前分支branch out的节点。避免在共享分支使用

19.分支管理和工作流模型

GitFlow模型
组成分支
  1. 基线分支,也即main/master分支,一般是生产版本也即最终发布的代码,不允许直接修改,只能通过合并分支的方式修改。每次合并都建议生成一个新的版本号,可以通过git tag命令来标记版本号。以下是一个常见版本号规则:
  2. 问题修复分支,也即hotfix分支,一般从主线分支分离出来的
  3. 开发分支,一般是从主线分支分离出来的。
  4. 功能分支,一般用于添加某一功能时,是从开发分支分离出来的,当功能稳定后再合并回开发分支中。
  5. 版本发布分支,也叫预发布分支,release分支。包含项目最新代码,用于正式发布前验证。一般是从开发分支中分离出来的。
以上分支按照重要性分类:
  • 主要分支:即main和develop分支,这两个分支最重要,一般也是长期存在的。
  • 辅助分支:其他分支属于辅助分支,一般在完成各自功能后就可以删除了。
GitHub Flow工作模型
特点
  • 相比于git flow工作模型简单明了
  • 适用于技术水平比较高的团队或者开源项目
组成分支

仅仅两条分支,主分支和功能分支,主分支是不允许提交的,并且主分支上的代码可以直接用于生产环境
团队成员可以从主分支中分离出自己的分支进行开发和测试,然后在本地分支提交代码,等到开发完成后,可以Pull Request,中文名也叫拉请求/合并请求,团队成员可以对代码进行Review评审,如果没有问题就可以把这个PR发布和合并到主线分支中。

命名规范

在GitHub Flow流程中,这些良好的规范也是必须的


GeekHour-一小时Git教程-笔记
http://lightandsqlt.site/2025/01/18/学习/(发布)GeekHour-一小时Git教程-笔记/
作者
Ethan
发布于
2025年1月18日
许可协议