Git 是由 Linux 之父 Linus Torvalds 在 2005 年创造的,目的是为了管理 Linux 内核的开发。Git 的设计目标是实现高效的分支和合并,以及对大型项目的快速处理。
安装 Git
要开始使用 Git,你需要先安装 Git 的客户端软件。你可以从官方网站下载适合你的操作系统的安装包,或者使用你的包管理器来安装。例如,在 Windows 系统上,你可以下载并运行 Git for Windows 的安装程序。
安装完成后,你可以使用 git --version
命令来检查 Git 的版本:
bash
git --version
git version 2.33.0.windows.2
配置 Git
在使用 Git 之前,你需要配置一些基本的信息,例如你的用户名和邮箱地址。这些信息会被用来标识你的提交。你可以使用 git config
命令来配置这些信息,例如:
bash
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
这里使用了 --global
选项,表示这些配置是全局的,也就是对所有的仓库都有效。如果你想针对某个仓库进行特定的配置,可以省略 --global
选项,并在该仓库内执行命令。
除了用户名和邮箱地址之外,还有一些其他的配置可以用来调整 Git 的行为,例如 core.editor
(指定默认编辑器),color.ui
(指定是否显示彩色输出),等等。你可以使用 git config --list
命令来查看所有的配置及其值。
创建和克隆仓库
Git 的核心概念之一是仓库(repository),它是一个用来存储和管理代码的目录。一个仓库包含了所有的文件和历史记录,以及一些元数据和配置信息。
要创建一个新的仓库,你可以使用 git init
命令,在当前目录下初始化一个空的仓库:
bash
git init
Initialized empty Git repository in C:/Users/Your Name/Desktop/my-project/.git/
这里会在当前目录下创建一个名为 .git
的隐藏目录,用来存放 Git 的数据结构和对象。如果你想删除这个仓库,只需删除这个目录即可。
要克隆一个已有的仓库,你可以使用 git clone
命令,指定远程仓库的地址,并可选地指定本地目录的名称:
bash
git clone https://github.com/git/git.git
Cloning into 'git'...
remote: Enumerating objects: 315, done.
remote: Counting objects: 100% (315/315), done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 315 (delta 155), reused 215 (delta 112), pack-reused 0
Receiving objects: 100% (315/315), 1.02 MiB | 1.01 MiB/s, done.
Resolving deltas: 100% (155/155), done.
这里会在当前目录下创建一个名为 git
的子目录,并将远程仓库中的所有文件和历史记录复制到该目录中。如果你想指定不同的本地目录名称,可以在命令后面加上该名称,例如:
bash
git clone https://github.com/git/git.git my-git
这样就会在当前目录下创建一个名为 my-git
的子目录,并将远程仓库克隆到该目录中。
添加和提交文件
当你在仓库中创建或修改了一些文件后,你需要将这些变更添加到暂存区(staging area),然后提交到本地仓库(local repository)。暂存区是一个用来保存你即将提交的变更的临时区域,你可以在这里对你的变更进行筛选和组织。
要将文件添加到暂存区,你可以使用 git add
命令,指定文件名或通配符,例如:
bash
git add README.md
git add *.txt
这里会将 README.md
文件和所有以 .txt
结尾的文件添加到暂存区。如果你想将所有的变更都添加到暂存区,可以使用 .
作为参数,例如:
bash
git add .
要将暂存区中的变更提交到本地仓库,你可以使用 git commit
命令,并指定一个提交信息,例如:
bash
git commit -m "Initial commit"
[master (root-commit) 0a1b2c3] Initial commit
2 files changed, 10 insertions(+)
create mode 100644 README.md
create mode 100644 hello.txt
这里会将暂存区中的所有变更提交到本地仓库,并使用 "Initial commit" 作为提交信息。提交信息是一个简短的描述,用来说明这次提交做了什么。一般来说,提交信息应该遵循以下几个原则:
- 使用祈使句,例如 "Fix bug" 而不是 "Fixed bug" 或 "Fixes bug"。
- 第一行应该是总结性的,不超过 50 个字符,后面可以跟一个空行和更详细的说明。
- 避免使用不清楚的缩写或术语,尽量让其他人能够理解你的意图。
- 如果有相关的问题或请求编号,可以在最后一行加上引用,例如 "Fixes #123"。
推送和拉取变更
当你在本地仓库中提交了一些变更后,你可能想要将这些变更推送(push)到远程仓库(remote repository),以便与其他人共享和备份。远程仓库是一个位于网络上的仓库,通常托管在一些平台上,例如 GitHub、GitLab、Gitee 等。
要将本地仓库中的变更推送到远程仓库,你可以使用 git push
命令,并指定远程仓库的名称和分支的名称,例如:
bash
git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 283 bytes | 283.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/yourname/my-project.git
* [new branch] master -> master
这里会将本地仓库中的 master
分支推送到远程仓库 origin
中的 master
分支。origin
是默认的远程仓库名称,如果你想指定不同的名称,可以在克隆或添加远程仓库时指定,例如:
bash
git clone https://github.com/yourname/my-project.git -o upstream
git remote add upstream https://github.com/yourname/my-project.git
这样就会将远程仓库的名称设置为 upstream
。你可以使用 git remote -v
命令来查看当前有哪些远程仓库及其地址。
当你想要从远程仓库获取最新的变更,并合并到本地仓库时,你可以使用 git pull
命令,并指定远程仓库的名称和分支的名称,例如:
bash
git pull origin master
From https://github.com/yourname/my-project
* branch master -> FETCH_HEAD
Updating 0a1b2c3..4d5e6f7
Fast-forward
README.md | 2 +-
hello.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
这里会从远程仓库 origin
中的 master
分支拉取最新的变更,并合并到本地仓库中的 master
分支。如果没有冲突,合并会自动进行。如果有冲突,你需要手动解决冲突,并提交合并结果。
创建和切换分支
Git 的另一个核心概念是分支(branch),它是一个用来标识某个提交及其历史的指针。分支可以让你在不影响主线(master)的情况下,创建一个独立的开发环境,用来实现某个功能或修复某个问题。当你完成了开发后,你可以将分支合并到主线上,或者丢弃分支。
要创建一个新的分支,你可以使用 git branch
命令,并指定分支的名称,例如:
bash
git branch feature-x
这里会创建一个名为 feature-x
的分支,并指向当前的提交。要查看当前有哪些分支,你可以使用 git branch -v
命令:
bash
git branch -v
* master 0a1b2c3 Initial commit
feature-x 0a1b2c3 Initial commit
这里会显示所有的本地分支及其最新的提交信息。当前所在的分支会用一个星号(*)标记。
要切换到另一个分支,你可以使用 git checkout
命令,并指定分支的名称,例如:
bash
git checkout feature-x
Switched to branch 'feature-x'
这里会切换到 feature-x
分支,并将工作目录中的文件更新为该分支的内容。要切换回 master
分支,你可以使用同样的命令:
bash
git checkout master
Switched to branch 'master'
如果你想要创建并切换到一个新的分支,你可以使用 git checkout -b
命令,并指定分支的名称,例如:
bash
git checkout -b feature-y
Switched to a new branch 'feature-y'
这里会创建并切换到一个名为 feature-y
的分支。
合并和变基分支
当你在一个分支上完成了开发后,你可能想要将这个分支合并到另一个分支上,例如将
feature-x
合并到master
。Git 提供了两种方法来实现这个目的:合并(merge)和变基(rebase)。
合并是将两个分支的最新提交及其共同祖先的差异应用到目标分支上,从而创建一个新的提交。例如,如果你想要将 feature-x
合并到 master
,你可以使用以下命令:
bash
git checkout master
git merge feature-x
这里会先切换到 master
分支,然后将 feature-x
分支合并到 master
分支上。如果没有冲突,合并会自动进行,并创建一个新的提交,称为合并提交(merge commit)。如果有冲突,你需要手动解决冲突,并提交合并结果。
变基是将一个分支上的一系列提交重新应用到另一个分支上,从而创建一条线性的历史。例如,如果你想要将 feature-y
变基到 master
,你可以使用以下命令:
bash
git checkout feature-y
git rebase master
这里会先切换到 feature-y
分支,然后将 feature-y
分支上的提交重新应用到 master
分支上。如果没有冲突,变基会自动进行,并创建一些新的提交,称为变基提交(rebase commit)。如果有冲突,你需要手动解决冲突,并继续变基过程。
合并和变基各有优缺点,一般来说,合并可以保留完整的历史信息和分支结构,但可能导致历史复杂和混乱;变基可以保持历史简洁和清晰,但可能导致历史改写和丢失。因此,在选择合并或变基时,需要根据具体的情况和需求来决定。