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

Git 常用命令与开发流程总结
引言 在我之前面试过程中,经常会问到关于公司使用什么代码版本管理工具。 无非是考察咱们是否用过 Git和SVN。 现在公司选择的工具直接影响到项目的开发流程和协作效率。当前市面上,Git 和 SVN(Subversion)是两种流行的版本控制系…...

链表中插入新的节点
/* 节点结构体定义 */ struct xLIST_ITEM {TickType_t xItemValue; /* 辅助值,用于帮助节点做顺序排列 */ struct xLIST_ITEM * pxNext; /* 指向链表下一个节点 */ struct xLIST_ITEM * pxPrevious; /* 指向链表前一个节点 */ void * pvOw…...

AUTOSAR从入门到精通-BswM模块(二)
目录 前言 算法原理 BswM接口端口 BswM功能描述 模式仲裁 仲裁规则(Arbitration Rules) 模式仲裁来源 模式仲裁过程 模式条件(ModeCondition) 逻辑表达式(LogicExpressions) 模式控制 模式处理 操作执行 模式控制过程 模式控制基本流程 BswM Interfaces and …...

Spring DispatcherServlet详解
文章目录 Spring DispatcherServlet详解一、引言二、DispatcherServlet的初始化与工作流程1、DispatcherServlet的初始化1.1、加载配置和建立WebApplicationContext1.2、初始化策略 2、DispatcherServlet的工作流程2.1、请求分发2.2、代码示例 三、总结 Spring DispatcherServl…...

JS | 软件制作的流程是什么?
目录 一、 需求分析 二、 系统设计 三、 编码实现 四、 测试验证 五、 部署上线 六、 维护更新 软件制作的流程主要包含需求分析、系统设计、编码实现、测试验证、部署上线和维护更新。其中,需求分析是基础,它决定了软件的功能和性能;通…...

简单工厂模式
引言 简单工厂模式并不属于23种设计模式,它是工厂方法模式的“小弟”,由于日常编程中大家会经常用到,只不过没有察觉,因此下文将详解简单工厂模式。 1.概念 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(…...

【django】Django REST Framework 序列化与反序列化详解
目录 1、什么是序列化和反序列化? 2、Django REST Framework中的序列化和反序列化 3、安装与配置(第10章是从零开始) 3.1 安装 3.2 配置 4、基本使用 4.1 创建序列化器 4.2 使用序列化器(将数据序列化返回给前端ÿ…...

【Golang】Golang的Map的线程安全问题
文章目录 前言一、场景介绍二、线程安全的Map的使用四、总结 前言 在 Golang 编程中,map 是一种常用的数据结构,用于存储键值对。然而,Golang 的 map 在并发访问时是线程不安全的。如果多个 goroutine 同时读写同一个 map,可能会…...

指向指针的指针+ 值传递的理解
//17、下面的程序会出现什么结果 #include #include void getmemory(char *p) { p(char *) malloc(100); strcpy(p,”hello world”); } int main( ) { char *strNULL; getmemory(str); printf(“%s/n”,str); free(str); return 0; } // 程序崩溃,…...

CSS常用定位
一、relative 相对原先的位置进行定位 {position: relative;left: 50px; /* 相对原先位置左边的距离 */top: 100px; /* 相对原先位置上边的距离 */ } 二、absolute 绝对定位,是相对于最近有定位的父级元素进行定位 {position: absolute;righ…...

【Linux】从零开始使用多路转接IO --- select
碌碌无为,则余生太长; 欲有所为,则人生苦短。 --- 中岛敦 《山月记》--- 从零开始认识五种IO模型 1 前言2 认识多路转接select3 多路转接select等待连接4 完善代码5 总结 1 前言 上一篇文章我们讲解了五种IO模型的基本概念,并…...

ArcGIS Pro SDK (二十一)渲染
ArcGIS Pro SDK (二十一)渲染 文章目录 ArcGIS Pro SDK (二十一)渲染1 定义唯一值呈现器定义2 为最新观测值设置唯一值渲染器3 为先前的观测值设置唯一值渲染器4 设置简单的渲染器以绘制轨迹线5 检查先前的观测值和轨道线可见性6 使轨迹线和先前的观测点可见7 检索当前观测…...

FPGA在物联网边缘计算中的应用!!!
FPGA(现场可编程门阵列)在物联网边缘计算中的应用正变得越来越重要。边缘计算是一种分布式计算架构,它将数据的处理分散到网络的边缘,靠近数据源,而不是集中在数据中心处理。以下是FPGA在物联网边缘计算中的几个关键应…...

【解决】Linux环境中mysqlclient安装失败问题
问题描述 在Linux系统下安装myslclient报异常。系统为Centos 8 使用 pip install mysqlclient 报出下面的异常 error: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit code: 1╰─> [30 lines of output]/bin/sh: pkg…...

✨ Midjourney中文版:创意启航,绘梦无界 ✨
Midjourney AI超强绘画 (原生态系统)用户端:Ai Loadinghttps://www.mjdiscord.com 项目详细介绍飞书文档:Docshttps://ivqklkndl4k.feishu.cn/docx/GRnMdCbcooWkwTx1RU4cZjGVnzb?fromfrom_copylk 🌐 无缝体验,中文定制…...

软件(1)
软件 常考软件 图像软件 Flash 一款二维动画处理软件 photoshop 图像处理界的“巨无霸” ACDSee ACDSee是常用的图片管理编辑软件,尽管也可以支持WAV格式的音频播放, 但目前主要是作为看图软件 音频软件 Winamp Winamp是数字媒体播放的先驱Audition Audi…...

linux perf 环境部署和基本测试(基于Ubuntu20.04)
1,linux 安装perf sudo apt-ge install linux-tools-common sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y 2 补充安装 sudo apt-get install python3-q-text-as-data 3,perf常用命令 larkubuntu:~$ perf usage: perf [--version] [--hel…...

【网络面试篇】HTTP(1)(笔记)——状态码、字段、GET、POST、缓存
目录 一、相关问题 1. HTTP请求常见的状态码和字段? (1)状态码 (2)字段 ① Host 字段 ② Content-length 字段 ③ Connection 字段 ④ Content-Type 字段 ⑤ Content-Encoding 字段 2. GET 和 POST 的区别&a…...

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器
文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…...

SS928V100 ISP常见问题列表
下载链接: https://download.csdn.net/download/quantum7/89948226 1 FAQ 1 1.1 ISP 1 1.1.1 如何解决整体锐度不足 1 1.1.2 如何解决图像发蒙问题,提高通透性 2 1.1.3 如何解决低照度清晰度差 2 1.1.4 如何解决图像清晰度与物体边缘白边和黑边问题…...

AI写诗:自动版大唐宫体诗
大唐学子,手拿一本小卷(类书),从中挑选过去他们(权威)认为好的词来拼接一首诗,此类诗词称作“宫体诗”,在初唐时期甚是流行。 写“宫体诗”的过程有木有那么一丝丝的熟悉?…...

Java复习31(PTA)
sdust-Java-字符串集合求并集 分数 15 全屏浏览 切换布局 作者 张峰 单位 山东科技大学 从键盘接收N个英文字符串(其中不同的字符串数量大于10),从头开始取5个不同的字符串放入一个集合S1,然后接着取5个不同的字符串放入另一个…...

【Linux系列】Linux 系统中的软连接管理
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

@layer(级联层)
在css样式表(文件)中声明layer为样式添加级联层,其意义在于可以使用它重新定义样式的叠层关系. layer后声明的级联层里面的样式将覆盖前声明的级联层里面的相同属性.在级联层外声明的样式会覆盖级联层里面的相同属性样式,同一层级里面的样式冲突,依然按照优先级来计算. 在级联层…...

nginx代理websocket服务
一、nginx代理websocket服务 一)nginx代理ws服务 在nginx中,可以通过proxy_pass指令来代理WebSocket服务。 以下是一个示例配置: map $http_upgrade $connection_upgrade {default upgrade; close; }upstream ws_backend {server 127.0.0.1:…...

第二十七章 Vue异步更新之$nextTick
目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 一、概述 需求:编辑标题, 弹出显示编辑框自动聚焦 1. 点击编辑,显示编辑框 2. 让编辑框,立刻获取焦点 我们常规的思路可能会编写如下代码来实现: 问题:…...

【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】
文章目录 🏳️🌈 1. 导入模块🏳️🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 处理起始时间、结束时间2.4 增加骑行时长区间列2.5 增加骑行里程区间列 🏳️🌈 3. Pyecharts数据可视化3.1 各…...

【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…...

线程相关题(线程池、线程使用、核心线程数的设置)
目录 线程安全的什么情况用?情况下用线程安全的类? 线程池线程方面的优化 线程池调优主要涉及以下几个关键参数。 线程不安全原因? 1. 共享资源访问冲突 2. 缺乏原子操作 3. 内存可见性问题 4. 重排序问题 如何解决线程不安全的问题࿱…...

2181、合并零之间的节点
2181、[中等] 合并零之间的节点 1、问题描述: 给你一个链表的头节点 head ,该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 ,请你将它们之间的所有节点合并成一个节点ÿ…...