介绍
Git 是一个分布式版本控制系统,普遍用于多人协作开发软件项目、数据备份管理等场景。
Git 的主要优势在于它支持分支管理,可以同时进行多个版本开发或合并不同的分支,并且还能够记录文件修改历史,从而更方便地追踪代码更改。此外, Git 还具有强大的协作功能,允许多名开发者在同一 Git 仓库中共同工作,并且还具有快速复制和恢复代码的能力。
在使用 Git 进行版本控制时,通常的工作流程如下:
-
创建仓库:通过 Git init 命令创建一个新的本地仓库,然后使用 add 命令将需要进行版本控制的文件添加到仓库中。
-
提交变更:Git commit 命令会将暂存区中的文件提交到本地仓库中,并且附加一条提交消息,描述这次提交的目的和内容。
-
查看状态:使用 Git status 命令查看当前的代码状态,可以了解当前有哪些修改已经被添加到暂存区或者没有被跟踪。
-
分支管理:使用 Git branch 和 Git checkout 命令创建分支并切换到不同的分支上,以便进行不同的代码开发或者合并操作。
-
合并分支:使用 Git merge 命令将一个分支与当前分支进行合并,这个过程可以让多人协作开发相互独立,并最终整合到同一个版本中。
-
远程推送和拉取:将本地仓库的变更推送至远程仓库,使用 Git push 命令实现;从远程仓库拉取最新内容到本地仓库,使用 Git pull 命令实现。
除此之外,Git 还具有丰富的工具集和插件,如图形化界面、GiHub、GitLab 等等,并且在大型软件项目中也广泛应用,被称为是“分布式版本控制系统中的黄金标准”,在软件行业及其他领域发挥着重要的作用。
仓库操作
以下是 Git 操作仓库的常用的一部分指令,包括指令内容和作用:
- git clone <repository_url>:从远程仓库克隆代码到本地,并自动创建一个与远程仓库同名的目录。例如,git clone https://github.com/user/repo.git 会将 repo.git 仓库克隆到当前目录下并重命名为 repo。
- git init:在当前目录下初始化一个新的 Git 仓库,或将已有的项目转换成 Git 仓库。执行该命令后,Git 将在当前目录下创建一个 .git 目录来存储版本控制所必需的文件。
- git add <file>:将指定文件或目录添加到暂存区,准备提交到本地仓库。
- git commit -m "<commit_message>":将之前添加到暂存区的变更提交到本地仓库。-m 参数可以指定本次提交的说明信息。
- git status:查看当前工作区和暂存区的状态。该命令将列出已修改、已暂存和未跟踪的文件。
- git diff:显示当前工作目录与上次提交之间的差异。使用 -cached 参数可以查看暂存区和最后一次提交之间的差异。
- git log:查看提交历史记录。该命令将列出所有提交的信息,包括提交作者、提交时间和提交说明等。
- git pull:从远程仓库拉取最新代码并合并到本地分支。如果您在进行提交前需要将本地代码更新到最新版本,可以使用该命令。
- git push:将本地的代码推送到远程仓库,以同步代码变更。必须先进行 commit 操作后,在使用 push 命令将本地已提交的修改推送到远端仓库中。
- git branch:列出本地仓库中的所有分支。使用 -a 参数可以显示所有分支,包括远程仓库的分支。
- git checkout <branch_name>:切换到指定的分支并更新工作区中的文件。例如,git checkout main 会将当前分支切换到名为 main 的分支。
- git merge <branch_name>:将指定分支上的变更合并到当前分支。例如,git merge feature-branch 会将名为 feature-branch 的分支合并到当前所在的分支上。
- git remote add origin <repository_url>:将本地仓库关联到一个远程仓库。例如,git remote add origin https://github.com/user/repo.git 将本地代码库与 GitHub 上名为 user/repo 的仓库关联起来,并将此远程仓库注册为名称为 origin 的别名。
- git tag <tag_name>:将当前代码库标记为一个具有指定名称的标签。这通常用于标识重要的版本或里程碑。
- git stash:将未完成的工作暂存,以便在后续操作中再次使用。执行该命令后,Git 将保存未提交的更改并清空工作区和暂存区,方便您在切换分支或其他操作时使用。
安装后的配置
设置git的用户名、邮件地址、文本编辑器,自动存储git的用户名和密码。
# 设置用户名
git config --global user.name "Your Name"
# 设置电子邮件地址
git config --global user.email "your_email@example.com"
# 设置默认文本编辑器
git config --global core.editor vim
#将Git仓库的凭据(访问仓库所需的用户名和密码)存储在本地的磁盘上,避免每次都需要手动输入凭据信息。
git config --global credential.helper stroe
# 查看 Git 的完整配置列表
git config --list
配置重置
# 取消全局设置的凭证 helper。
git config --global --unset credential.helper
# 用于删除已存储在 ~/.git-credentials 文件中的凭证。
git credential-store --erase:
git强制解决冲突
git checkout --ours /path/to/file
git checkout --theirs /path/to/file
git checkout --ours /path/to/file
命令的作用是使用当前分支(即合并目标分支)指定文件 /path/to/file
的版本来进行合并冲突解决。
在 Git 进行合并操作时,如果一个文件存在冲突,该文件将被标记为 “Both Modified” 或者 “Both added” 状态。你可以使用 git status
命令查看当前工作区状态以找到这些文件。
对于标记为冲突的文件,有两种解决方法:
- 使用编辑器手动解决冲突,然后使用
git add
命令将更改添加到暂存区,并使用git commit
提交; - 使用
git checkout
命令将文件恢复为一个版本,并将其添加到暂存区以完成冲突解决。
以上命令中,--ours
标志表示应该使用当前分支中的版本来解决冲突,而不是使用其他分支或合并版本。执行此命令将覆盖本地版本库中的文件版本,还需要使用 git add
和 git commit
将更改提交到本地版本库以完成解决。
举个例子:
# 在进行合并操作时,如果遇到冲突,先运行 git status 命令查看冲突文件的状态
$ git status
On branch mybranch
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
both modified: file.txt
# 使用 git checkout --ours 命令标记文件为解决方案(该命令只更新索引,不改变工作目录中的文件)
$ git checkout --ours file.txt
# 运行 git add 命令将解决后的文件添加到暂存区
$ git add file.txt
# 继续完成合并操作,提交解决后的文件
$ git commit -m "Resolve conflict by choosing our version of file.txt"
git恢复指定文件
git checkout HEAD filename1 filename2
git checkout HEAD filename1 filename2
命令的作用是将指定的文件 filename1
和 filename2
恢复到 HEAD 版本(最新提交版本)的状态。
执行此命令后,Git 会将这两个文件恢复为最新的提交版本,且所有未存储的更改都会被覆盖。而如果你没有指定文件,则为恢复整个工作区至最新版本的状态。
需要注意的是,使用该命令应当谨慎,确保你已经保存了任何修改,并且准备好丢弃这些修改。如果你执行该命令后再次修改了文件,那么 Git 就无法再把它们还原成之前的样子。
为此,推荐在执行前先进行 git status
查看工作区是否有未存储的更改,同时在执行时显式地指定要恢复的文件列表。
git打标签
git tag <tag_name>
命令用于在 Git 代码仓库中打标签,以便在后续需要的时候更方便地找到和使用这个标签。具体来说,它的作用如下:
-
标记特定版本:为某个特定的提交设置一个易于识别的名称,方便后续查找和管理。例如,在发布软件时,可以使用标签来标志某个版本号。
-
定位特定版本:可以使用标签快速定位某个特定版本的代码,并且避免与其他版本产生混淆。这对团队合作、代码审查、问题追踪等方面都非常有用。
-
分支操作辅助:有时还可以使用标签辅助分支操作,例如基于某个标签创建新的预发布分支或者补丁分支等等。
需要注意的是,标签并非像分支一样是动态变化的,而是针对某个提交创建的不可改变的“快照”(或者说“静态”的版本)。因此,不能直接通过标签来进行版本控制等各种修改操作,必须要新建一个分支来进行相关操作。
总之,使用 git tag <tag_name>
命令可以帮助我们更好地管理和使用代码库中的不同版本,提高代码开发和维护的效率。
基于远程分支新建本地分支
基于远程分支新建
git checkout -b master7m origin/master7m
这个指令的作用是在 Git 中创建一个新的分支,并将其命名为 master7m
,同时将当前分支切换到新创建的分支上。在这个指令中,master7m
是新分支的名称,origin/master7m
是新分支基于的参考对象(可以是分支、标签或提交的哈希值)。通过执行这个指令,你可以在当前仓库中创建一个与 origin/master7m
对应的本地分支,并且切换到这个新分支上进行进一步的操作。
基于本地当前分支新建
git checkout -b master7m
这个指令的作用是在 Git 中创建一个新的分支,并将其命名为 master7m
,同时将当前分支切换到新创建的分支上。在这个指令中,master7m
是新分支的名称。通过执行这个指令,你可以在当前仓库中创建一个新的本地分支,并且切换到这个新分支上进行进一步的操作。需要注意的是,如果不提供参考对象(例如 origin/master7m
),则新分支将会以当前所在分支的最新提交作为基础。
以上两个指令的区别
这两个指令的区别在于创建新分支时的基础参考对象。
-
git checkout -b master7m origin/master7m
:此指令将创建一个名为master7m
的新分支,并且以origin/master7m
作为基础参考对象。也就是说,新分支将与origin/master7m
所指向的提交有相同的内容。通常情况下,这种用法适用于从远程仓库拉取代码创建本地分支。 -
git checkout -b master7m
:此指令将创建一个名为master7m
的新分支,但不指定基础参考对象。默认情况下,新分支将以当前所在分支的最新提交作为基础参考对象。这种用法适用于在当前分支的基础上创建新的本地分支。
总结而言,第一个指令明确指定了基础参考对象,而第二个指令则以当前所在分支的最新提交作为基础参考对象。