什么是git?

Git是一种分布式版本控制系统,用于跟踪项目文件的更改,特别是源代码。它允许多个开发者协作,能够有效地管理项目的版本历史。Git可以记录项目的每一次更改,使得开发者可以随时查看和恢复到以前的版本

Git通常和GitHub、GitLab、Gitee、Bitbucket、Azure DevOps等远端代码托管平台结合使用

Git常用命令

git init

在本地项目repo执行git init,会初始化这个repo,并在当前文件夹下创建一个.git文件夹.

如果从github上克隆项目到本地,可能会带有一个 .git 文件夹,该文件夹包含了该仓库的所有版本控制信息,包括提交历史、分支、标签等。它是Git用来跟踪文件变化和版本控制的核心部分。如果删除了.git文件夹,本地目录将不再被Git视为版本控制的项目,如果一个项目已经有.git文件夹,可以先删掉原来的再使用git init命令重新初始化。

git clone

用于从远端仓库克隆项目完整的代码库到本地,包括 .git 文件夹。基本语法如下

1
2
3
4
5
6
7
8
9
git clone <repository-url>
# 示例
git clone https://github.com/username/repository.git

# 还可以将项目克隆到指定文件夹
git clone <repository-url> <directory-name>
# 示例
git clone https://github.com/Zeyi-Lin/HivisionIDPhotos.git "D:\Python Project\HivisionIDPhotos"

git status

查询repo的状态.

On branch main:当前在 main 分支上

Changes not staged for commit:有一些文件已被修改但尚未准备好提交

Untracked files:有一个未被跟踪的文件,Git 没有管理这个文件

no changes added to commit:没有任何更改被添加到提交中

git status

git log

查看 Git 仓库的提交历史,显示所有提交的详细信息,包括每个提交的哈希值、作者、日期和提交信息。常用的选项包括下面几种

  • git log: 显示所有提交的提交信息,太多时可以按q退出查看
  • git log --oneline:以简洁的单行格式显示每个提交。
  • git log -n <number>:只显示最近的 <number> 次提交。
  • git log --graph:以图形方式显示提交历史,适合查看分支和合并情况。
  • git log --stat:显示每个提交的文件更改统计信息。
  • git log --author="name":只显示特定作者的提交记录

git log

git log --online

git add

将文件的更改添加到 Git 的暂存区(本地git的数据库中),为下一次提交做准备

常用命令如下:

  • git add filename.txt:添加单个文件
  • git add file1.txt file2.txt:添加多个文件
  • git add .:添加所有修改的文件(包括删除文件)
  • git add *.md:添加特定类型的文件,例如添加所有 .md 文件

git diff

用于比较文件之间的不同之处,可以帮助查看尚未提交的更改、两个分支之间的差异、或某个提交的内容等。常用命令如下:

  • git diff:查看工作目录和暂存区之间的差异
  • git diff <file>:查看特定文件的差异
  • git diff <commit-hash>:查看某个提交的差异

git diff

git commit

提交已经被add进来的改动,提交到本地的文件夹中,以便后续传到远端仓库,要先add再commit,

-m 是 “message” 的缩写

  • git commit -m "Your commit message":-m 选项后面跟的是提交信息,用于描述本次提交的内容,一般是一两句简述,说明做了什么改动

  • git commit -am "Your commit message":添加并提交,不需要先进性git add .,-a 选项会自动添加已跟踪的文件的更改(未跟踪的文件需要先使用 git add 添加)。

.gitignore文件

.gitignore 文件用于告诉 Git 哪些文件或目录在版本控制中应被忽略,写在.gitignore中的文件不会被 Git 跟踪,不会出现在提交中。

使用 git init 初始化一个新的 Git 仓库时,.gitignore 文件不会自动生成,需要手动创建 .gitignore 文件并添加想要 Git 忽略的文件和目录。.gitignore 文件本身也会被 Git 进行版本控制

git branch

用于管理 Git 仓库中的分支。它可以用于查看、创建和删除分支。常用的用法如下:

  • git branch:查看所有分支
  • git branch <branch-name>:创建新分支,但不会切换到该分支
  • git branch -d <branch-name>:删除分支
  • git branch -m <old-branch-name> <new-branch-name>:重命名分支

git remote

管理 Git 仓库的远程连接,可以查看、添加、修改和删除远程仓库的引用。

  • git remote:查看远程仓库
  • git remote -v:查看远程仓库详细信息
  • git remote add <name> <url>:添加远程仓库
  • git remote set-url <name> <new-url>:修改远程仓库URL
  • git remote remove <name>:删除远程仓库
  • git remote rename <old-name> <new-name>:远程仓库重命名

git pull

从远程仓库获取最新的更改并将其合并到当前分支,它实际上是 git fetchgit merge 的组合。

  • git pull:从默认远程仓库拉取更改
  • git pull origin main:从指定的远程仓库和分支拉取,origin为远程仓库名称(可以是别的名称或分支),main为所要拉取的分支

git push

将本地仓库中的更改上传到远程仓库,通常用于将本地提交(commit)后的更新推送到指定的远程分支。

1
2
3
4
5
6
# 推送到默认远程仓库仓库
git push
# 推送到指定远程仓库和远程分支
git push <remote> <branch>
# 示例
git push hexo_source main

git checkout

用于切换分支或恢复文件,git checkoutgit branch 都可以用来创建分支,但它们的用法和行为有所不同,主要在于创建后会不会切换到新创建的分支

  • git checkout <branch-name>:切换分支

  • git checkout -b <new-branch-name>:创建新分支并立即切换到该分支

  • git checkout -- <file-name>:恢复文件,把 file.txt 恢复到最后一次提交时的状态

git merge命令

将一个分支的更改合并到当前分支,一般都是先切换到main分支再执行把其他分支上的修改合并到main分支,可能会出现合并冲突

  • git merge <branch-name>:将指定的 <branch-name> 分支的更改合并到当前分支

git fetch命令

用于从远程仓库获取更新,但不会影响当前工作分支,因为它但不会自动合并这些更改到当前main分支,需要手动合并,除非使用的是git pull

  • git fetch,从默认远程仓库获取更改,一般是origin
  • git fetch upstream:从指定远程仓库获取更改,此处是从名为 upstream 的远程仓库获取最新更改

git tag

用于创建、列出和管理 Git 仓库中的标签。标签通常用于标记特定的提交,如版本发布或重要里程碑。

  • git tag:列出所有标签
  • git tag <tag-name>:创建轻量标签,轻量标签是一个简单的指向某个提交的引用,没有附加的元数据。例如git tag v1.0
  • git tag -a <tag-name> -m "Tag message":创建带注释的标签,带注释的标签可以包含更详细的信息,如作者、日期和标签信息,适合用于发布版本,例如git tag -a v1.0 -m "Release version 1.0"

git rm

用于从 Git 仓库中删除文件。它会在删除文件的同时将更改标记为待提交状态。这使得文件删除过程变得简单而一致。

  • git rm <file-name>:这将删除文件,并在下次提交时记录此更改
  • git rm -r <directory-name>:删除目录,要递归删除目录及其内容,可以使用 -r 选项,有点像Linux删除文件夹及其下面的内容

git reset

用于重置当前分支的 HEAD 指针到指定的提交,也就是回退到某个版本或之前的提交,挺重要的一个命令,还不太懂

git config

用于设置 Git 配置选项,包括用户信息、编辑器、合并工具等,配置可以在三个层级进行:系统级、用户级和仓库级。

  • git config --list:查看当前配置
  • git config --global user.name "Your Name":设置全局用户名
  • git config --global user.email "your.email@example.com":设置全局用户邮箱
  • git config user.name:查看用户配置

git config --list

检查git连接状态

可以通过以下命令测试能否通过 SSH 连接 GitHub

1
ssh -T git@github.com

如果配置正确,应该看到一条类似于以下的信息,其中 `username 是你的 GitHub 用户名

1
2
# 连接成功的回显信息如下
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

便捷表格

命令 功能
git init 初始化一个新的 Git 仓库
git clone 克隆一个远程仓库到本地
git status 查看工作目录和暂存区的状态
git add 将更改添加到暂存区
git commit 提交暂存区的更改
git push 将本地提交推送到远程仓库
git pull 从远程仓库拉取并合并更改到当前分支
git fetch 从远程仓库获取更新,但不合并
git branch 列出、创建或删除分支
git checkout 切换分支或恢复文件
git merge 合并两个分支的更改
git tag 创建、列出或删除标签
git rebase 将一个分支的更改应用到另一个分支上
git cherry-pick 从一个分支中选择特定提交并应用到当前分支
git stash 暂存未提交的更改,以便清理工作目录
git reset 重置当前分支到特定提交,可以选择保留或丢弃更改
git log 查看提交历史记录
git diff 查看文件或提交之间的差异
git remote 管理远程仓库
git config 配置 Git 设置,如用户名和邮箱
git blame 查看每一行代码的最后修改人及时间
git reflog 查看引用日志,记录所有更改的历史

git管理不同仓库问题

在 Git 中,每个仓库都有自己的配置,在不同的项目目录中使用 Git 时,每个项目的 Git 配置是独立的,每个项目都有自己的远程仓库配置,在执行 git push 时,不需要每次都指定远程仓库的名称和地址。Git 会根据该项目中的设置自动将代码推送到相应的远程仓库

独立的 Git 仓库: 每个 Git 仓库都有一个 .git 目录,这个目录包含了该仓库的所有配置信息。即使是在同一台电脑上,不同的项目路径也可以各自管理不同的 Git 仓库。

推送行为: 在项目目录下执行 git push 时,Git 会根据该仓库的远程配置推送代码。如果在 hexo/source/_posts 目录下,那么它只会推送到 hexo_source 这个远程仓库,而不是其他项目的远程仓库。

同一个本地仓库推送到不同的远程仓库

多个远程仓库指的是在同一个本地 Git 仓库中配置多个不同的远程仓库地址

主要目的是为了更好地管理代码、备份数据、或者在多个开发环境之间进行协作,常见场景如下:

  • 备份远程仓库:为了防止数据丢失,开发者可能希望将代码推送到多个远程仓库,以确保即使一个仓库出现问题,代码依然可以从其他仓库中恢复。
1
2
git remote add origin git@github.com:user/repo.git   # 主仓库
git remote add backup git@github.com:user/repo-backup.git # 备份仓库
  • 在不同平台上托管:一个项目可能同时在多个代码托管平台上托管,比如 GitHub、GitLab 或 Bitbucket。开发者可能需要在这些平台之间保持代码同步。
1
2
git remote add github git@github.com:user/repo.git     # GitHub
git remote add gitlab git@gitlab.com:user/repo.git # GitLab
  • 多人协作开发:在团队开发中,不同的团队成员可能使用不同的远程仓库,或者某些成员需要使用一个专门的开发仓库。
1
2
git remote add dev-team git@github.com:team/dev-repo.git   # 开发团队仓库
git remote add prod-team git@github.com:team/prod-repo.git # 生产环境仓库
  • 还有很多其他场景……