活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

从零开始学习使用Git搭建自己的代码仓库详细教程涵盖基础概念安装配置仓库管理分支操作以及远程协作的完整知识体系

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-27 16:30:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. Git简介和基础概念

1.1 什么是Git

Git是一个分布式版本控制系统,由Linux的创始人Linus Torvalds于2005年创建。它能够高效地处理从小型到大型项目的所有内容。Git的核心特点包括:

• 分布式:每个开发者在本地都有完整的代码仓库副本,包含全部的历史记录。
• 高效性:大多数操作都在本地执行,速度极快。
• 数据完整性:Git使用SHA-1哈希算法确保数据的完整性。
• 支持非线性开发:Git支持成千上万个并行开发的分支。

1.2 版本控制系统

版本控制系统(Version Control System, VCS)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统分为三类:

• 本地版本控制系统:如RCS,在本地保存文件的所有修订版本。
• 集中化版本控制系统:如SVN,有一个单一的集中管理的服务器,保存所有文件的修订版本。
• 分布式版本控制系统:如Git,客户端不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。

1.3 Git的基本概念

仓库是Git用来保存项目的元数据和对象数据库的地方。从其他计算机克隆仓库时,实际上就是克隆这个仓库中的所有数据。

工作区是某个版本独立提取出来的内容。这些从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在Git仓库目录中。按照Git的术语叫做”索引”,不过一般说法还是叫”暂存区”。

提交是Git中的基本单位,每次提交都会记录项目在某个时间点的完整快照。每个提交都有一个唯一的ID(SHA-1哈希值)。

分支是Git中的强大功能,它允许你从开发主线上分离开来,在不影响主线的同时继续工作。默认情况下,Git会创建一个名为”master”的主分支。

远程仓库是托管在远程服务器上的仓库,可以与本地仓库进行交互。常见的远程仓库托管服务有GitHub、GitLab、Bitbucket等。

2. Git的安装与配置

2.1 在Windows上安装Git

1. 访问Git官方网站:https://git-scm.com/downloads
2. 下载Windows版本的Git安装程序。
3. 运行安装程序,按照提示进行安装。在安装过程中,可以保留默认设置,也可以根据需要进行自定义。
4. 安装完成后,打开命令提示符或PowerShell,输入以下命令验证安装:
  1. git --version
复制代码

如果显示Git的版本号,说明安装成功。

2.2 在macOS上安装Git

在macOS上安装Git有几种方法:
  1. xcode-select --install
复制代码

这将安装Xcode命令行工具,其中包含Git。
  1. brew install git
复制代码

1. 访问Git官方网站:https://git-scm.com/downloads
2. 下载macOS版本的Git安装程序。
3. 运行安装程序,按照提示进行安装。

安装完成后,打开终端,输入以下命令验证安装:
  1. git --version
复制代码

2.3 在Linux上安装Git
  1. sudo apt update
  2. sudo apt install git
复制代码
  1. sudo dnf install git  # Fedora
  2. sudo yum install git  # CentOS/RHEL
复制代码
  1. sudo pacman -S git
复制代码

安装完成后,打开终端,输入以下命令验证安装:
  1. git --version
复制代码

2.4 Git的基本配置

安装Git后,需要进行一些基本配置,以便在提交代码时能够正确标识你的身份。
  1. git config --global user.name "Your Name"
  2. git config --global user.email "your.email@example.com"
复制代码

这里的--global参数表示全局配置,将对当前用户的所有仓库生效。如果只想对当前仓库进行配置,可以去掉--global参数。
  1. git config --global core.editor "vim"  # 使用Vim作为默认编辑器
  2. git config --global core.editor "nano"  # 使用Nano作为默认编辑器
  3. # 在Windows上,可以使用Notepad++
  4. git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
复制代码

Git 2.28版本以上可以配置默认的分支名称:
  1. git config --global init.defaultBranch main
复制代码

为了避免每次推送时都输入用户名和密码,可以配置Git存储凭证:
  1. git config --global credential.helper store
复制代码

可以使用以下命令查看当前配置:
  1. git config --list  # 查看所有配置
  2. git config user.name  # 查看用户名
  3. git config user.email  # 查看邮箱
复制代码

3. Git仓库的创建与管理

3.1 创建新的Git仓库

要创建一个新的Git仓库,首先创建一个项目目录,然后在该目录中初始化Git仓库:
  1. mkdir my-project
  2. cd my-project
  3. git init
复制代码

执行git init后,Git会在当前目录创建一个名为.git的子目录,这个子目录包含了Git仓库的所有必要文件。

如果要获取一个已存在的Git仓库,可以使用git clone命令:
  1. git clone https://github.com/username/repository.git
复制代码

这会在当前目录下创建一个名为repository的目录,并初始化一个.git文件夹,从中拉取所有数据。

如果想要自定义本地仓库的名称,可以指定目录名:
  1. git clone https://github.com/username/repository.git my-repo
复制代码

3.2 仓库状态查看

使用git status命令可以查看仓库的当前状态:
  1. git status
复制代码

这个命令会显示工作目录和暂存区的状态,包括哪些文件被修改、哪些文件已暂存、哪些文件未被跟踪等。

使用git log命令可以查看提交历史:
  1. git log
复制代码

这个命令会显示每个提交的SHA-1校验和、作者名字、电子邮件、提交时间以及提交说明。

如果只想查看简洁的提交历史,可以使用--oneline选项:
  1. git log --oneline
复制代码

如果想要查看分支的合并情况,可以使用--graph选项:
  1. git log --oneline --graph --all
复制代码

3.3 忽略文件

有些文件不需要纳入Git的管理,比如编译生成的文件、依赖包、敏感信息等。这时可以使用.gitignore文件来指定Git应该忽略的文件。

在项目根目录下创建一个名为.gitignore的文件:
  1. touch .gitignore
复制代码

.gitignore文件的每行指定一个忽略模式,支持以下规则:

• 空行或以#开头的行会被忽略。
• 可以使用标准的glob模式匹配。
• 以/结尾表示目录。
• 以!开头表示否定模式。
  1. # 忽略所有.a文件
  2. *.a
  3. # 但不忽略lib.a,尽管前面忽略了*.a
  4. !lib.a
  5. # 只忽略当前目录下的TODO文件,不忽略subdir/TODO
  6. /TODO
  7. # 忽略build/目录下的所有文件
  8. build/
  9. # 忽略doc目录下的所有.txt文件
  10. doc/*.txt
  11. # 忽略doc目录及其所有子目录下的.pdf文件
  12. doc/**/*.pdf
复制代码

GitHub提供了一个丰富的.gitignore模板集合,可以根据不同的编程语言和框架选择合适的模板:https://github.com/github/gitignore

例如,Python项目的.gitignore文件可能包含:
  1. # Byte-compiled / optimized / DLL files
  2. __pycache__/
  3. *.py[cod]
  4. *$py.class
  5. # C extensions
  6. *.so
  7. # Distribution / packaging
  8. .Python
  9. build/
  10. develop-eggs/
  11. dist/
  12. downloads/
  13. eggs/
  14. .eggs/
  15. lib/
  16. lib64/
  17. parts/
  18. sdist/
  19. var/
  20. wheels/
  21. *.egg-info/
  22. .installed.cfg
  23. *.egg
  24. MANIFEST
  25. # PyInstaller
  26. *.manifest
  27. *.spec
  28. # Installer logs
  29. pip-log.txt
  30. pip-delete-this-directory.txt
  31. # Unit test / coverage reports
  32. htmlcov/
  33. .tox/
  34. .nox/
  35. .coverage
  36. .coverage.*
  37. .cache
  38. nosetests.xml
  39. coverage.xml
  40. *.cover
  41. .hypothesis/
  42. .pytest_cache/
  43. # Translations
  44. *.mo
  45. *.pot
  46. # Django stuff:
  47. *.log
  48. local_settings.py
  49. db.sqlite3
  50. # Flask stuff:
  51. instance/
  52. .webassets-cache
  53. # Scrapy stuff:
  54. .scrapy
  55. # Sphinx documentation
  56. docs/_build/
  57. # PyBuilder
  58. target/
  59. # Jupyter Notebook
  60. .ipynb_checkpoints
  61. # IPython
  62. profile_default/
  63. ipython_config.py
  64. # pyenv
  65. .python-version
  66. # celery beat schedule file
  67. celerybeat-schedule
  68. # SageMath parsed files
  69. *.sage.py
  70. # Environments
  71. .env
  72. .venv
  73. env/
  74. venv/
  75. ENV/
  76. env.bak/
  77. venv.bak/
  78. # Spyder project settings
  79. .spyderproject
  80. .spyproject
  81. # Rope project settings
  82. .ropeproject
  83. # mkdocs documentation
  84. /site
  85. # mypy
  86. .mypy_cache/
  87. .dmypy.json
  88. dmypy.json
复制代码

4. Git基础操作

4.1 文件生命周期

在Git中,文件有四种状态:

1. 未跟踪(Untracked):新创建的文件,未被Git管理。
2. 已修改(Modified):已被Git管理,但被修改了。
3. 已暂存(Staged):已修改的文件被放入暂存区,准备提交。
4. 已提交(Committed):文件已安全地保存在本地数据库中。

文件的状态转换如下:
  1. 未跟踪 -> [git add] -> 已暂存 -> [git commit] -> 已提交
  2.                          ^
  3.                          |
  4.                      [git add]
  5.                          |
  6. 已提交 -> [修改文件] -> 已修改 -> [git add] -> 已暂存
复制代码

4.2 跟踪新文件

要跟踪一个新文件,使用git add命令:
  1. git add filename
复制代码

或者跟踪所有文件:
  1. git add .
复制代码

4.3 暂存已修改的文件

如果已经跟踪的文件被修改了,需要再次使用git add命令将其暂存:
  1. git add filename
复制代码

4.4 提交更改

使用git commit命令提交暂存区的更改:
  1. git commit -m "Commit message"
复制代码

这里的-m选项用于指定提交说明。如果不使用-m选项,Git会打开默认的文本编辑器让你输入提交说明。

4.5 跳过暂存区

有时候,我们想要直接提交已跟踪的文件,而不先将它们放入暂存区。可以使用git commit的-a选项:
  1. git commit -a -m "Commit message"
复制代码

这相当于先运行git add把所有已跟踪的文件暂存,然后运行git commit。

4.6 移除文件

要从Git中移除文件,需要从已跟踪文件清单中移除,然后提交。可以使用git rm命令:
  1. git rm filename
复制代码

这会删除文件,并将删除操作暂存。如果只是想从Git仓库中移除文件,但保留在磁盘上,可以使用--cached选项:
  1. git rm --cached filename
复制代码

4.7 移动文件

要在Git中移动文件,可以使用git mv命令:
  1. git mv file_from file_to
复制代码

这相当于以下三条命令:
  1. mv file_from file_to
  2. git rm file_from
  3. git add file_to
复制代码

4.8 查看差异

使用git diff命令可以查看文件之间的差异:
  1. git diff
复制代码
  1. git diff --staged
  2. # 或者
  3. git diff --cached
复制代码
  1. git diff HEAD
复制代码
  1. git diff commit1 commit2
复制代码

4.9 查看文件内容
  1. git show HEAD:filename
复制代码
  1. git show commit:filename
复制代码

4.10 撤销操作

如果误将文件添加到暂存区,可以使用git restore --staged命令撤销:
  1. git restore --staged filename
复制代码

如果想要撤销工作区中对文件的修改,可以使用git restore命令:
  1. git restore filename
复制代码

注意:这会撤销工作区中的所有修改,恢复到最新提交的状态。

如果提交后发现漏掉了某些文件或者提交说明有误,可以使用git commit --amend命令:
  1. git commit --amend
复制代码

这会打开文本编辑器,允许你修改提交说明。如果只是想修改提交说明,而不修改提交内容,可以直接使用:
  1. git commit --amend -m "New commit message"
复制代码

如果想要添加漏掉的文件,可以先暂存文件,然后运行:
  1. git add forgotten_file
  2. git commit --amend
复制代码

如果想要取消某个提交,可以使用git revert或git reset命令。

git revert会创建一个新的提交,用于撤销指定的提交:
  1. git revert commit
复制代码

git reset用于将当前分支的HEAD指向指定的提交,有三种模式:

• --soft:只移动HEAD,不修改暂存区和工作区。
• --mixed(默认):移动HEAD,并重置暂存区,但不修改工作区。
• --hard:移动HEAD,并重置暂存区和工作区。
  1. git reset --soft HEAD~1  # 撤销最后一次提交,但保留更改在暂存区
  2. git reset --mixed HEAD~1  # 撤销最后一次提交,并取消暂存,但保留更改在工作区
  3. git reset --hard HEAD~1  # 撤销最后一次提交,并删除所有更改
复制代码

4.11 清理工作区

使用git clean命令可以清理工作区中未被跟踪的文件:
  1. git clean -n  # 查看将要删除的文件
  2. git clean -f  # 删除未被跟踪的文件
  3. git clean -df  # 删除未被跟踪的文件和目录
  4. git clean -xf  # 删除未被跟踪的文件,包括通常被忽略的文件
复制代码

5. Git分支操作

5.1 分支简介

分支是Git中的强大功能,它允许你从开发主线上分离开来,在不影响主线的同时继续工作。Git的分支模型是其杀手级特性之一,使得Git从众多版本控制系统中脱颖而出。

5.2 创建分支

使用git branch命令可以创建新分支:
  1. git branch branchname
复制代码

这会在当前提交上创建一个名为branchname的新分支,但不会切换到该分支。

5.3 切换分支

使用git checkout命令可以切换到指定分支:
  1. git checkout branchname
复制代码

5.4 创建并切换分支

使用git checkout -b命令可以创建并切换到新分支:
  1. git checkout -b branchname
复制代码

这相当于以下两条命令:
  1. git branch branchname
  2. git checkout branchname
复制代码

5.5 查看分支

使用git branch命令可以查看所有分支:
  1. git branch  # 查看本地分支
  2. git branch -r  # 查看远程分支
  3. git branch -a  # 查看所有分支(包括本地和远程)
复制代码

当前分支前面会有一个*标记。

5.6 删除分支

使用git branch -d命令可以删除已合并的分支:
  1. git branch -d branchname
复制代码

如果要强制删除未合并的分支,可以使用-D选项:
  1. git branch -D branchname
复制代码

5.7 合并分支

使用git merge命令可以将指定分支合并到当前分支:
  1. git checkout main  # 切换到主分支
  2. git merge branchname  # 将branchname分支合并到main分支
复制代码

如果要合并的分支是当前分支的直接上游,Git会执行快进合并,只需将当前分支指向指定的提交。

如果要合并的分支和当前分支有不同的提交,Git会执行三方合并,创建一个新的合并提交,包含两个分支的所有更改。

5.8 解决合并冲突

当两个分支修改了同一个文件的同一部分时,合并会产生冲突。这时需要手动解决冲突:

1. Git会标记出冲突的部分,打开冲突的文件,会看到类似这样的标记:
  1. <<<<<<< HEAD
  2. 这是当前分支的内容
  3. =======
  4. 这是要合并分支的内容
  5. >>>>>>> branchname
复制代码

1. 编辑文件,保留想要的内容,删除冲突标记。
2. 使用git add命令标记冲突已解决。
3. 使用git commit命令完成合并。

5.9 变基(Rebase)

变基是另一种整合分支的方法,它可以将一系列提交按照原有次序依次应用到另一分支上。

使用git rebase命令可以将当前分支的变基到指定分支:
  1. git checkout branchname  # 切换到要变基的分支
  2. git rebase main  # 将branchname变基到main分支
复制代码

• 合并(Merge):保留完整的分支历史,但可能会使历史记录变得复杂。
• 变基(Rebase):创建线性的历史记录,但会改变提交的历史。

使用git rebase -i命令可以进行交互式变基,允许你重新排序、编辑、合并或删除提交:
  1. git rebase -i HEAD~3  # 对最近3个提交进行交互式变基
复制代码

这会打开一个文本编辑器,显示类似这样的内容:
  1. pick f7f3f6d commit message 1
  2. pick 310154e commit message 2
  3. pick a5f4a0d commit message 3
  4. # Rebase 710f0f8..a5f4a0d onto 710f0f8 (3 commands)
  5. #
  6. # Commands:
  7. # p, pick <commit> = use commit
  8. # r, reword <commit> = use commit, but edit the commit message
  9. # e, edit <commit> = use commit, but stop for amending
  10. # s, squash <commit> = use commit, but meld into previous commit
  11. # f, fixup <commit> = like "squash", but discard this commit's log message
  12. # x, exec <command> = run command (the rest of the line) using shell
  13. # b, break = stop here (continue rebase later with 'git rebase --continue')
  14. # d, drop <commit> = remove commit
  15. # l, label <label> = label current HEAD with a name
  16. # t, reset <label> = reset HEAD to a label
  17. # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
  18. # .       create a merge commit using the original merge commit's
  19. # .       message (or the oneline, if no original merge commit was
  20. # .       specified). Use -c <commit> to re-use the original merge
  21. # .       commit's author and message.
  22. #
  23. # These lines can be re-ordered; they are executed from top to bottom.
复制代码

可以根据需要修改这些命令,然后保存并关闭编辑器,Git会按照指示执行变基。

5.10 储藏(Stash)

有时候,你在当前分支的工作进行到一半,但需要切换到其他分支处理紧急任务。这时可以使用git stash命令将当前工作储藏起来:
  1. git stash  # 储藏当前工作
  2. git stash list  # 查看所有储藏
  3. git stash apply  # 应用最新的储藏,但不删除
  4. git stash pop  # 应用最新的储藏,并删除
  5. git stash drop  # 删除最新的储藏
  6. git stash clear  # 删除所有储藏
复制代码

6. 远程仓库与协作

6.1 远程仓库简介

远程仓库是托管在远程服务器上的仓库,可以与本地仓库进行交互。常见的远程仓库托管服务有GitHub、GitLab、Bitbucket等。

6.2 查看远程仓库

使用git remote命令可以查看远程仓库:
  1. git remote  # 列出所有远程仓库的简称
  2. git remote -v  # 列出所有远程仓库的简称和URL
  3. git remote show origin  # 显示远程仓库origin的详细信息
复制代码

6.3 添加远程仓库

使用git remote add命令可以添加远程仓库:
  1. git remote add origin https://github.com/username/repository.git
复制代码

这里的origin是远程仓库的默认简称,可以自定义。

6.4 从远程仓库获取数据

使用git fetch命令可以从远程仓库获取数据:
  1. git fetch origin  # 从远程仓库origin获取所有数据
  2. git fetch origin branchname  # 从远程仓库origin获取指定分支的数据
复制代码

注意:git fetch只会下载数据,不会自动合并或修改当前工作。

6.5 从远程仓库拉取数据

使用git pull命令可以从远程仓库拉取数据并合并到当前分支:
  1. git pull origin main  # 从远程仓库origin的main分支拉取数据并合并到当前分支
复制代码

git pull实际上是git fetch和git merge的组合。

6.6 推送数据到远程仓库

使用git push命令可以将本地数据推送到远程仓库:
  1. git push origin main  # 将本地main分支推送到远程仓库origin
复制代码

如果是第一次推送,可以使用-u选项设置上游分支:
  1. git push -u origin main  # 设置上游分支并推送
复制代码

之后可以直接使用git push推送。

6.7 跟踪分支

跟踪分支是与远程分支有直接关系的本地分支。使用git checkout命令可以创建并切换到跟踪分支:
  1. git checkout -b localbranch origin/remotebranch  # 创建并切换到跟踪分支
  2. git checkout --track origin/remotebranch  # 创建并切换到同名跟踪分支
复制代码

6.8 删除远程分支

使用git push命令可以删除远程分支:
  1. git push origin --delete branchname  # 删除远程仓库origin的branchname分支
复制代码

6.9 标签管理

标签是用于标记特定提交的引用,通常用于标记版本发布。
  1. git tag  # 列出所有标签
  2. git tag -l "v1.8.5*"  # 列出匹配模式的标签
复制代码

Git支持两种标签:轻量标签(lightweight)和附注标签(annotated)。
  1. git tag v1.0  # 创建轻量标签
复制代码
  1. git tag -a v1.0 -m "Version 1.0"  # 创建附注标签
复制代码

如果忘记给某个提交打标签,可以后期补打:
  1. git tag -a v1.0 commit_hash -m "Version 1.0"  # 给指定提交打标签
复制代码

默认情况下,git push不会推送标签到远程仓库。要推送标签,需要明确指定:
  1. git push origin v1.0  # 推送指定标签
  2. git push origin --tags  # 推送所有标签
复制代码
  1. git tag -d v1.0  # 删除本地标签
  2. git push origin :refs/tags/v1.0  # 删除远程标签
  3. # 或者
  4. git push origin --delete v1.0  # 删除远程标签
复制代码

6.10 协作工作流

所有开发者都从中央仓库获取代码,修改后推送到中央仓库。这种工作流适合小型团队或小型项目。

每个功能都在独立的分支上开发,完成后合并到主分支。这种工作流适合中型团队或中型项目。

GitFlow是一种更复杂的工作流,定义了严格的分支模型,包括主分支、开发分支、功能分支、发布分支和热修复分支。这种工作流适合大型团队或大型项目。

每个开发者都有自己独立的仓库,通过fork和pull request进行协作。这种工作流适合开源项目或分布式团队。

7. Git高级技巧与最佳实践

7.1 Git别名

Git允许你为常用的命令创建别名,以提高效率。
  1. git config --global alias.co checkout  # 为checkout创建别名co
  2. git config --global alias.br branch  # 为branch创建别名br
  3. git config --global alias.ci commit  # 为commit创建别名ci
  4. git config --global alias.st status  # 为status创建别名st
  5. git config --global alias.unstage 'reset HEAD --'  # 创建unstage别名
  6. git config --global alias.last 'log -1 HEAD'  # 创建last别名,查看最后一次提交
  7. git config --global alias.visual '!gitk'  # 创建visual别名,运行gitk
复制代码

创建别名后,可以像使用原命令一样使用别名:
  1. git co main  # 相当于git checkout main
  2. git br  # 相当于git branch
  3. git ci -m "Commit message"  # 相当于git commit -m "Commit message"
复制代码

7.2 Git钩子

Git钩子是在特定事件发生时自动执行的脚本,可以用于自定义Git的行为。

Git钩子分为客户端钩子和服务器端钩子:

• pre-commit:在提交前运行,用于检查提交内容。
• prepare-commit-msg:在提交信息编辑器启动前运行,用于生成默认提交信息。
• commit-msg:在提交信息编辑完成后运行,用于验证提交信息。
• post-commit:在提交完成后运行,用于通知。
• pre-rebase:在变基前运行,用于阻止变基。
• post-checkout:在检出后运行,用于设置工作目录。
• post-merge:在合并后运行,用于设置工作目录。
• pre-push:在推送前运行,用于检查推送内容。

• pre-receive:在接收推送时运行,用于检查推送内容。
• update:在更新分支时运行,用于检查分支更新。
• post-receive:在接收推送后运行,用于通知。

钩子脚本位于.git/hooks目录下,以.sample结尾的是示例钩子。要安装钩子,只需将示例钩子重命名并赋予执行权限:
  1. cd .git/hooks
  2. mv pre-commit.sample pre-commit
  3. chmod +x pre-commit
复制代码
  1. #!/bin/sh
  2. # 检查代码风格
  3. if ! command -v clang-format &> /dev/null; then
  4.     echo "clang-format not installed, skipping code style check"
  5.     exit 0
  6. fi
  7. # 获取暂存的文件
  8. files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(cpp|h)$')
  9. if [ -z "$files" ]; then
  10.     echo "No C++ files to check"
  11.     exit 0
  12. fi
  13. # 检查代码风格
  14. for file in $files; do
  15.     if ! clang-format --dry-run --Werror "$file"; then
  16.         echo "Code style issues found in $file"
  17.         echo "Please run 'clang-format -i $file' to fix"
  18.         exit 1
  19.     fi
  20. done
  21. exit 0
复制代码
  1. #!/bin/sh
  2. # 检查提交信息格式
  3. if ! grep -qE "^(feat|fix|docs|style|refactor|test|chore)(\(.+\))?: .+" "$1"; then
  4.     echo "Commit message must follow Conventional Commits format:"
  5.     echo "<type>[<scope>]: <description>"
  6.     echo ""
  7.     echo "Allowed types: feat, fix, docs, style, refactor, test, chore"
  8.     exit 1
  9. fi
  10. exit 0
复制代码

7.3 Git子模块

Git子模块允许你将一个Git仓库作为另一个Git仓库的子目录,保持两个仓库的独立性。
  1. git submodule add https://github.com/username/repository.git path/to/submodule
复制代码

这会在当前仓库中添加一个子模块,并创建一个.gitmodules文件,记录子模块的信息。
  1. git clone https://github.com/username/repository.git
  2. cd repository
  3. git submodule init  # 初始化子模块配置
  4. git submodule update  # 更新子模块
复制代码

或者使用递归克隆:
  1. git clone --recursive https://github.com/username/repository.git
复制代码
  1. git submodule update --remote  # 更新子模块到最新提交
  2. git submodule update --remote path/to/submodule  # 更新指定子模块
复制代码
  1. cd path/to/submodule
  2. git checkout main  # 切换到主分支
  3. git pull  # 拉取最新更改
  4. # 进行修改
  5. git commit -am "Update submodule"  # 提交更改
  6. cd ..
  7. git add path/to/submodule  # 暂存子模块的更改
  8. git commit -m "Update submodule"  # 提交子模块的更改
复制代码

7.4 Git LFS

Git LFS(Large File Storage)是Git的一个扩展,用于管理大文件,如音频、视频、数据集等。
  1. git lfs install
复制代码
  1. git lfs track "*.psd"  # 跟踪所有.psd文件
  2. git lfs track "*.zip"  # 跟踪所有.zip文件
  3. git lfs track "data/*.csv"  # 跟踪data目录下的所有.csv文件
复制代码

这会创建或更新.gitattributes文件,指定哪些文件应该由Git LFS管理。

使用Git LFS后,可以像使用普通Git命令一样使用Git:
  1. git add file.psd  # 添加大文件
  2. git commit -m "Add design file"  # 提交更改
  3. git push origin main  # 推送到远程仓库
复制代码

Git LFS会自动处理大文件的存储和检索。

7.5 Git最佳实践

• 每个提交应该只做一件事。
• 提交信息应该清晰明了,说明做了什么和为什么做。
• 遵循提交信息格式,如Conventional Commits:feat: 新功能fix: 修复bugdocs: 文档更改style: 代码格式更改refactor: 代码重构test: 测试相关chore: 构建过程或辅助工具的变动
• feat: 新功能
• fix: 修复bug
• docs: 文档更改
• style: 代码格式更改
• refactor: 代码重构
• test: 测试相关
• chore: 构建过程或辅助工具的变动

• feat: 新功能
• fix: 修复bug
• docs: 文档更改
• style: 代码格式更改
• refactor: 代码重构
• test: 测试相关
• chore: 构建过程或辅助工具的变动

• 主分支(如main或master)应该始终保持稳定和可发布状态。
• 使用功能分支进行开发,完成后合并到主分支。
• 使用发布分支进行发布准备,完成后合并到主分支和开发分支。
• 使用热修复分支修复紧急问题,完成后合并到主分支和开发分支。

• 使用Pull Request或Merge Request进行代码审查。
• 确保代码符合项目规范和标准。
• 确保代码经过充分测试。
• 确保代码文档完整。

• 不要在代码中包含敏感信息,如密码、API密钥等。
• 使用.gitignore文件排除敏感文件。
• 使用Git LFS管理大文件。
• 定期备份代码仓库。

8. 常见问题与解决方案

8.1 “fatal: not a git repository”错误

问题:运行Git命令时出现”fatal: not a git repository”错误。

原因:当前目录不是一个Git仓库。

解决方案:

1. 确保你在正确的目录中:
  1. pwd  # 查看当前目录
  2. ls -la  # 查看当前目录的文件,包括隐藏文件
复制代码

1. 如果应该是一个Git仓库,但.git目录丢失了,可以尝试恢复:
  1. git init  # 重新初始化Git仓库
  2. git add .  # 添加所有文件
  3. git commit -m "Recover repository"  # 提交更改
复制代码

1. 如果需要进入现有的Git仓库:
  1. cd path/to/repository  # 切换到Git仓库目录
复制代码

8.2 “error: failed to push some refs to”错误

问题:推送代码时出现”error: failed to push some refs to”错误。

原因:远程仓库有本地没有的提交。

解决方案:

1. 先拉取远程仓库的更改:
  1. git pull origin main
复制代码

1. 如果有冲突,解决冲突后再次提交:
  1. git add .
  2. git commit -m "Resolve conflicts"
复制代码

1. 再次推送:
  1. git push origin main
复制代码

8.3 “fatal: refusing to merge unrelated histories”错误

问题:合并时出现”fatal: refusing to merge unrelated histories”错误。

原因:两个仓库没有共同的祖先提交。

解决方案:

1. 使用--allow-unrelated-histories选项允许合并不相关的历史:
  1. git pull origin main --allow-unrelated-histories
复制代码

1. 如果有冲突,解决冲突后再次提交:
  1. git add .
  2. git commit -m "Merge unrelated histories"
复制代码

8.4 “Your branch is ahead of ‘origin/main’ by X commits”警告

问题:Git状态显示”Your branch is ahead of ‘origin/main’ by X commits”。

原因:本地有未推送到远程仓库的提交。

解决方案:

1. 推送本地提交到远程仓库:
  1. git push origin main
复制代码

1. 如果不想推送这些提交,可以重置本地分支到远程分支:
  1. git reset --hard origin/main
复制代码

8.5 “Please enter a commit message to explain why this merge is necessary”提示

问题:合并时出现”Please enter a commit message to explain why this merge is necessary”提示。

原因:Git要求提供合并提交的信息。

解决方案:

1. 输入合并提交的信息,然后保存并关闭编辑器。
2. 如果不想输入信息,可以使用--no-edit选项:
  1. git merge branchname --no-edit
复制代码

8.6 “CONFLICT (content): Merge conflict in file”错误

问题:合并时出现”CONFLICT (content): Merge conflict in file”错误。

原因:两个分支修改了同一个文件的同一部分,导致冲突。

解决方案:

1. 打开冲突的文件,解决冲突:
  1. <<<<<<< HEAD
  2. 这是当前分支的内容
  3. =======
  4. 这是要合并分支的内容
  5. >>>>>>> branchname
复制代码

1. 编辑文件,保留想要的内容,删除冲突标记。
2. 标记冲突已解决:
  1. git add file
复制代码

1. 完成合并:
  1. git commit
复制代码

8.7 恢复误删的文件

问题:误删了文件,想要恢复。

解决方案:

1. 如果文件未被跟踪,可以尝试从文件系统恢复。
2. 如果文件已被跟踪,可以使用git checkout恢复:
  1. git checkout HEAD -- file  # 从最新提交恢复文件
  2. git checkout commit_hash -- file  # 从指定提交恢复文件
复制代码

1. 如果文件已被删除并提交,可以使用git revert撤销删除:
  1. git revert commit_hash  # 撤销删除文件的提交
复制代码

8.8 恢复误删的分支

问题:误删了分支,想要恢复。

解决方案:

1. 如果知道分支的最后一次提交,可以使用git branch重新创建分支:
  1. git branch branchname commit_hash  # 从指定提交创建分支
复制代码

1. 如果不知道分支的最后一次提交,可以使用git reflog查看分支历史:
  1. git reflog  # 查看操作历史
  2. git branch branchname commit_hash  # 从历史中的提交创建分支
复制代码

8.9 清理大文件历史

问题:仓库中不小心提交了大文件,导致仓库体积过大。

解决方案:

1. 使用git filter-branch清理历史:
  1. git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path/to/large/file' --prune-empty --tag-name-filter cat -- --all
复制代码

1. 使用git gc清理仓库:
  1. git gc --prune=now
复制代码

1. 强制推送更改到远程仓库:
  1. git push origin --force --all
  2. git push origin --force --tags
复制代码

8.10 仓库迁移

问题:需要将仓库从一个服务器迁移到另一个服务器。

解决方案:

1. 克隆原始仓库:
  1. git clone --bare https://old-server.com/username/repository.git
复制代码

1. 进入仓库目录:
  1. cd repository.git
复制代码

1. 设置新的远程仓库:
  1. git remote set-url origin https://new-server.com/username/repository.git
复制代码

1. 推送到新的远程仓库:
  1. git push --mirror origin
复制代码

1. 通知其他开发者更新远程仓库URL:
  1. git remote set-url origin https://new-server.com/username/repository.git
复制代码

总结

Git是一个强大的分布式版本控制系统,它提供了丰富的功能来管理代码和协作开发。本文从Git的基础概念开始,详细介绍了Git的安装与配置、仓库的创建与管理、基础操作、分支操作、远程仓库与协作,以及高级技巧与最佳实践,最后还提供了常见问题的解决方案。

通过学习本文,你应该能够:

• 理解Git的基本概念和工作原理
• 安装和配置Git
• 创建和管理Git仓库
• 使用Git进行基本的版本控制操作
• 使用Git分支进行并行开发
• 使用远程仓库进行协作
• 应用Git的高级技巧和最佳实践
• 解决常见的Git问题

Git是一个复杂的工具,但通过不断实践和学习,你会逐渐掌握它的精髓,提高开发效率和协作能力。祝你在Git的学习和使用过程中取得成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则