经验笔记:Git 基础操作指南
1. 安装 Git
首先确保您的计算机上已安装 Git。如果还没有安装,可以从 Git官网 下载并安装。
2. 配置 Git
安装完成后,打开命令行工具,配置您的 Git 账户信息,包括用户名和邮箱。这一步对于记录您的贡献非常重要:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
git
: Git 命令行工具。config
: 配置命令,用于设置 Git 的各种配置选项。--global
: 表示这是一个全局配置,适用于所有 Git 仓库。user.name
: 设置用户的姓名。user.email
: 设置用户的邮箱。"Your Name"
: 您的名字,例如 “John Doe”。"you@example.com"
: 您的邮箱地址,例如 “john.doe@example.com”。
3. 创建一个新的 Git 仓库
接下来,创建一个项目文件夹,并将其初始化为 Git 仓库:
mkdir my-project
cd my-project
git init
mkdir
: 创建目录的命令。my-project
: 新创建的目录名。cd
: 变更目录的命令。my-project
: 进入刚刚创建的目录。git
: Git 命令行工具。init
: 初始化命令,用于将当前目录初始化为一个 Git 仓库。
4. 创建并添加文件
在项目中创建一个文件,例如 README.md
,并添加一些初始内容:
echo "# My Project" > README.md
echo
: 输出文本的命令。"# My Project"
: 要输出的文本内容。>
: 重定向操作符,将输出的内容写入文件。README.md
: 要创建的文件名。
将此文件添加到 Git 的跟踪列表中:
git add README.md
git
: Git 命令行工具。add
: 添加命令,用于将文件添加到暂存区。README.md
: 要添加的文件名。
5. 丢弃更改
如果您想丢弃这些更改,可以使用 git restore 命令:
git restore README.md
- 未添加到暂存区的更改:
如果更改尚未被 git add 添加到暂存区,git restore 可以恢复工作区中的文件到上次提交的状态。 - 已添加到暂存区的更改:
如果更改已经被 git add 添加到暂存区,git restore 可以将更改从暂存区移回工作区。
6. 提交更改
提交您刚才添加的文件到本地仓库,并附带一条有意义的提交信息:
git commit -m "Initial commit with README file"
# git commit -a -m "Initial commit with README file"
git
: Git 命令行工具。commit
: 提交命令,用于将暂存区的内容提交到本地仓库。-m
: 消息选项,用于指定提交信息。-a
: 功能选项,自动将所有已跟踪文件的更改添加到暂存区,以便在一次命令中完成添加更改和提交。"Initial commit with README file"
: 提交信息,描述本次提交的内容。
7. 修改文件并提交
编辑 README.md
文件,添加更多内容,例如项目特性:
echo "## Features" >> README.md
echo "- Feature 1" >> README.md
echo "- Feature 2" >> README.md
echo
: 输出文本的命令。"## Features"
: 要输出的文本内容。>>
: 重定向操作符,将输出的内容追加到文件末尾。README.md
: 要追加内容的文件名。
查看暂存区的更改:
git diff --cached
这将显示暂存区中即将提交的更改:
输出中的a文件代表版本,b文件代表新版本。
再次将文件添加到暂存区并提交:
git add README.md
git commit -m "Add project features to README"
git
: Git 命令行工具。add
: 添加命令,用于将文件添加到暂存区。README.md
: 要添加的文件名。commit
: 提交命令,用于将暂存区的内容提交到本地仓库。-m
: 消息选项,用于指定提交信息。"Add project features to README"
: 提交信息,描述本次提交的内容。
8. 查看提交历史与状态
查看项目的提交历史和当前工作区的状态:
# git log --oneline
git log
git status
git
: Git 命令行工具。log
: 日志命令,用于查看项目的提交历史。status
: 状态命令,用于查看当前工作区和暂存区的状态。oneline
: 表示每个提交只显示一行信息,通常包括提交的哈希值和提交信息的简短描述。- q 键:退出分页器,返回到命令行
9. 创建与切换分支
为了开发新功能,创建一个新分支 feature-branch
并切换到该分支:
git branch feature-branch
git checkout feature-branch
或者
git checkout -b feature-branch
git
: Git 命令行工具。checkout
: 切换命令,用于切换到指定的分支。branch
: 分支命令,用于创建和管理分支。-b
: 创建并切换到新分支的选项。feature-branch
: 新创建的分支名。
在新分支上继续工作,比如添加新的特性说明:
echo "## New Feature" >> README.md
echo "- Feature 3" >> README.md
echo
: 输出文本的命令。"## New Feature"
: 要输出的文本内容。>>
: 重定向操作符,将输出的内容追加到文件末尾。README.md
: 要追加内容的文件名。
再次将文件添加到暂存区并提交:
git add README.md
git commit -m "Add new feature description"
git
: Git 命令行工具。add
: 添加命令,用于将文件添加到暂存区。README.md
: 要添加的文件名。commit
: 提交命令,用于将暂存区的内容提交到本地仓库。-m
: 消息选项,用于指定提交信息。"Add new feature description"
: 提交信息,描述本次提交的内容。
10. 切换回主分支
完成新特性的开发后,切换回主分支(通常是 main
或 master
):
git checkout main
git
: Git 命令行工具。checkout
: 切换命令,用于切换到指定的分支。main
: 要切换到的分支名(如果是master
分支,可以将main
替换为master
)。
11. 合并与解决冲突
将 feature-branch
分支的更改合并到主分支。如果存在冲突,Git 会提示您解决它们:
git merge feature-branch
git
: Git 命令行工具。merge
: 合并命令,用于将一个分支的更改合并到当前分支。feature-branch
: 要合并的分支名。
解决完任何可能的冲突后,再次提交更改以完成合并过程:
git add <conflicted-file>
git commit -m "Resolve conflicts after merging feature-branch"
<conflicted-file>
: 发生冲突的文件名。commit
: 提交命令,用于将暂存区的内容提交到本地仓库。-m
: 消息选项,用于指定提交信息。"Resolve conflicts after merging feature-branch"
: 提交信息,描述本次提交的内容。
12. 清理分支
合并完成后,可以安全地删除 feature-branch
分支:
git branch -d feature-branch
git
: Git 命令行工具。branch
: 分支命令,用于创建和管理分支。-d
: 删除分支的选项。feature-branch
: 要删除的分支名。
13. 丢弃更改
如果您想丢弃工作区中的更改,可以使用以下命令:
13.1 丢弃单个文件的更改
如果您想丢弃某个文件的更改,可以使用以下命令:
git checkout -- <file>
git
: Git 命令行工具。checkout
: 切换命令,用于切换到指定的分支或恢复文件。--
: 分隔符,用于区分命令和文件名。<file>
: 要恢复的文件名。
13.2 丢弃所有未提交的更改
如果您想丢弃所有未提交的更改,可以使用以下命令:
git reset --hard
git
: Git 命令行工具。reset
: 重置命令,用于将工作区和暂存区恢复到指定的状态。--hard
: 选项,表示强制重置,丢弃所有未提交的更改。
示例
假设您修改了 README.md
文件,但决定不保留这些更改:
git checkout -- README.md
如果您想丢弃所有未提交的更改:
git reset --hard
14. 交互式补丁
对于复杂的更改,您可以使用交互式补丁来逐行选择要添加的内容。这种方式特别适合当您只想提交部分更改,而不是整个文件的所有更改时。
步骤 1: 修改文件
假设您已经修改了 README.md
文件,但只想提交其中的一部分更改。
步骤 2: 使用交互式补丁
运行以下命令启动交互式补丁模式:
git add -p
git
: Git 命令行工具。add
: 添加命令,用于将文件添加到暂存区。-p
: 选项,表示进入交互式补丁模式。
步骤 3: 选择要添加的更改
Git 会逐块显示文件的更改,并询问您是否要添加每个块。您可以选择以下选项:
- y - 是,将此块添加到暂存区。
- n - 否,跳过此块。
- q - 退出,不再处理剩余的块。
- a - 将所有剩余的块都添加到暂存区。
- d - 不将任何剩余的块添加到暂存区。
- e - 手动编辑当前块。
- ? - 显示帮助信息。
步骤 4: 提交更改
选择完要添加的块后,提交更改:
git commit -m "Add specific changes from README.md"
git
: Git 命令行工具。commit
: 提交命令,用于将暂存区的内容提交到本地仓库。-m
: 消息选项,用于指定提交信息。"Add specific changes from README.md"
: 提交信息,描述本次提交的内容。
15. 高级操作
15.1 合并提交
使用交互式变基来合并多个提交。这在您想将多个小的提交合并成一个大的提交时非常有用。
步骤 1: 开始交互式变基
假设您想合并最近的3个提交:
git rebase -i HEAD~3
git
: Git 命令行工具。rebase
: 变基命令,用于将一个分支的更改应用到另一个分支。-i
: 选项,表示进入交互式变基模式。HEAD~3
: 表示从当前提交向前数3个提交。
步骤 2: 编辑提交
Git 会打开一个文本编辑器,列出最近的3个提交。每个提交前面都有一个 pick
关键字,表示将保留该提交。您可以将 pick
更改为 squash
或 s
来合并提交。
例如,假设您的提交历史如下:
pick abc1234 First commit message
pick def5678 Second commit message
pick ghi9012 Third commit message
您可以修改为:
pick abc1234 First commit message
squash def5678 Second commit message
squash ghi9012 Third commit message
步骤 3: 编辑合并后的提交信息
保存并关闭编辑器后,Git 会再次打开编辑器,让您编写合并后的提交信息。您可以编辑或保留默认的提交信息。
步骤 4: 完成变基
保存并关闭编辑器后,变基过程完成,您的提交历史将更新。
15.2 重写提交信息
在交互式变基过程中,您还可以修改提交信息。
步骤 1: 开始交互式变基
假设您想修改最近的3个提交:
git rebase -i HEAD~3
git
: Git 命令行工具。rebase
: 变基命令,用于将一个分支的更改应用到另一个分支。-i
: 选项,表示进入交互式变基模式。HEAD~3
: 表示从当前提交向前数3个提交。
步骤 2: 编辑提交
Git 会打开一个文本编辑器,列出最近的3个提交。每个提交前面都有一个 pick
关键字,表示将保留该提交。您可以将 pick
更改为 reword
或 r
来修改提交信息。
例如,假设您的提交历史如下:
pick abc1234 First commit message
pick def5678 Second commit message
pick ghi9012 Third commit message
您可以修改为:
reword abc1234 First commit message
pick def5678 Second commit message
pick ghi9012 Third commit message
步骤 3: 编辑提交信息
保存并关闭编辑器后,Git 会再次打开编辑器,让您重新输入第一个提交的信息。您可以编辑或保留默认的提交信息。
步骤 4: 完成变基
保存并关闭编辑器后,变基过程完成,您的提交信息将更新。
15.3 删除提交
在交互式变基过程中,您还可以删除提交。
步骤 1: 开始交互式变基
假设您想删除最近的3个提交中的一个:
git rebase -i HEAD~3
git
: Git 命令行工具。rebase
: 变基命令,用于将一个分支的更改应用到另一个分支。-i
: 选项,表示进入交互式变基模式。HEAD~3
: 表示从当前提交向前数3个提交。
步骤 2: 编辑提交
Git 会打开一个文本编辑器,列出最近的3个提交。每个提交前面都有一个 pick
关键字,表示将保留该提交。您可以将 pick
更改为 drop
或 d
来删除提交。
例如,假设您的提交历史如下:
pick abc1234 First commit message
pick def5678 Second commit message
pick ghi9012 Third commit message
您可以修改为:
pick abc1234 First commit message
drop def5678 Second commit message
pick ghi9012 Third commit message
步骤 3: 完成变基
保存并关闭编辑器后,变基过程完成,指定的提交将被删除。
15.4 回退提交
如果您想撤销某个提交,可以使用 git revert
命令:
git revert <commit-hash>
git
: Git 命令行工具。revert
: 回退命令,用于撤销指定的提交。<commit-hash>
: 要撤销的提交的哈希值。
示例
假设您想撤销哈希值为 abc1234
的提交:
# 修改文件并提交
echo "This will be revert." >> README.md
git add
git commit -m "a test commit will be revert"
# 查看提交历史,记下要撤销的提交的哈希值。
git log --oneline
# 将last_commit_hash_value替换成实际的撤销的提交的哈希值
git revert last_commit_hash_value
# 实际上git revert也可以被git revert
15.5 保存工作区
如果您想暂时保存工作区中的更改,可以使用 git stash
命令:
步骤 1: 保存更改
保存当前工作区的更改:
# 修改文件
echo "This is a change." >> README.md
# 保存更改到 stash
git stash
git
: Git 命令行工具。stash
: 保存命令,将工作区和暂存区的更改保存到一个临时存储区:- git stash 命令将当前工作区和暂存区的所有更改保存到一个临时存储区(stash),并清空工作区和暂存区。
- 这样,您可以干净地切换到其他任务,然后再恢复这些更改。
步骤 2: 查看所有保存的更改
查看所有保存的更改:
git stash list
list
: 列表命令,用于查看所有保存的更改。- 每个保存的更改都会有一个唯一的标识符,例如 stash@{0}。
步骤 3: 恢复最近一次保存的更改
恢复最近一次保存的更改:
git stash pop
pop
: 恢复命令,将最近一次保存的更改从临时存储区(stash)移除并应用到工作区。
步骤 4 (可选): 恢复指定的 stash 更改,但不从 stash 存储区中移除
恢复指定的 stash 更改,但不从 stash 存储区中移除:
git stash apply stash@{0}
将 stash@{0} 的更改应用到工作区,但 stash@{0} 仍然保留在临时存储区(stash)中。
16. 工作流整合
16.1 拾取提交
如果您想将一个分支中的某个提交应用到另一个分支上,可以使用 git cherry-pick
命令:
git cherry-pick <commit-hash>
git
: Git 命令行工具。cherry-pick
: 拾取命令,用于将指定的提交应用到当前分支。<commit-hash>
: 要拾取的提交的哈希值。
示例
假设您想将哈希值为 <commit-hash-of-feature_n-commit>
的提交应用到当前分支:
# 查看提交历史,方便比较cherry-pick的效果
git log --oneline
# 创建并切换到新分支 feature_n
git checkout -b feature_n
# 在 feature_n 分支上进行提交
echo "Feature 1" >> README.md
git add README.md
git commit -m "Add feature N"
# 查看提交历史,并记下哈希值
git log --oneline
# 切换回主分支 main
git checkout main
# 拾取 feature1 分支上的提交
git cherry-pick <commit-hash-of-feature_n-commit>
# 其中 <commit-hash-of-feature_n-commit> 是 feature_n 分支上 Add feature N 提交的哈希值
# 查看提交历史
git log --oneline
16.2 变基
将当前分支的更改基于另一个分支的最新状态:
git rebase <base-branch>
git
: Git 命令行工具。rebase
: 变基命令,用于将一个分支的更改应用到另一个分支。<base-branch>
: 基础分支,通常是main
或master
。
示例
假设您想将当前分支的更改基于 main
分支的最新状态:
# 切换到分支 feature_n
git checkout feature_n
# 查看提交历史,方便比较rebase的效果
git log --oneline
# 将 `feature_n` 分支的更改基于 `main` 分支的最新状态
git rebase main
# 解决冲突(如果有)
git add <conflicted-file>
# 如果在变基过程中出现冲突,Git 会提示您解决冲突。解决冲突后,使用以下命令继续变基
git rebase --continue
# 查看提交历史
git log --oneline
17. 最终检查
最后,再次检查项目的提交历史和状态,确保一切符合预期:
git log
git status
git
: Git 命令行工具。log
: 日志命令,用于查看项目的提交历史。status
: 状态命令,用于查看当前工作区和暂存区的状态。- q 键:退出分页器,返回到命令行
希望这份详细的 Git 操作指南能帮助您高效地管理和协作您的代码项目。如果您有任何疑问或需要进一步的帮助,请随时查阅 Git 的官方文档或社区资源。