git详解

简介

Git 是一个分布式版本控制系统,用于跟踪计算机文件的变化,特别是源代码的管理。它允许多个开发者协作开发软件项目,并能够管理项目的历史记录。Git 的设计旨在提高速度、数据完整性和支持分布式、非线性工作流。

工作区域

  • 工作目录(Working Directory):这是你在本地计算机上实际工作的地方,即你打开的项目文件夹。你可以在这里编辑、删除、添加文件。

  • 暂存区(Staging Area,也称为 Index):这是一个中间区域,用于暂时保存你打算提交的更改。当你执行 git add 命令时,文件的更改被添加到暂存区。这是一个准备提交的区域。

  • 本地仓库(Local Repository):这是 Git 存储版本历史记录的地方,保存在 .git 目录中。提交(commit)被保存在本地仓库中,包括所有的提交记录和历史版本。

  • 远程仓库(Remote Repository):这是存储在远程服务器上的 Git 仓库,通常用于团队协作。你可以将本地更改推送到远程仓库,也可以从远程仓库拉取更新。

简化图示——

+--------------------+
|  Working Directory |
|                    |
|  [  文件 1 ]  [  文件 2 ]  [  文件 3 ] |
|                    |
+---------+----------+
          |
          | (git add)
          v
+---------+----------+
|    Staging Area    |
|                    |
|  [  文件 1 ]  [  文件 2 ] |
|                    |
+---------+----------+
          |
          | (git commit)
          v
+---------+----------+
|  Local Repository  |
|                    |
|  Commit 1   Commit 2   Commit 3   |
|                    |
+---------+----------+
          |
          | (git push)
          v
+---------+----------+
|   Remote Repository |
|                    |
|  Commit 1   Commit 2   Commit 3   |
|                    |
+--------------------+

基本操作

初始化仓库

git init

在当前目录初始化一个新的 Git 仓库。

克隆仓库

git clone <repository-url>

从远程仓库克隆一个完整的仓库到本地。

查看当前状态

git status

显示工作目录和暂存区的状态。

查看历史记录

git log

查看提交历史。

分支管理

查看所有分支

git branch

列出本地分支。

创建新分支

git branch <branch-name>

创建一个新的分支。

切换分支

git switch <branch-name>
git checkout <branch-name>

切换到指定的分支。

git checkout -b new-branch

创建并切换到新分支。

git checkout -

快速切换回上一个分支。

删除分支

git branch -d <branch-name>

删除指定的本地分支。

提交操作

添加文件到暂存区

git add <file-or-directory>

将文件或目录添加到暂存区。

提交更改

git commit -m "commit message"

提交已暂存的更改。

修改最后一次提交

git commit --amend

修改最后一次提交。

远程操作

查看远程仓库

git remote -v

列出所有远程仓库及其URL。

添加远程仓库

git remote add <remote-name> <repository-url>

添加一个新的远程仓库。

更新远程分支

git fetch
  • 更新远程追踪分支:git fetch 会从远程仓库中获取最新的提交,并将它们保存在你本地的远程追踪分支(通常是 origin/branch_name)中。它不会自动合并这些更改到你的当前分支。
  • 同步远程仓库的变动:git fetch 让你能够查看远程仓库的最新变动,而不会影响你当前的开发工作。你可以在合并、重置或变基之前,先检视这些变动。
git fetch origin

从名为 origin 的远程仓库中获取所有分支的更新,但不会改变你当前的分支。

git fetch origin branch_name

从 origin 仓库中拉取指定的 branch_name 分支的更新。

git fetch 是一种安全的方法来获取远程仓库的更新,它不会对你的当前工作造成干扰。通过定期使用 git fetch,你可以确保本地仓库与远程仓库同步,从而避免在合并或变基时遇到不必要的冲突。

拉取更新并合并

git pull origin <remote-branch-name>
git pull <remote-name> <branch-name>

从远程分支拉取最新更改并合并到当前分支。

git checkout -b <new-branch-name> origin/<remote-branch-name>

新建分支切到当前分支同时从远程分支拉取代码(一条龙)。

推送更改

git push <remote-name> <branch-name>

讲本地分支的更改推送到远程仓库。

撤销操作

撤销工作目录中的更改

git checkout -- <file>

撤销对文件的更改。

重置暂存区中的文件

git reset HEAD <file>

将文件从暂存区移除。

回退到指定提交

git reset --hard <commit-id>

将仓库重置到指定提交。

合并和冲突解决

合并分支

git merge <branch-name>

将指定分支合并到当前分支。

解决冲突并提交

打开有冲突的文件。你会看到类似以下格式的冲突标记:

<<<<<<< HEAD
当前分支的内容
=======
被合并分支的内容
>>>>>>> branch-name
  • <<<<<<< HEAD 和 >>>>>>> branch-name 之间的内容是当前分支与被合并分支的冲突部分。
  • 你需要手动编辑这些冲突文件,选择要保留的内容,删除冲突标记,然后保存文件。
git add <resolved-file> //将解冲突的文件添加到暂存区
git commit //提交合并结果

放弃本地更改并保留远程分支的修改

git checkout --theirs .
git add .
git commit -m "Resolved conflicts by keeping remote changes"

标签管理

在 Git 中,标签(Tag)是一种特殊的引用,通常用于给某个特定的提交打上标记。这种标记通常用于标识重要的时间点,如版本发布。标签本质上是一个指向某个提交的指针,类似于分支,但它是不可移动的,即一旦创建标签后,标签就始终指向那个特定的提交。

  • 版本发布:最常见的用途是在发布新版本时打标签。例如,你可以在代码达到某个稳定版本时创建一个标签,标记为 v1.0.0,以后可以很方便地找到这个版本的代码。
  • 标记里程碑:可以用标签来标记项目中的重要里程碑,如功能完成、修复重大问题等。

创建轻量标签

git tag <tag-name>

轻量标签仅仅是指向某个特定提交的引。

创建附注标签

git tag -a <tag-name> -m "Tag message"

附注标签是一个完整的对象,它除了指向某个提交外,还包含额外的元数据,如标签的作者、日期和一条消息。

将标签打到特定的提交上

git tag <tag-name> <commit-hash>

查看标签

git tag

推送标签到远程

git push <remote-name> <tag-name>

将标签推送到远程仓库。

配置管理

配置用户名和邮箱

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

查看配置

git config --list

查看和保存命令历史

查看命令历史

git reflog

查看所有的命令操作历史。

保存gdb输出到文件

gdb > output.txt

分支命名

分支命名约定涵盖了从功能开发到性能优化、文档更新、配置管理、实验性工作等各种场景。选择合适的命名约定有助于增强代码库的组织性、清晰度和可维护性。

feature/

  • 用途:用于开发新功能。
  • 示例:feature/user-authentication

bugfix/

  • 用途:用于修复特定问题或缺陷。
  • 示例:bugfix/fix-login-error

hotfix/

  • 用途:用于紧急修复生产环境中的问题。
  • 示例:hotfix/patch-security-vulnerability

release/

  • 用途:用于发布准备阶段的分支,通常用于修复在发布版本中发现的问题。
  • 示例:release/1.0.0

chore/

  • 用途:用于项目中非功能性任务的分支,比如更新文档或配置文件。
  • 示例:chore/update-dependencies

test/

  • 用途:用于测试相关的分支,如编写或执行测试用例。
  • 示例:test/add-unit-tests

refactor/

  • 用途:用于代码重构,提升代码质量而不改变其功能。
  • 示例:refactor/optimize-code-structure

docs/

  • 用途:用于文档更新或改进。
  • 示例:docs/update-readme

ci/

  • 用途:用于持续集成配置或脚本更新。
  • 示例:ci/improve-build-script

config/

  • 用途:用于配置文件的更新或修改。
  • 示例:config/update-database-config

experiment/

  • 用途:用于实验性功能或概念验证。
  • 示例:experiment/try-new-architecture

deps/(或 dependencies/)

  • 用途:用于更新或管理项目依赖。
  • 示例:deps/upgrade-node-version

wip/(Work In Progress)

  • 用途:表示正在进行中的工作,通常尚未完成。
  • 示例:wip/new-ui-design

revert/

  • 用途:用于撤销或回滚之前的更改。
  • 示例:revert/revert-bugfix-1234

security/

  • 用途:用于处理安全相关的修复或改进。
  • 示例:security/implement-oauth2

style/

  • 用途:用于代码风格和格式化调整。
  • 示例:style/format-codebase

perf/(Performance)

  • 用途:用于优化系统性能。
  • 示例:perf/improve-query-speed

fix/

  • 用途:与 bugfix/ 类似,但可能用于更小规模的修复。
  • 示例:fix/typo-in-docs

task/

  • 用途:用于处理特定任务的分支,通常是一个单独的开发任务。
  • 示例:task/setup-ci-pipeline

env/

  • 用途:用于环境配置的更改或管理。
  • 示例:env/update-docker-setup

infra/

  • 用途:用于基础设施相关的更改,如服务器配置、部署脚本等。
  • 示例:infra/add-kubernetes-support

build/

  • 用途:用于构建系统相关的更改,如更改构建脚本或构建配置。
  • 示例:build/update-build-settings

cleanup/

  • 用途:用于代码清理,删除不再使用的代码或资源。
  • 示例:cleanup/remove-old-files

prototype/

  • 用途:用于创建原型或试验性实现。
  • 示例:prototype/early-version-of-feature

merge/

  • 用途:用于处理复杂的合并操作,通常是将多个分支的更改合并在一起。
  • 示例:merge/feature-x-into-develop

temp/(Temporary)

  • 用途:用于临时性工作,通常不打算长期保留。
  • 示例:temp/debugging-issue

misc/

  • 用途:用于杂项或不属于其他类别的更改。
  • 示例:misc/update-scripts

patch/

  • 用途:用于小规模的修补,通常是对特定问题的轻微调整。
  • 示例:patch/fix-display-bug

archive/

  • 用途:用于存档旧分支,这些分支可能不再被主动开发,但仍保留。
  • 示例:archive/legacy-feature-x
posted @ 2024-08-09 17:13  岸南  阅读(42)  评论(0)    收藏  举报