Git 常用命令与开发流程总结

引言

在我之前面试过程中,经常会问到关于公司使用什么代码版本管理工具。 无非是考察咱们是否用过 Git和SVN。 现在公司选择的工具直接影响到项目的开发流程和协作效率。当前市面上,GitSVN(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 的其他常用配置
  1. 设置默认文本编辑器

    git config --global core.editor "vim"
    

    如果不指定编辑器,Git 默认调用系统编辑器。可以根据个人习惯设置为 vimnanocode(VS Code)等。

  2. 启用颜色显示

    git config --global color.ui auto
    

    启用颜色显示可以让 Git 命令输出更直观,例如 statusdiff 的结果会使用不同颜色来显示状态差异,更便于识别。

  3. 设置 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,更简便易用。

  4. 配置默认合并策略

    git config --global merge.ff false
    

    该配置禁止使用快速合并(fast-forward),从而在合并时保留分支的历史记录,方便后续查阅。

  5. 设置推送默认分支

    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 的常用参数
  1. 指定克隆到的目录

    git clone <repository-url> <directory>
    

    默认情况下,Git 会在当前目录下创建一个与仓库名称相同的文件夹。但如果需要自定义文件夹名称,可以在 URL 后面指定:

    git clone https://github.com/username/project-name.git my-local-folder
    

    上述命令会将仓库克隆到 my-local-folder 文件夹中。

  2. 指定分支克隆

    git clone -b <branch-name> <repository-url>
    

    默认情况下,git clone 会克隆默认分支(通常是 mainmaster 分支)。但可以使用 -b 参数来克隆特定分支:

    git clone -b develop https://github.com/username/project-name.git
    

    这会将远程仓库的 develop 分支克隆到本地。

  3. 浅克隆(仅获取最近的提交)

    git clone --depth <number> <repository-url>
    

    有时仓库的提交历史非常庞大,为了节省时间和空间,可以使用 --depth 参数进行浅克隆,只获取最近的提交。比如:

    git clone --depth 1 https://github.com/username/project-name.git
    

    这会只获取最新的 1 次提交,适合快速查看项目或测试代码。

  4. 单分支克隆

    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
    

    这在需要某个特定功能分支时非常有用,可以减少下载的数据量。

  5. 使用 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

上述命令会基于当前分支(通常是 mainmaster)创建一个名为 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 resetgit 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 表示指定主分支(mainmaster)为合并基础,帮助 Git 识别要撤销的内容。

适用场景git revert 非常适合在远程分支上操作,不会改变历史记录,适合团队协作和远程分支的操作。


合并与撤销的选择
  • 完整合并分支git merge 是合并功能分支的最佳选择,能完整保留分支历史,适合已完成的功能或 Bug 修复。
  • 选择性合并提交git cherry-pick 适合在部分更改已验证的情况下,将特定提交合并到主分支。
  • 撤销本地合并操作git reset 用于撤销本地的合并,直接修改提交历史,适合未推送的提交。
  • 撤销远程合并操作git revert 用于在远程仓库中撤销合并提交,不更改历史记录,确保协作稳定。

同步远程仓库

在团队开发中,为了保持代码的同步性和一致性,常常需要将本地分支与远程仓库进行同步。同步远程仓库前,通常需要先更新本地分支,获取最新的远程分支信息,以确保合并或提交时不会出现冲突。同步的核心命令包括 git fetchgit pullgit 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 pullgit fetchgit 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 推送,避免破坏他人工作。

示例操作流程

在实际的团队协作中,通常的同步流程如下:

  1. 更新远程分支信息:在同步之前,先运行 git fetch 拉取远程仓库的更新,了解远程分支的最新状态。

    git fetch origin
    
  2. 拉取并合并远程更新:如果发现远程分支有更新,需要合并到当前分支,可以使用 git pull 合并更新。

    git pull origin main
    
  3. 推送本地更改到远程:当本地开发完成并解决冲突后,使用 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. 解决冲突

解决冲突时,需要手动编辑冲突文件,选择保留的更改,或者合并两边的代码。可以按以下步骤进行:

  1. 编辑冲突文件:打开冲突的文件,找到冲突标记 (<<<<<<<=======>>>>>>>) 位置,手动选择保留或删除冲突代码块。

    示例:合并两个冲突的版本,手动选择适当的代码,然后删除冲突标记。

    // 解决冲突后
    // 保留的合并代码
    
  2. 添加解决后的文件:解决冲突后,将文件添加到暂存区标记为已解决。

    git add <conflicted-file>
    
  3. 完成合并提交:在所有冲突解决并添加到暂存区后,执行以下命令完成合并。

    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 提交已合并的更改。以下是常见的提交流程:

  1. 解决冲突并保存更改:确保所有冲突文件已保存。

  2. 将解决的文件添加到暂存区

    git add .
    
  3. 提交合并更改

    git commit -m "Resolve merge conflicts and merge branch"
    
小结
  • 冲突解决流程:在合并冲突发生时,先用 git status 查看冲突文件,手动编辑或使用工具解决冲突,然后通过 git addgit 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
示例操作流程
  1. 将当前工作区的修改暂存

    git stash push -m "WIP: Refactoring feature B"
    
  2. 切换到其他分支进行任务处理

    git checkout main
    
  3. 完成任务后,切回原分支并恢复暂存的更改

    git stash pop
    
  4. 查看暂存历史,删除不需要的暂存记录

    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 showgit diffgit 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
    
示例操作流程
  1. 查看最近一次提交的详细信息

    git show
    
  2. 检查本地修改与上次提交的差异

    git diff
    
  3. 查看项目提交历史,图形化展示分支和合并情况

    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.0v2.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
    

注意:在多人协作项目中,删除远程标签需谨慎,避免删除关键版本标记。

示例操作流程
  1. 在发布新版本时,创建带注释的标签

    git tag -a v1.1 -m "Release version 1.1 with new features"
    
  2. 将标签推送到远程仓库,以便团队成员查阅

    git push origin v1.1
    
  3. 查看所有标签

    git tag
    
  4. 删除错误的本地标签

    git tag -d v1.1
    
  5. 删除远程标签

    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命令还是要了解的。面试问的一般会比较多哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/459877.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧用电监控装置:引领0.4kV安全用电新时代

在智能科技日新月异的今天&#xff0c;电力安全与管理正迎来一场前所未有的革新。为0.4kV以下TT、TN系统打造的智慧用电在线监控装置不仅重新定义了电力监控的边界&#xff0c;更为建筑安全用电筑起了一道坚不可摧的防线。 装置集成了单、三相交流电精确测量、四象限电能计量、…

【Linux内核揭秘】深入理解命令行参数和环境变量

文章目录 命令行参数什么是命令行参数main函数的参数 环境变量什么是环境变量常见的环境变量PATHHOMESHELLPWDOLDPWD 本地变量总结 命令行参数 什么是命令行参数 形如这样的命令后面带的选项就是命令行参数。 首先我们要了解一下命令行参数的原理。 我们知道像ls,mkdir,touch等…

leetcode57:插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…

探熵科技|以科技赋能销售,创造卓越业绩。

发展 在当今时代&#xff0c;AI 和大数据技术迅猛发展&#xff0c;各行业与大数据技术的融合已成为推动企业发展的重要力量。 天眼销 探熵科技作为一家专注于商业数据服务的专业公司&#xff0c;始终致力于为企业和个人提供高质量的数据解决方案。我们凭借深厚的技术实力和对…

Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

1 、安装OpenResty 安装使用 OpenResty&#xff0c;这是一个集成了各种 Lua 模块的 Nginx 服务器&#xff0c;是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器&#xff0c;使用Nginx的同时又能使用lua等模块实现复杂的控制。 &#xff08;1&#xff09;安装编译工具…

批量剪辑视频软件源码搭建全解析,支持OEM

一、引言 在当今数字化内容创作的时代&#xff0c;视频制作的需求呈爆发式增长。无论是社交媒体上的短视频创作者&#xff0c;还是专业的视频制作团队&#xff0c;都面临着大量视频剪辑的任务。批量剪辑视频软件应运而生&#xff0c;它能够显著提高视频剪辑的效率&#xff0c;满…

C语言笔记(指针题目)例题+图解

本文分为两部分 &#xff0c;第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析&#xff0c;第二部分是一些笔试题目。若有错误&#xff0c;请批评指正。 目录 1.第一部分 1.1.数组名的使用 1.1.1一维整型数组在sizeof中的使用 1.1.2一维字符数组在sizeof中的使用…

015:地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework安装教程

摘要&#xff1a;本文详细介绍地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework的安装流程。 一、软件介绍 ArcGIS Engine 10.2是由Esri公司开发的一款强大的GIS&#xff08;地理信息系统&#xff09;开发平台。该软件基于ArcGIS 10.2 fo…

华为手机卸载系统应用的方法

摘要&#xff1a; 1.手机环境&#xff1a;手机需要开启开发者模式并使用usb连接电脑&#xff0c;并选择文件传输模式 2.电脑环境&#xff1a;使用鸿蒙工具箱进行傻瓜操作或安装adb工具进行命令卸载 3.鸿蒙工具箱和adb工具本质都是使用adb shell pm uninstall -k --user 0 xx…

大数据中心年度数据运营服务项目实施技术方案(183页WORD)

文档介绍&#xff1a; 本大数据中心年度数据运营服务项目实施技术方案&#xff0c;通过构建高效的数据集成与治理平台、数据分析平台以及创新的数据服务模式&#xff0c;旨在为企业内外部用户提供更加精准、高效的数据支持。同时&#xff0c;注重安全与合规保障&#xff0c;确…

【linux网络编程】| socket套接字 | 实现UDP协议聊天室

前言&#xff1a;本节内容将带友友们实现一个UDP协议的聊天室。 主要原理是客户端发送数据给服务端。 服务端将数据再转发给所有链接服务端的客户端。 所以&#xff0c; 我们主要就是要实现客户端以及服务端的逻辑代码。 那么&#xff0c; 接下来开始我们的学习吧。 ps:本节内容…

TIFS-2024 FIRe2:细粒度表示和重组在换衣行人重识别中的应用

总体结论 本文提出了一种新的细粒度表示与重构&#xff08;FIRe2&#xff09;框架&#xff0c;用于解决布变人重识别问题。通过细粒度特征挖掘和属性重构&#xff0c;FIRe2在不依赖任何辅助信息的情况下&#xff0c;实现了最先进的性能。该方法在多个基准数据集上取得了显著的…

一款专业获取 iOS 设备的 UDID 工具|一键获取iPhone iPad设备的 UDID

什么是UDID&#xff1f; UDID&#xff0c;是iOS设备的一个唯一识别码&#xff0c;每台iOS设备都有一个独一无二的编码&#xff0c;这个编码&#xff0c;我们称之为识别码&#xff0c;也叫做UDID&#xff08; Unique Device Identifier&#xff09; 扫描后系统提示输入密码&am…

HTML--浮动布局练习

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 整个浏览器页…

ES6 变量的解构赋值

数组的解构赋值 对象的解构赋值 字符串的解构赋值

利用游戏引擎的优势

大家好&#xff0c;我是小蜗牛。 在当今快速发展的游戏产业中&#xff0c;选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎&#xff0c;为开发者提供了丰富的工具和资源&#xff0c;使他们能够高效地开发出优秀的游戏。本文将探讨如何…

Python+Selenium+Pytest+POM自动化测试框架封装(完整版)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、测试框架简介 1&#xff09;测试框架的优点 代码复用率高&#xff0c;如果不使用框架的话&#xff0c;代码会显得很冗余。可以组装日志、报告、邮件等一些高…

【鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式教程详解】

鸿蒙HarmonyOS实战&#xff1a;通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程&#xff08;邀请码&#xff09;方式详解 在使用uniapp打包的鸿蒙项目的过程中&#xff0c;由于生成的是app文件&#xff0c;而hdc传给鸿蒙HarmonyOS系统需要的是hap文…

【Apache Zookeeper】

一、简介 1、场景 如何让⼀个应⽤中多个独⽴的程序协同⼯作是⼀件⾮常困难的事情。开发这样的应⽤&#xff0c;很容易让很多开发⼈员陷⼊如何使多个程序协同⼯作的逻辑中&#xff0c;最后导致没有时间更好地思考和实现他们⾃⼰的应⽤程序逻辑&#xff1b;又或者开发⼈员对协同…

名词(术语)了解--SSR/CSR

名词&#xff08;术语&#xff09;了解–SSR/CSR 什么是服务器端渲染(SSR)? 服务器端渲染是指由服务器生成完整的 HTML 页面&#xff0c;然后发送给客户端的过程。 这与客户端渲染&#xff08;CSR&#xff09;形成对比&#xff0c;后者主要依赖浏览器端的 JavaScript 来渲染…