引言
在我之前面试过程中,经常会问到关于公司使用什么代码版本管理工具。 无非是考察咱们是否用过 Git和SVN。 现在公司选择的工具直接影响到项目的开发流程和协作效率。当前市面上,Git 和 SVN(Subversion)是两种流行的版本控制系统。它们各有优势和适用的场景。 SVN我暂且不说了。一般游戏公司用的比较多 感兴趣的可以自己搜相关文章去了解哈。
本篇文章我将详细讲解我们使用Git版本控制过程中经常遇到的命令以及对应的解释说明。 毕竟很多我自己也没注意。本篇文章即对git 命令做一个总结。
git init
:创建一个 Git 仓库
在日常开发中,第一步通常是创建一个 Git 仓库。在本地开发中,我们可以通过 git init
命令初始化一个新的 Git 仓库,开始对项目进行版本管理。这个仓库可以是全新的项目,也可以是一个已有项目的 Git 管理配置。(当然,有些开发者不需要自己创建仓库,而是直接从公司项目库中拉取分支,这部分我们会在后面详细说明。)
示例命令:
bash
git init
运行该命令后,Git 会在当前目录下创建一个隐藏的 .git
文件夹,存储所有的 Git 配置信息和历史记录。这一步完成后,我们就成功创建了一个本地 Git 仓库。
git init
的应用场景
- 全新项目 :在从零开始开发项目时,可以使用
git init
初始化 Git 仓库,以便跟踪每次提交的变更。 - 管理现有项目 :如果项目已经存在,则可以在其根目录下执行
git init
,开始管理这个项目的版本历史。
git config
: 配置用户信息
在初始化 Git 仓库后,通常需要配置用户的基本信息(如用户名和邮箱),以确保每次提交都能准确标识代码作者。这一步也帮助团队协作中追踪不同贡献者的代码更改。
配置用户名和邮箱
在使用 Git 前,建议为当前环境配置用户名和邮箱,以确保提交的作者信息一致。
示例命令:
bash
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
-
--global
:--global
参数表示设置为全局配置,这些信息适用于当前用户的所有 Git 仓库。 -
本地仓库配置 :若只在当前仓库中设置用户名和邮箱,可省略
--global
参数:bashgit config user.name "Project Specific Name" git config user.email "project.email@example.com"
查看当前配置
要查看已配置的 Git 信息,可以使用以下命令:
bash
git config --list
此命令将列出所有配置项,包括用户名、邮箱和其他 Git 选项。
git config
的其他常用配置
-
设置默认文本编辑器
bashgit config --global core.editor "vim"
如果不指定编辑器,Git 默认调用系统编辑器。可以根据个人习惯设置为
vim
、nano
、code
(VS Code)等。 -
启用颜色显示
bashgit config --global color.ui auto
启用颜色显示可以让 Git 命令输出更直观,例如
status
和diff
的结果会使用不同颜色来显示状态差异,更便于识别。 -
设置 Git 命令别名
bashgit config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit
设置别名可以简化常用命令并提高效率。例如,用
git st
代替git status
,更简便易用。 -
配置默认合并策略
bashgit config --global merge.ff false
该配置禁止使用快速合并(fast-forward),从而在合并时保留分支的历史记录,方便后续查阅。
-
设置推送默认分支
bashgit config --global push.default simple
此配置确保只推送当前分支到远程仓库中的同名分支,减少错误推送其他分支的风险。
配置文件的位置
- 全局配置文件 :通常位于用户主目录下的
.gitconfig
文件,所有全局设置都记录在其中。 - 项目配置文件 :每个 Git 仓库也有一个独立的
.git/config
文件,用于记录该仓库的特定配置。
git clone
:从远程仓库克隆项目
在团队开发中,开发人员通常不需要从头创建一个项目仓库,而是直接从公司项目库或远程仓库中拉取代码。这一步我们使用 git clone
命令来完成。git clone
可以将整个远程仓库复制到本地,并保留所有提交历史、分支和标签信息,方便开发者快速开始工作。
基本用法:
bash
git clone <repository-url>
例如,克隆 GitHub 上的一个项目仓库:
bash
git clone https://github.com/username/project-name.git
执行该命令后,Git 会在当前目录下创建一个名为 project-name
的文件夹,并将远程仓库的内容下载到该文件夹中。
git clone
的常用参数
-
指定克隆到的目录
bashgit clone <repository-url> <directory>
默认情况下,Git 会在当前目录下创建一个与仓库名称相同的文件夹。但如果需要自定义文件夹名称,可以在 URL 后面指定:
bashgit clone https://github.com/username/project-name.git my-local-folder
上述命令会将仓库克隆到
my-local-folder
文件夹中。 -
指定分支克隆
bashgit clone -b <branch-name> <repository-url>
默认情况下,
git clone
会克隆默认分支(通常是main
或master
分支)。但可以使用-b
参数来克隆特定分支:bashgit clone -b develop https://github.com/username/project-name.git
这会将远程仓库的
develop
分支克隆到本地。 -
浅克隆(仅获取最近的提交)
bashgit clone --depth <number> <repository-url>
有时仓库的提交历史非常庞大,为了节省时间和空间,可以使用
--depth
参数进行浅克隆,只获取最近的提交。比如:bashgit clone --depth 1 https://github.com/username/project-name.git
这会只获取最新的 1 次提交,适合快速查看项目或测试代码。
-
单分支克隆
bashgit clone --single-branch -b <branch-name> <repository-url>
如果只需要一个特定分支,可以同时使用
--single-branch
和-b
参数,这样只会下载该分支的内容,而不会包含其他分支信息:bashgit clone --single-branch -b feature https://github.com/username/project-name.git
这在需要某个特定功能分支时非常有用,可以减少下载的数据量。
-
使用 SSH 克隆
如果在本地配置了 SSH 密钥,可以直接使用 SSH 方式克隆仓库,避免每次输入用户名和密码:
bashgit clone git@github.com:username/project-name.git
这种方式更适合团队协作,尤其是频繁推送和拉取的情况。
其他常用选项
--mirror
:完整地克隆远程仓库,包括所有的引用(refs
),用于创建仓库的完整镜像。这种模式会把仓库的所有内容(包括所有分支、标签等)原样复制,不创建工作区。--recursive
:当项目中包含子模块(submodules)时,可以使用此参数同时克隆子模块内容,避免手动初始化子模块。
常见示例总结
-
克隆默认分支到自定义目录:
bashgit clone https://github.com/username/project-name.git custom-folder
-
克隆特定分支(如
develop
分支):bashgit clone -b develop https://github.com/username/project-name.git
-
仅获取最近 3 次提交:
bashgit clone --depth 3 https://github.com/username/project-name.git
通过 git clone
命令,开发者可以轻松将项目从远程仓库复制到本地,快速上手开发。
创建和管理分支
一般来说,当我们封装好了 master
主分支代码,或者从公司仓库克隆了代码后,就需要进入实际开发阶段。在日常开发中,我们通常会基于主分支创建新的分支,这样可以在不影响主分支的情况下,独立完成功能或修复工作,之后再将更改合并到主分支中。这一部分我们将介绍常用的分支管理命令。
1. 创建分支:git branch <branch-name>
在 Git 中,创建分支的命令是 git branch <branch-name>
,此命令用于在当前分支的基础上创建一个新的分支。创建分支后,新分支会拥有当前分支的所有提交历史,但并不会自动切换到新分支。
示例命令:
bash
git branch feature-xyz
上述命令会基于当前分支(通常是 main
或 master
)创建一个名为 feature-xyz
的新分支。此分支可以用于特定功能的开发或 Bug 修复,确保开发工作不会影响到主分支。
2. 创建并切换到新分支:git checkout -b <branch-name>
要创建分支并自动切换到该分支,可以使用 git checkout -b
命令,这是一种快捷方式,非常适合在创建分支后直接进入开发状态。
示例命令:
bash
git checkout -b feature-xyz
执行该命令后,Git 会创建 feature-xyz
分支并切换到该分支。这样我们就可以在新分支上直接进行开发,而不影响到其他分支。
3. 查看所有分支:git branch
在 Git 中,我们可以通过 git branch
命令查看本地所有分支的列表,当前分支会带有 *
标记,表示开发者目前所在的分支。
示例命令:
bash
git branch
输出示例:
plaintext
* master
feature-xyz
bugfix-123
这里 * master
表示当前处于 master
分支。
4. 删除分支:git branch -d <branch-name>
完成开发任务或 Bug 修复后,如果不再需要某个分支,可以使用 git branch -d
命令删除本地的分支。此命令会确保分支上的内容已经被合并,否则不会允许删除分支,以防丢失未合并的提交。
示例命令:
bash
git branch -d feature-xyz
如果要强制删除未合并的分支,可以使用 -D
参数(不推荐,除非确定不再需要分支内容):
bash
git branch -D feature-xyz
5. 推送分支到远程仓库:git push origin <branch-name>
在本地完成分支的开发后,通常需要将其推送到远程仓库,方便团队协作。使用 git push origin <branch-name>
命令即可将当前分支推送到远程。
示例命令:
bash
git push origin feature-xyz
此命令会将 feature-xyz
分支推送到远程仓库。如果是第一次推送,可以加上 -u
参数,将当前分支和远程分支关联,简化后续操作:
bash
git push -u origin feature-xyz
之后,只需运行 git push
即可更新远程分支。
6. 查看远程分支:git branch -a
使用 git branch -a
可以查看所有分支,包括本地和远程的所有分支。通常远程分支前面会带有 remotes/origin/
前缀:
bash
git branch -a
示例输出:
plaintext
* master
feature-xyz
remotes/origin/master
remotes/origin/feature-xyz
7. 删除远程分支
若需要从远程仓库删除一个分支,可以使用以下命令:
bash
git push origin --delete feature-xyz
此命令会从远程仓库中移除 feature-xyz
分支,但不会影响到其他人的本地分支。
以上是 Git 中常见的分支管理操作。分支管理可以有效帮助开发人员在不同功能间切换、隔离未完成的更改,确保项目主分支始终保持稳定。
提交管理
在开发中完成了功能或修复后,我们需要将更改提交到 Git 仓库中。提交管理包括将文件从工作区添加到暂存区、编写提交信息,以及查看和管理提交历史等。以下介绍了常用的提交管理命令及其用法、示例和撤销操作的处理方法。
1. 添加文件到暂存区:git add
git add
命令用于将工作区中的文件添加到暂存区,为后续的提交做准备。可以选择性地添加特定文件或目录,也可以一次性添加所有更改。
示例命令:
-
添加单个文件:
bashgit add filename.txt
-
添加当前目录的所有文件和更改(包括新文件和修改):
bashgit add .
-
添加所有文件,包括已删除的文件:
bashgit add -A
-
交互式添加代码片段(选择性提交文件中的部分更改):
bashgit add -p
2. 提交更改:git commit
git commit
命令用于将暂存区的更改提交到本地仓库,生成新的提交记录,并附带一条提交信息描述更改内容。提交信息应该清晰、简洁,帮助团队理解更改内容。
示例命令:
-
使用简洁的提交信息提交:
bashgit commit -m "Add feature XYZ"
-
如果提交后发现需要补充更改或修改提交信息,可以使用
--amend
参数来修改上一次提交:bashgit commit --amend
该命令会打开编辑器,允许更改提交信息或加入新的更改,不会生成新的提交记录,而是覆盖上一次提交。
3. 查看工作区状态:git status
git status
命令用于查看工作区和暂存区的状态,包括哪些文件已被修改、哪些文件在暂存区、哪些文件未被跟踪。提交前通过 git status
检查更改,有助于确保提交内容正确。
示例命令:
bash
git status
输出示例:
plaintext
On branch feature-xyz
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: filename.txt
new file: newfile.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: anotherfile.txt
4. 查看提交历史:git log
git log
用于查看提交历史,包含提交人、提交信息和提交时间等信息。在需要回溯更改或审查历史提交时,git log
是非常有用的命令。
示例命令:
-
查看所有提交历史:
bashgit log
-
简化显示,按单行输出每个提交:
bashgit log --oneline
-
以图形化方式显示提交历史(展示分支和合并情况):
bashgit log --graph --oneline --all
示例输出:
plaintext
* 9b0f5a2 Add feature XYZ
* 2f6e45d Fix bug in function ABC
* 7c8e4e1 Initial project setup
5. 查看差异:git diff
git diff
用于查看工作区或暂存区中的差异,帮助确认修改内容。
示例命令:
-
查看工作区的更改:
bashgit diff
-
查看暂存区与工作区的差异(显示已暂存的修改):
bashgit diff --cached
-
比较两个分支之间的差异:
bashgit diff branch1 branch2
-
查看特定提交之间的差异:
bashgit diff <commit-hash1> <commit-hash2>
撤销操作
在提交后,可能会遇到需要撤销或修改提交内容的情况。以下是常用的撤销操作命令及示例。
6. 取消暂存:git restore --staged <file>
如果已将文件添加到暂存区,但不想包含在下一次提交中,可以使用 git restore --staged
命令取消暂存。
示例命令:
bash
git restore --staged filename.txt
此命令将文件移出暂存区,但保留工作区中的更改。
7. 撤销上一次提交:git commit --amend
若在提交后发现需要补充修改或更改提交信息,可以使用 git commit --amend
命令修改上一次提交,而不会生成新的提交。
示例命令:
bash
git commit --amend
执行此命令后,Git 会打开编辑器,可以修改提交信息或将新的更改加入到上次提交中。
8. 回退到特定提交:git reset
git reset
用于回退到指定的提交,根据参数不同,回退可以保留或删除更改。
-
软回退(保留工作区和暂存区更改):
bashgit reset --soft <commit-hash>
-
混合回退(保留工作区更改,但清除暂存区):
bashgit reset --mixed <commit-hash>
-
硬回退(彻底丢弃所有更改):
bashgit reset --hard <commit-hash>
例如,回退到特定提交并保留工作区内容:
bash
git reset --soft 9b0f5a2
9. 撤销特定提交:git revert
git revert
创建一个新的提交来撤销指定提交,不会更改提交历史,适用于已推送到远程仓库的情况。
示例命令:
bash
git revert 9b0f5a2
此命令会生成一个新的提交来撤销 9b0f5a2
的更改,而不会修改历史记录。
10. 丢弃工作区的更改:git restore <file>
如果工作区的文件修改不再需要,可以用 git restore
丢弃更改,恢复到最后一次提交的状态。
示例命令:
-
丢弃指定文件的更改:
bashgit restore filename.txt
-
丢弃整个目录的修改:
bashgit restore .
通过以上提交管理和撤销操作的命令,开发者可以有效地管理提交记录,确保提交内容的正确性。合理使用这些命令,有助于保持 Git 提交历史的整洁与一致。
合并和撤销操作管理
在 Git 的使用过程中,合并和撤销操作是团队协作开发中的重要步骤。功能开发完成后,通常需要合并到主分支,而在出现错误时可能需要回退或撤销合并操作。Git 提供了多种命令来满足不同的合并和撤销需求,以下是主要的合并和撤销命令及其适用场景。
合并操作
1. 合并分支:git merge
git merge
命令用于将一个分支的所有提交合并到当前分支。通常在功能开发完成后,用于合并整个分支的更改,是最常用的合并方法。
示例命令:
-
首先切换到主分支:
bashgit checkout main
-
将
feature-branch
分支合并到main
:bashgit merge feature-branch
合并模式:
- 快速合并(Fast-Forward) :如果主分支上没有其他提交,Git 会直接移动分支指针,不生成新的合并提交。
- 三方合并(Three-Way Merge) :如果主分支上有其他提交,则会生成一个合并提交,包含合并前的所有历史。
2. 选择性合并:git cherry-pick
git cherry-pick
命令用于将指定的单个或多个提交合并到当前分支,适合在功能未完全完成或部分更改已验证的情况下,选择性地合并到主分支。
示例命令:
-
切换到主分支:
bashgit checkout main
-
将
feature-branch
中的特定提交abc1234
应用到main
:bashgit cherry-pick abc1234
多个提交的 cherry-pick
:
-
使用提交区间来选择合并一系列提交:
bashgit cherry-pick abc1234^..xyz5678
撤销合并操作
在合并操作后,如果发现问题或不想保留某些更改,Git 提供了 git reset
和 git revert
命令来撤销合并。
3. 撤销提交历史:git reset
git reset
用于回退到指定的提交,适合在本地开发中重写提交历史。如果合并提交未推送到远程仓库,可以使用 reset
来回退合并。
适用场景 :git reset
会直接删除指定提交及其之后的历史,因此适合本地分支,回退后可以重新调整提交内容。
4. 撤销已提交的合并:git revert
git revert
不会直接更改提交历史,而是通过创建一个新的提交来抵消指定提交的内容。这非常适合在已推送到远程仓库的分支上撤销合并,确保历史记录完整。
示例命令:
-
撤销合并提交(例如
merge-commit-hash
是合并的提交哈希):bashgit revert -m 1 <merge-commit-hash>
这里的
-m 1
表示指定主分支(main
或master
)为合并基础,帮助 Git 识别要撤销的内容。
适用场景 :git revert
非常适合在远程分支上操作,不会改变历史记录,适合团队协作和远程分支的操作。
合并与撤销的选择
- 完整合并分支 :
git merge
是合并功能分支的最佳选择,能完整保留分支历史,适合已完成的功能或 Bug 修复。 - 选择性合并提交 :
git cherry-pick
适合在部分更改已验证的情况下,将特定提交合并到主分支。 - 撤销本地合并操作 :
git reset
用于撤销本地的合并,直接修改提交历史,适合未推送的提交。 - 撤销远程合并操作 :
git revert
用于在远程仓库中撤销合并提交,不更改历史记录,确保协作稳定。
同步远程仓库
在团队开发中,为了保持代码的同步性和一致性,常常需要将本地分支与远程仓库进行同步。同步远程仓库前,通常需要先更新本地分支,获取最新的远程分支信息,以确保合并或提交时不会出现冲突。同步的核心命令包括 git fetch
、git pull
和 git push
。
1. 更新远程仓库信息:git fetch
git fetch
命令用于从远程仓库获取更新信息,但不会自动合并到当前分支。git fetch
更新了本地的远程分支信息,可以帮助我们了解远程仓库的最新状态,然后选择是否进行合并。
示例命令:
bash
git fetch origin
此命令会从远程仓库 origin
拉取更新,但不会影响当前分支。
常用参数:
-
指定分支:只拉取某个分支的更新信息:
bashgit fetch origin main
-
拉取所有远程分支:
bashgit fetch --all
适用场景 :在提交或推送之前,通过 git fetch
先检查远程仓库是否有更新,然后再选择是否合并这些更新,有助于避免冲突。
2. 拉取并合并远程分支:git pull
git pull
是 git fetch
和 git merge
的组合。它先拉取远程更新,然后自动合并到当前分支。使用 git pull
可以快速同步远程分支的最新内容,但如果远程有冲突,可能需要手动解决。
示例命令:
-
基本拉取并合并当前分支的更新:
bashgit pull origin main
此命令会从远程仓库 origin
中的 main
分支拉取更新,并自动合并到本地的 main
分支。
-
--rebase
参数 :拉取远程更改并使用rebase
合并,避免产生合并提交,使提交历史更加线性整洁:bashgit pull --rebase origin main
适用场景 :当需要立即同步远程仓库的最新更新时,使用 git pull
可以一键完成拉取并合并的过程。不过在多人协作时,建议在拉取之前先使用 git fetch
查看变动,再决定是否需要手动合并,以避免自动合并产生的冲突。
3. 推送本地更改到远程仓库:git push
git push
用于将本地分支的更改推送到远程仓库,便于其他开发者获取。通常在提交、拉取并解决冲突后,使用 git push
将更改同步到远程仓库。第一次推送时,需指定远程分支名称,之后可以简化为 git push
。
示例命令:
-
将当前分支的更改推送到远程仓库的对应分支:
bashgit push origin main
-
-u
参数 :指定默认远程跟踪分支,设置后可以直接使用git push
推送,不再需要每次指定远程分支。bashgit push -u origin main
-
强制推送 :当推送被拒绝时,可以使用
--force
强制推送本地内容覆盖远程分支(慎用,可能会覆盖其他开发者的内容):bashgit push --force origin main
适用场景 :当本地开发完成并提交后,使用 git push
将更改同步到远程仓库,确保团队成员能够获取到最新代码。在多人协作时,不推荐使用 --force
推送,避免破坏他人工作。
示例操作流程
在实际的团队协作中,通常的同步流程如下:
-
更新远程分支信息 :在同步之前,先运行
git fetch
拉取远程仓库的更新,了解远程分支的最新状态。bashgit fetch origin
-
拉取并合并远程更新 :如果发现远程分支有更新,需要合并到当前分支,可以使用
git pull
合并更新。bashgit pull origin main
-
推送本地更改到远程 :当本地开发完成并解决冲突后,使用
git push
将更改推送到远程分支。bashgit push origin main
小结
git fetch
:获取远程更新,不影响本地分支;适合在合并前查看远程变更。git pull
:获取并自动合并远程更新;适合需要立即同步更新的场景。git push
:将本地更改推送到远程仓库;适合完成开发后同步代码给团队成员。
解决冲突和提交
在团队协作或多分支开发中,代码合并时经常会遇到冲突。Git 冲突通常发生在不同分支对同一文件的同一区域进行了不同修改时。了解如何查看、解决冲突以及提交修改,是团队开发中至关重要的技能。
1. 什么是冲突?
冲突发生在 Git 无法自动合并不同分支的更改时,例如两人都修改了同一行代码。遇到冲突时,Git 会停止合并过程,并标记冲突的文件。开发者需要手动解决这些冲突,然后继续完成合并。
冲突的常见场景:
- 拉取远程更改 :执行
git pull
合并远程更改时,本地的修改和远程的修改产生冲突。 - 合并分支:将功能分支合并到主分支时,如果两个分支对同一文件的相同位置进行了不同更改,可能会产生冲突。
2. 查看冲突
当冲突发生时,Git 会将冲突文件标记为未合并状态。可以通过以下命令查看冲突文件的状态:
bash
git status
冲突标记示例:
Git 会在冲突的文件中生成类似以下的标记:
plaintext
<<<<<<< HEAD
// 当前分支的代码
=======
// 被合并分支的代码
>>>>>>> feature-branch
<<<<<<< HEAD
表示当前分支的代码。=======
是冲突的分界线。>>>>>>> feature-branch
表示被合并分支的代码。
3. 解决冲突
解决冲突时,需要手动编辑冲突文件,选择保留的更改,或者合并两边的代码。可以按以下步骤进行:
-
编辑冲突文件 :打开冲突的文件,找到冲突标记 (
<<<<<<<
、=======
和>>>>>>>
) 位置,手动选择保留或删除冲突代码块。示例:合并两个冲突的版本,手动选择适当的代码,然后删除冲突标记。
plaintext// 解决冲突后 // 保留的合并代码
-
添加解决后的文件:解决冲突后,将文件添加到暂存区标记为已解决。
bashgit add <conflicted-file>
-
完成合并提交:在所有冲突解决并添加到暂存区后,执行以下命令完成合并。
bashgit commit
4. 查看并处理多个冲突
在大型项目中,多个文件可能会产生冲突。可以通过以下命令逐步查看并处理冲突:
-
查看所有冲突文件:
bashgit status
-
添加已解决的所有文件:
bashgit add .
-
完成合并并提交:
bashgit commit -m "Resolve merge conflicts"
5. 使用工具解决冲突
Git 兼容多种 GUI 工具,可以帮助可视化解决冲突。可以使用 VS Code、Sourcetree、P4Merge 等工具直接查看并解决冲突,更加直观。
设置默认冲突解决工具:
bash
git config --global merge.tool <tool-name>
例如:
bash
git config --global merge.tool vscode
然后执行以下命令启动工具解决冲突:
bash
git mergetool
6. 提交解决后的代码
在解决冲突后,可以使用 git commit
提交已合并的更改。以下是常见的提交流程:
-
解决冲突并保存更改:确保所有冲突文件已保存。
-
将解决的文件添加到暂存区:
bashgit add .
-
提交合并更改:
bashgit commit -m "Resolve merge conflicts and merge branch"
小结
- 冲突解决流程 :在合并冲突发生时,先用
git status
查看冲突文件,手动编辑或使用工具解决冲突,然后通过git add
和git commit
完成合并。 - 工具辅助:可以设置并使用合并工具,如 VS Code 或其他合并工具,更高效地可视化解决冲突。
通过熟练掌握冲突解决和提交方法,团队开发中能够更快速地整合分支和解决代码冲突,确保项目稳定。
暂存和恢复工作区
在实际开发中,有时我们正在修改代码,但需要临时切换到其他任务或分支,这时可以使用 git stash
来保存当前的未提交更改,将工作区恢复到干净状态,方便切换工作。git stash
系列命令允许我们将未完成的更改暂存起来,并在需要时恢复。
使用场景
以下是使用 git stash
的典型场景:
- 临时切换分支:如果在某个分支上修改了代码,但还未完成或提交,而此时需要切换到其他分支,可以将更改暂存起来,避免影响切换操作。
- 测试其他功能:正在开发某个功能,但需要临时测试或修复其他功能的代码,可以将当前的工作暂存。
- 清理工作区 :如果需要清理工作区的修改内容,但又不想丢失更改,可以使用
git stash
来保存当前状态。
1. 保存当前工作区更改:git stash
git stash
命令用于将当前工作区的所有更改(包括未提交的文件)存入 Git 的暂存栈中,然后将工作区恢复到上一次提交的状态。执行 git stash
后,工作区将变为干净状态,便于进行其他操作。
示例命令:
bash
git stash
执行此命令后,所有未提交的更改会被暂存到一个栈中,工作区恢复为最新提交的状态。
常用参数:
-
保存特定消息:可以添加备注,方便后续识别暂存内容:
bashgit stash push -m "WIP: feature A development"
-
仅暂存未提交的文件:
bashgit stash --keep-index
2. 查看暂存的更改列表:git stash list
git stash list
命令用于查看当前仓库的所有暂存记录。每条记录都有唯一的编号和备注(如果有)。
示例命令:
bash
git stash list
示例输出:
plaintext
stash@{0}: WIP on main: 9b0f5a2 Add feature XYZ
stash@{1}: WIP on main: 7c8e4e1 Bugfix for ABC function
这里 stash@{0}
是最近一次的暂存内容,记录了暂存的分支名称和最近的提交信息。
3. 恢复暂存的更改:git stash pop
git stash pop
命令用于从暂存栈中恢复最近一次暂存的更改,并从暂存栈中删除该记录。执行此命令后,暂存内容会被还原到工作区。
示例命令:
bash
git stash pop
执行该命令后,工作区会恢复到最近一次的暂存状态,并删除该暂存记录。
###3 4. 应用暂存的更改但不删除:git stash apply
git stash apply
命令会将指定的暂存内容应用到工作区,但不会删除该暂存记录。如果需要多次使用某个暂存记录,可以使用 apply
而不是 pop
。
示例命令:
-
恢复最近一次暂存的内容(不删除):
bashgit stash apply
-
恢复特定的暂存记录(不删除):
bashgit stash apply stash@{1}
5. 删除特定的暂存记录:git stash drop
git stash drop
命令用于删除指定的暂存记录,帮助保持暂存栈的整洁。
示例命令:
bash
git stash drop stash@{1}
此命令会删除 stash@{1}
的暂存内容,但不会影响工作区。
6. 清除所有暂存记录:git stash clear
git stash clear
会清空所有的暂存记录,不可恢复。谨慎使用。
示例命令:
bash
git stash clear
示例操作流程
-
将当前工作区的修改暂存:
bashgit stash push -m "WIP: Refactoring feature B"
-
切换到其他分支进行任务处理:
bashgit checkout main
-
完成任务后,切回原分支并恢复暂存的更改:
bashgit stash pop
-
查看暂存历史,删除不需要的暂存记录:
bashgit stash list git stash drop stash@{1}
小结
git stash
:暂存当前工作区更改,用于临时保存修改。git stash list
:查看暂存的更改记录。git stash pop
:恢复最近一次暂存内容并删除记录。git stash apply
:恢复指定暂存内容但不删除记录。git stash drop
/git stash clear
:删除单个或全部暂存记录,保持暂存栈整洁。
使用 git stash
系列命令,开发者可以灵活地在不同任务之间切换,同时保持未完成的工作不被丢失。
查看和比较命令
在使用 Git 时,经常需要查看提交的详细信息、对比不同分支的差异以及查看提交历史等。Git 提供了多种查看和比较命令,包括 git show
、git diff
和 git log
,帮助开发者更好地理解代码变更和项目进展。
1. 查看提交详情:git show
git show
命令用于查看某次提交的详细信息,包含提交人、提交时间、提交信息以及具体的代码变更。它默认显示最新的提交内容,也可以指定提交哈希查看特定提交的详细信息。
基本用法:
bash
git show
此命令会展示最新一次提交的详细内容。
指定提交:
bash
git show <commit-hash>
常用参数:
-
--name-only
:仅显示提交中修改的文件列表。bashgit show --name-only <commit-hash>
-
--stat
:显示提交的统计信息(每个文件的增加和删除行数)。bashgit show --stat <commit-hash>
示例:
bash
git show 9b0f5a2
输出内容包括提交的摘要信息和具体的代码差异。git show
是查看单个提交内容的最佳工具,适合快速了解每次提交的变动。
2. 查看差异:git diff
git diff
用于查看工作区或暂存区与最后一次提交之间的差异,也可以用来比较两个分支、两个提交之间的差异。git diff
是开发者查看代码变动的重要工具,尤其在提交前检查更改是否符合预期。
基本用法:
-
查看工作区的更改(相对于上一次提交的差异):
bashgit diff
-
查看暂存区与上次提交的差异:
bashgit diff --cached
-
查看工作区与暂存区的差异:
bashgit diff HEAD
比较不同分支或提交:
-
比较两个分支:
bashgit diff branch1 branch2
-
比较两个提交:
bashgit diff <commit1> <commit2>
常用参数:
-
--name-only
:只显示差异的文件列表,不显示具体代码。bashgit diff --name-only
-
--stat
:显示差异的统计信息(修改的文件、增加和删除的行数)。bashgit diff --stat
示例:
-
查看当前工作区和上次提交的差异:
bashgit diff
-
比较两个提交之间的差异:
bashgit diff abc1234 xyz5678
3. 查看提交历史:git log
git log
用于查看提交历史,帮助开发者回顾项目的变更记录。git log
会列出从最近到最早的所有提交记录,每条记录包含提交哈希、提交人、提交时间和提交信息。
基本用法:
bash
git log
常用参数:
-
--oneline
:每次提交仅显示一行,简化显示内容。bashgit log --oneline
-
--graph
:以图形方式展示分支和合并情况,方便查看分支的演变。bashgit log --graph
-
--all
:显示所有分支的提交历史(包括远程分支)。bashgit log --all
-
组合参数 :
--graph --oneline --all
组合使用,以图形方式展示所有分支的历史记录。bashgit log --graph --oneline --all
-
-p
:显示每次提交的具体代码差异。bashgit log -p
-
--stat
:显示每次提交的文件修改统计。bashgit log --stat
示例:
-
查看简化的提交历史:
bashgit log --oneline
-
图形方式查看提交历史:
bashgit log --graph --oneline --all
-
查看特定文件的提交历史:
bashgit log -- filename.txt
示例操作流程
-
查看最近一次提交的详细信息:
bashgit show
-
检查本地修改与上次提交的差异:
bashgit diff
-
查看项目提交历史,图形化展示分支和合并情况:
bashgit log --graph --oneline --all
小结
git show
:查看某次提交的详细内容,适合查看单个提交的代码变更。git diff
:比较不同提交或分支的代码差异,适合提交前检查代码变动。git log
:查看提交历史,帮助追踪项目的历史记录和分支合并情况。
标签管理
在 Git 中,标签(Tag)是一种特殊的标记,用于标识特定的提交版本。标签通常用于为代码的关键版本(如发布版、里程碑)创建一个永久的记录。标签可以帮助开发者快速找到项目的某个重要版本,便于回溯或重新部署。Git 中的标签有轻量标签(Lightweight)和注释标签(Annotated)两种。
什么时候需要打标签?
标签通常用于以下场景:
- 版本发布:在发布一个新版本时,可以在主分支上打上标签,以方便后续查找和回溯。
- 里程碑:当项目达到某个重要的进展阶段(如完成某个重大功能)时,可以打标签记录当前版本。
- 回溯参考:为特定的修复点或优化点打标签,便于后续对比和参考。
1. 创建标签:git tag <tag-name>
创建标签的命令是 git tag
,默认会创建一个轻量标签(Lightweight Tag),直接将标签指向当前的提交记录。标签名应具有标识性,通常以版本号格式命名(如 v1.0
、v2.1.3
)。
示例命令:
-
创建轻量标签:
bashgit tag v1.0
-
创建带注释的标签(推荐):注释标签包含标签的创建者、日期和说明信息。
bashgit tag -a v1.0 -m "Release version 1.0"
-
指定某个提交创建标签:
bashgit tag v1.0 <commit-hash>
注 :推荐使用带注释的标签 -a
,因为注释标签包含更多信息,便于日后查阅。
2. 推送标签到远程仓库:git push origin <tag-name>
本地创建的标签不会自动推送到远程仓库。若希望与团队共享某个标签,可以将标签推送到远程仓库。
示例命令:
-
推送单个标签:
bashgit push origin v1.0
-
推送所有标签:
bashgit push --tags
适用场景:在发布新版本或重要里程碑时,将标签推送到远程仓库,方便团队成员查看和使用。
3. 删除标签
有时,可能会需要删除不再使用或错误的标签。Git 支持在本地和远程仓库分别删除标签。
-
删除本地标签 :使用
git tag -d
删除本地标签记录。示例命令:
bashgit tag -d v1.0
-
删除远程标签:远程标签需要通过推送空标签来删除。
示例命令:
bashgit push origin :refs/tags/v1.0
注意:在多人协作项目中,删除远程标签需谨慎,避免删除关键版本标记。
示例操作流程
-
在发布新版本时,创建带注释的标签:
bashgit tag -a v1.1 -m "Release version 1.1 with new features"
-
将标签推送到远程仓库,以便团队成员查阅:
bashgit push origin v1.1
-
查看所有标签:
bashgit tag
-
删除错误的本地标签:
bashgit tag -d v1.1
-
删除远程标签:
bashgit push origin :refs/tags/v1.1
小结
git tag <tag-name>
:创建标签,用于标记关键版本。git tag -a <tag-name> -m <message>
:创建带注释的标签,推荐用于版本管理。git push origin <tag-name>
:将标签推送到远程仓库,便于团队共享。git tag -d <tag-name>
和git push origin :refs/tags/<tag-name>
:分别删除本地和远程标签。
总结
Git 提供了灵活的版本控制功能,通过分支管理、提交历史查看、合并与冲突解决、标签管理等命令,开发者可以轻松在团队中协作、跟踪代码变更,并快速发布新版本。掌握 Git 的核心命令和工作流程,能够提升代码管理效率,保证项目的稳定和可追溯性。
Git 命令速查表
操作 | 命令 | 说明 |
---|---|---|
初始化仓库 | git init |
初始化一个新的 Git 仓库 |
克隆仓库 | git clone <repository-url> |
克隆现有的远程仓库到本地 |
配置用户信息 | git config --global user.name "Your Name" git config --global user.email "your.email@example.com" |
设置全局用户名和邮箱 |
创建分支 | git branch <branch-name> |
创建一个新的分支 |
切换分支 | git checkout <branch-name> |
切换到指定分支 |
创建并切换分支 | git checkout -b <branch-name> |
创建并切换到新的分支 |
查看分支 | git branch -a |
查看所有分支(包括远程分支) |
添加文件到暂存区 | git add <file> |
将文件添加到暂存区 |
查看暂存状态 | git status |
查看工作区和暂存区状态 |
提交更改 | git commit -m "message" |
提交暂存区的更改 |
修改最近的提交 | git commit --amend |
修改上一次提交 |
合并分支 | git merge <branch-name> |
合并指定分支到当前分支 |
选择性合并提交 | git cherry-pick <commit-hash> |
将特定提交应用到当前分支 |
查看提交历史 | git log |
查看完整的提交历史 |
简洁查看提交历史 | git log --oneline --graph --all |
简化和图形化显示所有分支的提交历史 |
查看单个提交 | git show <commit-hash> |
查看特定提交的详细信息 |
查看差异 | git diff |
查看工作区和暂存区的差异 |
比较两个分支 | git diff branch1 branch2 |
比较两个分支之间的差异 |
创建标签 | git tag <tag-name> |
创建轻量标签 |
创建注释标签 | git tag -a <tag-name> -m "message" |
创建带注释的标签,包含更多信息 |
推送标签 | git push origin <tag-name> |
推送指定标签到远程仓库 |
推送所有标签 | git push --tags |
推送本地的所有标签到远程仓库 |
删除本地标签 | git tag -d <tag-name> |
删除本地标签 |
删除远程标签 | git push origin :refs/tags/<tag-name> |
删除远程仓库中的标签 |
保存更改到暂存区 | git stash |
将当前工作区的修改暂存 |
查看暂存列表 | git stash list |
查看所有暂存的更改记录 |
恢复最近的暂存 | git stash pop |
恢复并删除最近的暂存更改 |
恢复指定暂存 | git stash apply stash@{index} |
应用指定的暂存更改,但不删除 |
推送分支到远程 | git push origin <branch-name> |
将当前分支推送到远程仓库 |
拉取并合并远程更新 | git pull |
获取远程更改并合并到当前分支 |
仅获取远程更新 | git fetch |
从远程仓库获取更新,不合并到当前分支 |
撤销提交历史 | git reset --soft <commit-hash> git reset --mixed <commit-hash> git reset --hard <commit-hash> |
回退到指定提交,保留更改或丢弃所有更改 |
回滚指定提交 | git revert <commit-hash> |
创建一个新的提交来撤销指定提交 |
资源链接和进一步学习
- Git 官方文档 :Git Documentation
- GitHub 官方教程 :GitHub Guides
- Pro Git(免费电子书) :Pro Git Book
上面就是本篇文章总结的有关工作中常用到的Git 相关操作命令 虽然现在我们开发大多数都是适用开发软件进行Git操作的 但是基本的Git命令还是要了解的。面试问的一般会比较多哈。