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

引言

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

    bash 复制代码
    git config user.name "Project Specific Name"
    git config user.email "project.email@example.com"
查看当前配置

要查看已配置的 Git 信息,可以使用以下命令:

bash 复制代码
git config --list

此命令将列出所有配置项,包括用户名、邮箱和其他 Git 选项。

git config 的其他常用配置
  1. 设置默认文本编辑器

    bash 复制代码
    git config --global core.editor "vim"

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

  2. 启用颜色显示

    bash 复制代码
    git config --global color.ui auto

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

  3. 设置 Git 命令别名

    bash 复制代码
    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. 配置默认合并策略

    bash 复制代码
    git config --global merge.ff false

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

  5. 设置推送默认分支

    bash 复制代码
    git 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 的常用参数
  1. 指定克隆到的目录

    bash 复制代码
    git clone <repository-url> <directory>

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

    bash 复制代码
    git clone https://github.com/username/project-name.git my-local-folder

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

  2. 指定分支克隆

    bash 复制代码
    git clone -b <branch-name> <repository-url>

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

    bash 复制代码
    git clone -b develop https://github.com/username/project-name.git

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

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

    bash 复制代码
    git clone --depth <number> <repository-url>

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

    bash 复制代码
    git clone --depth 1 https://github.com/username/project-name.git

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

  4. 单分支克隆

    bash 复制代码
    git clone --single-branch -b <branch-name> <repository-url>

    如果只需要一个特定分支,可以同时使用 --single-branch-b 参数,这样只会下载该分支的内容,而不会包含其他分支信息:

    bash 复制代码
    git clone --single-branch -b feature https://github.com/username/project-name.git

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

  5. 使用 SSH 克隆

    如果在本地配置了 SSH 密钥,可以直接使用 SSH 方式克隆仓库,避免每次输入用户名和密码:

    bash 复制代码
    git clone git@github.com:username/project-name.git

    这种方式更适合团队协作,尤其是频繁推送和拉取的情况。

其他常用选项
  • --mirror :完整地克隆远程仓库,包括所有的引用(refs),用于创建仓库的完整镜像。这种模式会把仓库的所有内容(包括所有分支、标签等)原样复制,不创建工作区。
  • --recursive:当项目中包含子模块(submodules)时,可以使用此参数同时克隆子模块内容,避免手动初始化子模块。
常见示例总结
  • 克隆默认分支到自定义目录:

    bash 复制代码
    git clone https://github.com/username/project-name.git custom-folder
  • 克隆特定分支(如 develop 分支):

    bash 复制代码
    git clone -b develop https://github.com/username/project-name.git
  • 仅获取最近 3 次提交:

    bash 复制代码
    git 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

上述命令会基于当前分支(通常是 mainmaster)创建一个名为 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 命令用于将工作区中的文件添加到暂存区,为后续的提交做准备。可以选择性地添加特定文件或目录,也可以一次性添加所有更改。

示例命令

  • 添加单个文件:

    bash 复制代码
    git add filename.txt
  • 添加当前目录的所有文件和更改(包括新文件和修改):

    bash 复制代码
    git add .
  • 添加所有文件,包括已删除的文件:

    bash 复制代码
    git add -A
  • 交互式添加代码片段(选择性提交文件中的部分更改):

    bash 复制代码
    git add -p
2. 提交更改:git commit

git commit 命令用于将暂存区的更改提交到本地仓库,生成新的提交记录,并附带一条提交信息描述更改内容。提交信息应该清晰、简洁,帮助团队理解更改内容。

示例命令

  • 使用简洁的提交信息提交:

    bash 复制代码
    git commit -m "Add feature XYZ"
  • 如果提交后发现需要补充更改或修改提交信息,可以使用 --amend 参数来修改上一次提交:

    bash 复制代码
    git 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 是非常有用的命令。

示例命令

  • 查看所有提交历史:

    bash 复制代码
    git log
  • 简化显示,按单行输出每个提交:

    bash 复制代码
    git log --oneline
  • 以图形化方式显示提交历史(展示分支和合并情况):

    bash 复制代码
    git log --graph --oneline --all

示例输出

plaintext 复制代码
* 9b0f5a2 Add feature XYZ
* 2f6e45d Fix bug in function ABC
* 7c8e4e1 Initial project setup
5. 查看差异:git diff

git diff 用于查看工作区或暂存区中的差异,帮助确认修改内容。

示例命令

  • 查看工作区的更改:

    bash 复制代码
    git diff
  • 查看暂存区与工作区的差异(显示已暂存的修改):

    bash 复制代码
    git diff --cached
  • 比较两个分支之间的差异:

    bash 复制代码
    git diff branch1 branch2
  • 查看特定提交之间的差异:

    bash 复制代码
    git 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 用于回退到指定的提交,根据参数不同,回退可以保留或删除更改。

  • 软回退(保留工作区和暂存区更改):

    bash 复制代码
    git reset --soft <commit-hash>
  • 混合回退(保留工作区更改,但清除暂存区):

    bash 复制代码
    git reset --mixed <commit-hash>
  • 硬回退(彻底丢弃所有更改):

    bash 复制代码
    git 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 丢弃更改,恢复到最后一次提交的状态。

示例命令

  • 丢弃指定文件的更改:

    bash 复制代码
    git restore filename.txt
  • 丢弃整个目录的修改:

    bash 复制代码
    git restore .

通过以上提交管理和撤销操作的命令,开发者可以有效地管理提交记录,确保提交内容的正确性。合理使用这些命令,有助于保持 Git 提交历史的整洁与一致。


合并和撤销操作管理

在 Git 的使用过程中,合并和撤销操作是团队协作开发中的重要步骤。功能开发完成后,通常需要合并到主分支,而在出现错误时可能需要回退或撤销合并操作。Git 提供了多种命令来满足不同的合并和撤销需求,以下是主要的合并和撤销命令及其适用场景。


合并操作
1. 合并分支:git merge

git merge 命令用于将一个分支的所有提交合并到当前分支。通常在功能开发完成后,用于合并整个分支的更改,是最常用的合并方法。

示例命令

  • 首先切换到主分支:

    bash 复制代码
    git checkout main
  • feature-branch 分支合并到 main

    bash 复制代码
    git merge feature-branch

合并模式

  • 快速合并(Fast-Forward) :如果主分支上没有其他提交,Git 会直接移动分支指针,不生成新的合并提交。
  • 三方合并(Three-Way Merge) :如果主分支上有其他提交,则会生成一个合并提交,包含合并前的所有历史。
2. 选择性合并:git cherry-pick

git cherry-pick 命令用于将指定的单个或多个提交合并到当前分支,适合在功能未完全完成或部分更改已验证的情况下,选择性地合并到主分支。

示例命令

  • 切换到主分支:

    bash 复制代码
    git checkout main
  • feature-branch 中的特定提交 abc1234 应用到 main

    bash 复制代码
    git cherry-pick abc1234

多个提交的 cherry-pick

  • 使用提交区间来选择合并一系列提交:

    bash 复制代码
    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 是合并的提交哈希):

    bash 复制代码
    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 更新了本地的远程分支信息,可以帮助我们了解远程仓库的最新状态,然后选择是否进行合并。

示例命令

bash 复制代码
git fetch origin

此命令会从远程仓库 origin 拉取更新,但不会影响当前分支。

常用参数

  • 指定分支:只拉取某个分支的更新信息:

    bash 复制代码
    git fetch origin main
  • 拉取所有远程分支

    bash 复制代码
    git fetch --all

适用场景 :在提交或推送之前,通过 git fetch 先检查远程仓库是否有更新,然后再选择是否合并这些更新,有助于避免冲突。

2. 拉取并合并远程分支:git pull

git pullgit fetchgit merge 的组合。它先拉取远程更新,然后自动合并到当前分支。使用 git pull 可以快速同步远程分支的最新内容,但如果远程有冲突,可能需要手动解决。

示例命令

  • 基本拉取并合并当前分支的更新:

    bash 复制代码
    git pull origin main

此命令会从远程仓库 origin 中的 main 分支拉取更新,并自动合并到本地的 main 分支。

  • --rebase 参数 :拉取远程更改并使用 rebase 合并,避免产生合并提交,使提交历史更加线性整洁:

    bash 复制代码
    git pull --rebase origin main

适用场景 :当需要立即同步远程仓库的最新更新时,使用 git pull 可以一键完成拉取并合并的过程。不过在多人协作时,建议在拉取之前先使用 git fetch 查看变动,再决定是否需要手动合并,以避免自动合并产生的冲突。

3. 推送本地更改到远程仓库:git push

git push 用于将本地分支的更改推送到远程仓库,便于其他开发者获取。通常在提交、拉取并解决冲突后,使用 git push 将更改同步到远程仓库。第一次推送时,需指定远程分支名称,之后可以简化为 git push

示例命令

  • 将当前分支的更改推送到远程仓库的对应分支:

    bash 复制代码
    git push origin main
  • -u 参数 :指定默认远程跟踪分支,设置后可以直接使用 git push 推送,不再需要每次指定远程分支。

    bash 复制代码
    git push -u origin main
  • 强制推送 :当推送被拒绝时,可以使用 --force 强制推送本地内容覆盖远程分支(慎用,可能会覆盖其他开发者的内容):

    bash 复制代码
    git push --force origin main

适用场景 :当本地开发完成并提交后,使用 git push 将更改同步到远程仓库,确保团队成员能够获取到最新代码。在多人协作时,不推荐使用 --force 推送,避免破坏他人工作。

示例操作流程

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

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

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

    bash 复制代码
    git pull origin main
  3. 推送本地更改到远程 :当本地开发完成并解决冲突后,使用 git push 将更改推送到远程分支。

    bash 复制代码
    git 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. 解决冲突

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

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

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

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

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

    bash 复制代码
    git commit
4. 查看并处理多个冲突

在大型项目中,多个文件可能会产生冲突。可以通过以下命令逐步查看并处理冲突:

  • 查看所有冲突文件

    bash 复制代码
    git status
  • 添加已解决的所有文件

    bash 复制代码
    git add .
  • 完成合并并提交

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

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

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

    bash 复制代码
    git add .
  3. 提交合并更改

    bash 复制代码
    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 后,工作区将变为干净状态,便于进行其他操作。

示例命令

bash 复制代码
git stash

执行此命令后,所有未提交的更改会被暂存到一个栈中,工作区恢复为最新提交的状态。

常用参数

  • 保存特定消息:可以添加备注,方便后续识别暂存内容:

    bash 复制代码
    git stash push -m "WIP: feature A development"
  • 仅暂存未提交的文件

    bash 复制代码
    git 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

示例命令

  • 恢复最近一次暂存的内容(不删除):

    bash 复制代码
    git stash apply
  • 恢复特定的暂存记录(不删除):

    bash 复制代码
    git 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
示例操作流程
  1. 将当前工作区的修改暂存

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

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

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

    bash 复制代码
    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 命令用于查看某次提交的详细信息,包含提交人、提交时间、提交信息以及具体的代码变更。它默认显示最新的提交内容,也可以指定提交哈希查看特定提交的详细信息。

基本用法

bash 复制代码
git show

此命令会展示最新一次提交的详细内容。

指定提交

bash 复制代码
git show <commit-hash>

常用参数

  • --name-only:仅显示提交中修改的文件列表。

    bash 复制代码
    git show --name-only <commit-hash>
  • --stat:显示提交的统计信息(每个文件的增加和删除行数)。

    bash 复制代码
    git show --stat <commit-hash>

示例

bash 复制代码
git show 9b0f5a2

输出内容包括提交的摘要信息和具体的代码差异。git show 是查看单个提交内容的最佳工具,适合快速了解每次提交的变动。

2. 查看差异:git diff

git diff 用于查看工作区或暂存区与最后一次提交之间的差异,也可以用来比较两个分支、两个提交之间的差异。git diff 是开发者查看代码变动的重要工具,尤其在提交前检查更改是否符合预期。

基本用法

  • 查看工作区的更改(相对于上一次提交的差异):

    bash 复制代码
    git diff
  • 查看暂存区与上次提交的差异:

    bash 复制代码
    git diff --cached
  • 查看工作区与暂存区的差异:

    bash 复制代码
    git diff HEAD

比较不同分支或提交

  • 比较两个分支

    bash 复制代码
    git diff branch1 branch2
  • 比较两个提交

    bash 复制代码
    git diff <commit1> <commit2>

常用参数

  • --name-only:只显示差异的文件列表,不显示具体代码。

    bash 复制代码
    git diff --name-only
  • --stat:显示差异的统计信息(修改的文件、增加和删除的行数)。

    bash 复制代码
    git diff --stat

示例

  • 查看当前工作区和上次提交的差异:

    bash 复制代码
    git diff
  • 比较两个提交之间的差异:

    bash 复制代码
    git diff abc1234 xyz5678
3. 查看提交历史:git log

git log 用于查看提交历史,帮助开发者回顾项目的变更记录。git log 会列出从最近到最早的所有提交记录,每条记录包含提交哈希、提交人、提交时间和提交信息。

基本用法

bash 复制代码
git log

常用参数

  • --oneline:每次提交仅显示一行,简化显示内容。

    bash 复制代码
    git log --oneline
  • --graph:以图形方式展示分支和合并情况,方便查看分支的演变。

    bash 复制代码
    git log --graph
  • --all:显示所有分支的提交历史(包括远程分支)。

    bash 复制代码
    git log --all
  • 组合参数--graph --oneline --all 组合使用,以图形方式展示所有分支的历史记录。

    bash 复制代码
    git log --graph --oneline --all
  • -p:显示每次提交的具体代码差异。

    bash 复制代码
    git log -p
  • --stat:显示每次提交的文件修改统计。

    bash 复制代码
    git log --stat

示例

  • 查看简化的提交历史:

    bash 复制代码
    git log --oneline
  • 图形方式查看提交历史:

    bash 复制代码
    git log --graph --oneline --all
  • 查看特定文件的提交历史:

    bash 复制代码
    git log -- filename.txt
示例操作流程
  1. 查看最近一次提交的详细信息

    bash 复制代码
    git show
  2. 检查本地修改与上次提交的差异

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

    bash 复制代码
    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)。

示例命令

  • 创建轻量标签:

    bash 复制代码
    git tag v1.0
  • 创建带注释的标签(推荐):注释标签包含标签的创建者、日期和说明信息。

    bash 复制代码
    git tag -a v1.0 -m "Release version 1.0"
  • 指定某个提交创建标签:

    bash 复制代码
    git tag v1.0 <commit-hash>

:推荐使用带注释的标签 -a,因为注释标签包含更多信息,便于日后查阅。

2. 推送标签到远程仓库:git push origin <tag-name>

本地创建的标签不会自动推送到远程仓库。若希望与团队共享某个标签,可以将标签推送到远程仓库。

示例命令

  • 推送单个标签:

    bash 复制代码
    git push origin v1.0
  • 推送所有标签:

    bash 复制代码
    git push --tags

适用场景:在发布新版本或重要里程碑时,将标签推送到远程仓库,方便团队成员查看和使用。

3. 删除标签

有时,可能会需要删除不再使用或错误的标签。Git 支持在本地和远程仓库分别删除标签。

  • 删除本地标签 :使用 git tag -d 删除本地标签记录。

    示例命令

    bash 复制代码
    git tag -d v1.0
  • 删除远程标签:远程标签需要通过推送空标签来删除。

    示例命令

    bash 复制代码
    git push origin :refs/tags/v1.0

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

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

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

    bash 复制代码
    git push origin v1.1
  3. 查看所有标签

    bash 复制代码
    git tag
  4. 删除错误的本地标签

    bash 复制代码
    git tag -d v1.1
  5. 删除远程标签

    bash 复制代码
    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操作的 但是基本的Git命令还是要了解的。面试问的一般会比较多哈。

相关推荐
Мартин.2 小时前
[Meachines] [Easy] LinkVortex Git leakage+Ghost 5.58+Double Link Bypass权限提升
git
Ase5gqe3 小时前
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
xml·大数据·架构
史嘉庆3 小时前
Pandas 数据分析(二)【股票数据】
大数据·数据分析·pandas
甜到心里的蛋糕4 小时前
github汉化
git·github
唯余木叶下弦声4 小时前
PySpark之金融数据分析(Spark RDD、SQL练习题)
大数据·python·sql·数据分析·spark·pyspark
重生之Java再爱我一次5 小时前
Hadoop集群搭建
大数据·hadoop·分布式
豪越大豪7 小时前
2024年智慧消防一体化安全管控年度回顾与2025年预测
大数据·科技·运维开发
互联网资讯7 小时前
详解共享WiFi小程序怎么弄!
大数据·运维·网络·人工智能·小程序·生活
可涵不会debug8 小时前
【C++】在线五子棋对战项目网页版
linux·服务器·网络·c++·git
AI2AGI8 小时前
天天AI-20250121:全面解读 AI 实践课程:动手学大模型(含PDF课件)
大数据·人工智能·百度·ai·文心一言