Git随笔

环境 & 教程:
macOS Big Sur 11.2.1(m1)
Git 使用简易指南(含安装)
在线网站实操(强烈推荐)
Pro Git 官方中文教程(推荐)


直观的动画演示

  • 关于在线网站实操的快捷操作:
    • 点击右边动画可以查看对应的简单命令
    • levels 可以查看并选择关卡
      • level intro1 快速跳转到第一关
      • show goal 查看当前目标
      • hide goal 或点击画面隐藏目标
      • objective 查看当前关卡提示
      • undo 撤销 reset重做

Git

  • 分布式版本控制: 每个人的电脑都是一个完整的版本库,可离线本地提交,联网时再push,不因服务器损坏或网络问题造成工作停止
  • 若对某个命令感兴趣,如git checkout,在命令行下输入man git-checkout,你会发现一切变得简单起来

文件状态

  • 未追踪(untracked)
  • 已追踪(tracked)
    • 已修改(modified)
      • 表示修改了文件,但还没保存到数据库
    • 已暂存(staged)
      • 表示对一个文件的当前版本做了标记,使其包含在下次提交的快照中
    • 已提交(commited)
      • 表示数据已经保存在本地数据库中

已追踪下的三个状态对应了Git项目中的三个阶段: 工作区、暂存区以及 Git 目录。
工作区、暂存区以及 Git 目录

尚处于未跟踪(untracked)状态的某种意义来讲不属于上图叙述的工作区。可以把暂存区中的文件理解为下次将提交至仓库的文件,单纯的语言有些枯燥,不妨往下面看看,命令的反馈或许给你带来一些感触。
图片

查看配置 & 配置基础信息

git config -l # 查看所有配置
git config --system -l # 系统配置
git config --global -l # 全局配置
git config --user.name "yourname" # 配置你的用户名和邮件地址,这很重要
git config --user.email "youremail"

我个人的配置文件在~/.gitconfig,其内容与--global查看到的内容一致

基础命令

命令会基于创建在家目录下的~/notes进行阐述假设你创建了,当然,你也可以在你的桌面上新建一个文件夹,叫什么都行。

创建仓库

在需要版本控制的目录下初始化本地仓库

现在你想对的notes进行版本控制,只需切换到对应文件夹,初始化仓库

cd ~/notes
git init # 文件路径可选,默认在当前文件夹下,此时会创建.git文件夹

查看状态

现在来看看你的笔记里面有啥能放进仓库的

git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

好的,什么都没有。来添加点东西,相信下面的命令你们都懂的,不懂百度~

touch English
echo "English is very easy!" >> English

再输入git status看看有什么变化:

On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
(use "git add <file>..." to include in what will be committed)
English

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

提示有一个未跟踪的文件English,使用git add进行跟踪

或许你会觉得命令的输出有些长,可以使用git status -s or git status --short缩短命令输出

git status -s

你会得到一段非常简短的反馈

?? English

??表示该文件为新添加的未跟踪文件

将文件增加到下次提交序列

git add指令实际上是一个多功能指令,但先不展开介绍,先处理English

git add English

似乎没有任何反馈,不用担心,用git status看看就好了

On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: English

可以看到English文件已经处于暂存区了,此时使用git restore --staged <file>可以移出暂存区,变为不跟踪的状态当然不移了
来给英语笔记添加点内容,然后看看变化

echo "My English is very poor" >> English
git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: English

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: English

提示English发生了改变,但是不在暂存区,用git add把它加到暂存区(下一次提交的队列),或者git restore 丢弃此次更改。

此时你可能有点好奇简短的输出是什么样子的,让我们输入git status -s看看

AM English

引入-+来方便讲解,此时??->AM,我们将-s输出的类型分为两栏,左边的是暂存区的状态,右边是工作区的状态。看一下上面未缩减的输出可以发现,此时存在两个English笔记,对应于缩减的输出可以理解为AM的A表示有同名的文件暂存了,M表示后来修改过的文件没有暂存,有没有觉得-s的输出短小精悍

-?? English
+AM English

git diff查看修改

假设此时你不太记得更改了什么

git diff

温馨提示,按q退出

diff --git a/English b/English
index e69de29..82b9f44 100644
--- a/English
+++ b/English
@@ -0,0 +1 @@
+My English is very poor
(END)

高亮的那一行就是你添加的内容你英语不好

分支操作

创建和切换

git branch # 查看本地分支
git branch -r # 查看远程(remote)分支
git branch [branch_name] # 建立分支
git branch -d [branch_name] # 删除分支
git checkout [branch_name] # 切换分支
git checkout -b [branch_name] # 创建分支并切换过去

合并

若你现在建立了两个分支,一个main,一个是bugFix,两个分支都各自对文件进行了部分修改,此时你想合并修改看是否符合预期。
合并前

使用git status可以查看当前分支,假设main为当前所在分支。

merge

把修改拉过来

git merge bugFix则可将bugFix修改的记录合并至main,此时main包含了所有的修改,但注意,bugFix没有,应使用git checkout bugFix; git merge main切换至bugFix分支并再次合并。
若你对此缺少主观的印象,建议点击该网站,输入level intro3
merge

rebase

让修改看起来是顺序开发的
命令: git rebase bugFix

rebase

忽略文件

将不需要提交的文件加入.gitignore文件中
忽略文件的规则:

  • # 注释
  • 可采用通配符
  • ! 取反
  • /home 表示只忽略当前文件夹下 home 文件,不包括其他目录下的home
  • dir_name/ 忽略任何目录下名为dir_name的文件夹

克隆远程(remote)仓库

git clone url [file_name] # 文件路径可选,默认到当前文件夹下

若出现403错误,检查钥匙串是否有两个账号,更改/删除另一个账号

扩展

码云公钥生成

cd ~/.ssh
ssh-keygen
pbcopy < ~/.ssh/id_rsa.pub # 已拷贝至剪切板,直接黏贴即可

copyhttps://gitee.com/profile/sshkeys下即可

参考链接

详解Github的.gitignore忽略文件+.gitignore不生效解决方案+生产配置大奉送

MAC 生成SSH公钥