获取 Git 仓库 (Getting a Git Repository)

获取 Git 仓库通常有两种方式:

初始化现有目录

如果你想对一个尚未进行版本控制的本地目录开始使用 Git,首先进入该目录,然后运行 git init 命令。
执行此命令会在当前目录下创建一个名为 .git 的子目录,其中包含所有必要的仓库文件(一个 Git 仓库骨架)。此时,项目中的文件尚未被跟踪。
如果想开始版本控制现有文件,需要使用 git add 命令指定要跟踪的文件,然后进行首次提交:
示例:
此时,你就拥有了一个带有被跟踪文件和首次提交的 Git 仓库。

克隆现有仓库

如果你想获取一个现有 Git 仓库的副本(例如,你想贡献的项目),你需要使用 git clone 命令。
Git 的“克隆”(clone)与某些版本控制系统(如 Subversion)的“检出”(checkout)不同。克隆操作会接收到服务器上几乎所有数据的完整副本,包括项目历史上每个文件的所有版本。
你可以通过添加额外参数来指定克隆到的本地目录名称:
Git 支持多种传输协议,包括 https://git:// 或使用 SSH 协议的 user@server:path/to/repo.git 格式。

记录对仓库的修改 (Recording Changes to the Repository)

理解 Git 的三态三区是流畅使用 Git 的关键。

Git 的三态 (The Three States)

文件在 Git 中可以处于三种主要状态:
  1. Modified (已修改): 你修改了文件,但尚未将其提交到数据库。
  1. Staged (已暂存): 你已将文件的当前版本标记为包含在你的下一次提交快照中。
  1. Committed (已提交): 数据已安全地存储在你的本地数据库中。
notion image

Git 的三区 (The Three Sections)

Git 项目主要分为三个部分:
  1. 工作区 (Working Tree): 项目的一个单次检出版本,文件被放置在磁盘上供你使用或修改。
  1. 暂存区 (Staging Area) / 索引 (Index): 一个文件,通常位于 Git 目录中,存储着关于下一次提交将包含哪些内容的信息。
  1. Git 目录 (.git directory): 存储项目元数据和对象数据库的地方。这是 Git 最重要的部分,克隆仓库时复制的就是它。

基本的 Git 工作流程如下:

  1. 你在工作区修改文件。
  1. 你选择性地暂存你希望包含在下一次提交中的更改,将这些更改添加到暂存区。
  1. 你执行提交,这会将暂存区中的文件作为快照永久存储到 Git 目录中。

核心命令与语法

  • 查看文件状态: git status 该命令会显示你的分支状态、哪些文件是未跟踪 (Untracked),哪些是已修改 (Modified) 但未暂存,哪些是已暂存 (Changes to be committed)。
  • 跟踪新文件/暂存修改: git add <file>...
    • 用于开始跟踪新文件。
    • 用于将修改后的文件或目录(递归添加所有文件)添加到暂存区。
    • 注意: Git 暂存文件时,是精确地记录运行 git add 时文件所处的状态。如果你在运行 git add 之后修改了文件,必须再次运行 git add 来暂存最新版本。
  • 简洁状态输出: git status -sgit status --short
  • 忽略文件: .gitignore 创建一个名为 .gitignore 的文件,在其中列出模式以匹配你希望 Git 忽略的文件(例如,日志文件或构建系统自动生成的文件)。
  • 查看更改: git diff
    • 查看未暂存的更改: git diff
      • 比较工作区与暂存区之间的差异。
    • 查看已暂存的更改: git diff --stagedgit diff --cached
      • 比较暂存区与上次提交之间的差异。
  • 提交更改: git commit
    • 默认会打开配置的编辑器,让你输入提交信息。
    • 内联提交信息: git commit -m "提交信息"
    • 跳过暂存区: git commit -a -m "信息"
      • 自动暂存所有已跟踪(已存在于 Git 历史中)的修改文件,然后执行提交。但新文件仍需先使用 git add(此信息未直接在 git commit -a 的描述中,但根据上下文可推断)。
  • 移除文件: git rm <file> 从暂存区和工作目录中移除文件。
  • 移动/重命名文件: git mv file_from file_to 这是一个便捷功能,相当于运行 mvgit rm <old_file>git add <new_file> 三个命令。Git 可以隐式地识别文件重命名,因此使用 git mv 或手动操作后再 git add/git rm 效果相同。

查看提交历史 (Viewing the Commit History)

查看项目历史最基本和强大的工具是 git log 命令。
  • 基本输出: 默认按时间倒序(最新在前)列出提交,显示 SHA-1 校验和、作者、日期和提交信息。
  • 常用选项与语法:
选项
描述
引用
-p--patch
显示每次提交引入的差异(补丁输出)
- (如 -2)
仅显示最近 $n$ 次提交
--stat
显示每次提交的统计信息(修改的文件、增删行数)
--pretty=oneline
将每次提交显示在一行,便于查看大量提交
--pretty=format:"..."
允许使用自定义格式输出 (例如 %h 提交哈希缩写, %an 作者姓名, %s 摘要)
--graph
添加 ASCII 图表,显示分支和合并历史。
--oneline
oneline + abbrev-commit 的缩写形式。
-- <path>
限制日志输出到对指定文件或目录有更改的提交。
注: Author (作者) 是最初编写工作的人,而 Committer (提交者) 是最后应用工作的人。

撤销操作 (Undoing Things)

本节介绍如何处理未暂存和已暂存的更改:

撤销暂存区文件 (Unstaging)

如果你暂存了一个文件,但决定在下一次提交中不包含它,可以使用以下命令:

语法 (推荐现代 Git 版本):

此操作将文件从暂存状态移回“已修改”状态。

旧版本语法 (或替代方法):

此命令会将文件从暂存区移出,但不会触碰工作区的文件内容。

撤销对文件的修改 (Unmodifying)

如果你对文件进行了修改,但希望彻底丢弃这些本地更改,使其恢复到上次提交(或上次检出)时的状态,可以使用以下命令:

语法 (推荐现代 Git 版本):

警告: 这是一个危险的命令。它会用上次暂存或提交的版本替换该文件,你对该文件的所有本地未保存更改都会丢失。

旧版本语法 (或替代方法):

使用远程仓库 (Working with Remotes)

为了协作,你需要管理远程仓库。远程仓库是你项目托管在网络上的版本。
  • 列出远程仓库: git remote
    • git remote:列出远程仓库的短名称。
    • git remote -v:显示用于读取(fetch)和写入(push)的 URL。
  • 添加远程仓库: git remote add <shortname> <url> 添加一个新的远程 Git 仓库,并为其指定一个短名称,以便于引用。
  • 从远程仓库抓取数据: git fetch <remote> 该命令查找远程服务器,获取你本地没有的所有数据,并更新你的本地数据库和远程跟踪分支(例如,pb/master)。
  • 推送到远程仓库: git push <remote> <branch> 当你准备好分享你的项目时,使用此命令将你的提交推送到上游。如果其他人在你之前推送了更改,你的推送将被拒绝;你必须先抓取(fetch)并整合(merge/rebase)他们的工作。
  • 拉取数据: git pullgit pullgit fetch 之后自动执行 git mergegit rebase 的便捷命令。
  • 检查远程仓库: git remote show <remote> 显示关于特定远程仓库的更多信息,包括 URL、远程分支以及配置用于 git pullgit push 的本地分支。
学习笔记——Git 分支及操作学习笔记——《新摄影笔记》:构图失败的七个常见问题
Loading...