一、git介绍
Git 是一个开源的分布式版本控制系统,旨在提供一个快速、灵活且分布式的版本控制系统,能够处理从小型个人项目到大型复杂企业项目的各种规模的开发工作。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, SVN 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。程序员在自己的电脑上编写代码,并通过 git 管理。
二、基本操作
2.1、基础操作
1、配置我们的全局
配置用户名和邮箱:这些信息将用于标识每次提交
git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
-
Your Name
应该是一个有效的名字,通常是你希望在你的 Git 提交中显示的名字。 -
your_email@example.com
应该是一个有效的电子邮件地址,这个地址通常用于在 Git 提交中标识你的身份,并且也是一些 Git 服务(如 GitHub、GitLab 等)用来联系你的主要方式。 - 重复使用这两命令可以覆盖,相当于修改操作
设置Git默认使用的文本编辑器, 一般可能会是 vi 或者 vim
git config --global core.editor vim
查看
git config --list
如果使用 --global 选项,那么配置的用户信息会保存在当前用户家目录下的 .gitconfig 文件里, 以后所有的项目都会默认使用此用户信息。
cat ~/.gitconfig
2、
①、如果你需要创建一个项目(当项目不存在的话)
可以在本地创建一个空文件夹作为仓库目录,并且初始化
mkdir /root/myweb
cd !$
!$代表上一个使用的参数
git init
初始化一个新的 Git 仓库,这将创建一个名为.git
的隐藏文件夹,用于管理仓库的版本和历史记录,代表成立了本地的仓库。
②、如果不需要你创建一个项目(当项目存在的话)
git clone git@xxxx.git
查看
ls -A隐藏目录 有git
3、你需要了解工作流程
工作区(Working Directory)
工作区是用户与代码直接交互的地方,也就是你本地计算机上的项目文件夹。这是你实际编辑文件、编写代码的地方。
暂存区(Stage/Index)
是一个临时的存储区域,用于保存将要提交的更改。可以理解为一个缓冲区,你可以选择性地将工作区中的某些或全部更改放入暂存区,随后再提交到版本库。暂存区记录的是工作区中已被标记为准备提交的更改。
远程仓库(Remote Directory)
远程仓库是托管代码的服务器,可以简单地认为是你项目组中的一台电脑用于远程数据交换。远程仓库允许团队成员共享和协作编辑代码,是团队协作不可或缺的一部分。
4、上传到缓存区
创建一个文件
touch 文件
git add 文件
git add .
git add *
命令 | 描述 |
---|---|
git add <file> |
将指定的文件 <file> 添加到暂存区。这允许您精确地选择哪些文件应该被包含在下一次提交中。 |
git add . |
添加当前目录(包括所有子目录)下所有更改的文件到暂存区。这是一个常用的命令,用于快速添加当前工作目录中的所有改动。 |
git add * |
只会添加当前目录下的文件和目录(不会递归地添加到子目录) |
查看暂缓区的文件
git ls-files
5、提交更改
git commit -m "commit message"
提交暂存区内容到本地仓库,附加提交信息。
git commit -a -m "commit message"
自动将已跟踪的文件(修改和删除)加入暂存区并提交,也就是使用 -a
选项可以省去手动运行 git add
命令将更改添加到暂存区的步骤
6、在本地我们能看到三种状态
工作区
- 未跟踪(Untracked):文件未被Git管理,需通过git add添加到暂存区。
- 已修改(Modified):文件已被修改,但更改尚未保存到暂存区。
暂存区
- 已暂存(Staged):文件或更改已被添加到暂存区,准备提交。
7、查看 git 状态
查看当前仓库状态,显示修改的文件和未跟踪的文件
git status
用于快速查看工作目录和暂存区的状态
git status -s
- A:表示文件已被添加到暂存区(Added),准备提交。对于新文件,这是它们首次出现在 Git 跟踪中的状态。
- M:表示文件在工作目录中被修改(Modified),但尚未添加到暂存区。
- D:表示文件在工作目录中被删除(Deleted),但尚未从暂存区中删除。如果文件已从工作目录和暂存区中删除,则不会显示在此输出中。
- R:表示文件被重命名(Renamed)。
- C:表示文件被复制(Copied),这通常与重命名相关,但 Git 能够检测到文件内容的复制。
- ??:表示文件是未跟踪的(Untracked),即文件存在于工作目录中,但尚未被 Git 跟踪。
- U:表示文件在工作目录和暂存区之间存在冲突(Unmerged),这通常发生在合并或变基操作后,文件的内容无法自动合并。
-
M(在暂存区后):如果文件已经添加到暂存区,并且之后在工作目录中被进一步修改,则会在暂存区状态旁边再次显示
M
,表示有额外的修改未暂存
显示工作目录和暂存区之间的不同
git diff
8、查看历史
查看提交历史
git log
会看到commit的内容
简洁模式查看提交历史(每行一个提交)
git log --oneline
图形化显示提交历史
git log --graph
9、撤销更改
不想上传某个文件,从暂存区移除指定文件,但保留工作目录中的更改。
但是commit加过信息的不行
git reset <file>
这个命令只影响工作目录中的文件,不会影响暂存区(stage area)或仓库中的历史记录
丢弃指定文件的工作目录更改,恢复为上一次提交状态
git checkout -- <file>
在git add后,也就放在缓存后,比如删除,或者修改工作目录后,使用会恢复
反转某次提交,生成一个新的反向提交
git revert <commit>
使用 git revert
的好处是,它提供了一种安全的方式来撤销更改,而不会破坏项目的历史记录
<commit>
应该被替换为你想撤销的提交的哈希值(通常是提交的前几个字符,足以唯一标识该提交)。这个命令会生成一个新的提交,其内容是将指定提交所做的更改反向应用。
-
git revert
是安全的撤销操作方式,因为它保留了项目的完整历史。如果你不确定是否应该使用git revert
还是git reset
,通常git revert
是更保守、更安全的选择。
删除了hash的操作,包括工作目录和暂缓区以及版本库,但是有历史记录
2.2、分支操作
1、查看
查看本地分支
git branch
这个命令用于列出所有本地分支。
查看远程分支
git branch -r
-a是远程和本地所有的
2、创建并且切换
git checkout -b <branch_name>
这是一个非常方便的命令,它结合了git branch
和git checkout
的功能。这个命令首先会创建一个新的分支,然后立即切换到这个新分支上。<branch_name>
同样是你想要创建的(并切换到的)分支的名称。
①、创建
git branch <branch_name>
②、切换
git checkout <branch_name>
3、删除
删除一个本地分支
git branch -d <branch_name>
git branch -D <branch_name>
命令来强制删除分支,不推荐
4、重命名分支
git branch -m <new_branch_name>
5、合并分支
git merge <branch_name>
要合并一个分支到当前分支,你可以使用命令。Git会尝试将指定分支的更改合并到当前分支中。如果存在冲突,你需要手动解决这些冲突,然后提交合并结果。
2.3、远程操作
1、查看远程仓库的 URL
git remote -v
(fetch)
和 (push)
:这些括号内的文字说明了该远程仓库的 URL 是用于获取(fetch,即拉取更新)还是推送(push,即上传更改)操作。
2、添加远程仓库
git remote add <name> <url>
-
<name>
:这是你为远程仓库指定的名称。这个名字是你在本地用来引用远程仓库的简短标识符。通常,默认的远程仓库名称是origin
,但你可以根据需要命名为其他任何名字。
3、拉取和推送
推送本地分支到远程仓库。
git push <remote> <branch>
-
<remote>
:这个参数指定了你要推送更改到的远程仓库的名称。通常,Git 在克隆一个仓库时会默认创建一个名为origin
的远程仓库引用,指向你克隆的原始仓库。因此,最常见的<remote>
值是origin
。但是,如果你添加了其他远程仓库,你也可以使用它们的名称。 -
<branch>
:这个参数指定了你想要推送的分支的名称。Git 会将这个分支上的更改推送到远程仓库中对应的分支上。例如,如果你正在main
分支上工作,并且想要将这些更改推送到远程仓库的main
分支上,你就应该使用main
作为<branch>
参数。
注意
当你使用 -u
或 --set-upstream
选项时,Git 会将本地分支与远程分支之间建立一种“上游”(upstream)关系。这意味着:
- 将来你在这个本地分支上工作时,可以使用
git pull
命令而不需要指定远程分支的名称,因为 Git 已经知道应该从哪里拉取更改。 - 同样地,当你使用
git push
命令时,也不需要指定远程分支的名称,Git 会自动知道应该将更改推送到哪个远程分支。
这种上游关系使得与远程分支的交互变得更加简单和直观。
①、git push --all
推送所有分支到远程仓库。
②、git push --tags
推送所有标签到远程仓库。
A、从远程仓库获取更新,但不合并
git fetch <remote>
B、拉取远程分支并合并到当前分支
git pull <remote> <branch>
git pull
命令则是一个更高级别的命令,它实际上是 git fetch
和 git merge
的组合
-u之后不需要写remote远程仓库和branch远程分支
-
git fetch
只负责下载远程仓库的更改,不会尝试合并它们。 -
git pull
既下载远程仓库的更改,又尝试将它们合并到你当前检出的分支中。
4、克隆仓库
git clone <url>
克隆远程仓库到本地
2.4、标签操作
1、创建标签
git tag <tag_name>
创建一个带注释的标签。
git tag -a <tag_name> -m "message"
2、查看标签 ,列出所有标签
git tag
显示指定标签的详细信息。
git show <tag_name>
3、推送标签
推送指定标签到远程仓库。
git push <remote> <tag_name>
推送所有标签到远程仓库
git push --tags
4、删除标签
删除本地标签
git tag -d <tag_name>
删除远程标签
git push <remote> :refs/tags/<tag_name>
三、总图
四、其他常用命令
4.1、清理
删除未跟踪的文件
git clean -f
删除未跟踪的文件和目录
git clean -fd
4.2、查看仓库信息
查看远程仓库的详细信息
git remote show <remote>
查看远程分支
git branch -r
4.3、设置忽略文件
创建 `.gitignore` 文件并根据需要忽略的文件规则。
# 忽略 node_modules 目录(Node.js 项目)
node_modules/
# 忽略 package-lock.json 或 yarn.lock 文件(Node.js 项目)
package-lock.json
yarn.lock
# 忽略编译生成的文件和目录
dist/
build/
out/
# 忽略环境配置文件(例如 .env 文件)
.env
.env.*
# 忽略操作系统生成的文件
.DS_Store
Thumbs.db
# 忽略日志文件
*.log
# 忽略测试报告文件
*.xml
*.out
*.report
# 忽略开发工具生成的文件和目录
.idea/
*.iml
.vscode/
*.suo
*.sln
*.csproj
*.userprefs
# 忽略临时文件
*.tmp
*.swp
*.bak
*.old
# 忽略依赖管理工具的文件(例如 Composer、Bundler 等)
composer.lock
Gemfile.lock
vendor/
# 忽略数据库文件
*.sqlite3
*.db
# 忽略二进制文件(例如图片、视频等,可以根据需要调整)
*.png
*.jpg
*.jpeg
*.gif
*.mp4
*.mov
*.avi
# 忽略操作系统特定的隐藏文件
.*
# 忽略特定的 IDE 或编辑器配置文件
.project
.classpath
*.sublime-project
*.sublime-workspace
# 忽略 Docker 生成的文件
.dockerignore
Dockerfile*
docker-compose*
# 忽略其他可能不希望提交的文件或目录
*.secret
*.key
*.cert
4.4、压缩与优化
清理并优化仓库
git gc
4.5、查看文件版本
查看指定提交中某个文件的内容。
git show <commit>:<file>
五、高级操作
5.1、Stash 操作
将当前未提交的更改保存到临时栈
git stash
查看所有存储的更改。
git stash list
恢复最近一次保存的更改
git stash apply
删除最近一次保存的更改。
git stash drop
5.2、子模块
添加子模块
git submodule add <url> <path>
初始化并更新子模块
git submodule update --init
5.3、打包仓库
创建一个包含主分支的包
git bundle create <file> HEAD master
验证包的内容
git bundle verify <file>
从包中克隆仓库
git clone <file> --bare
5.3、交互式 Rebase
启动交互式 Rebase,可以重新排列、合并或删除提交
git rebase -i <commit>
六、基本操作深入解析
以下是对上述 Git 操作的整理
Git 基础操作
初始化仓库
在本地创建一个全新的项目,并需要版本控制。
注意:会生成 `.git` 文件夹,这是 Git 仓库的核心
git init |
在当前目录创建一个新的 Git 仓库,生成 .git
文件夹。
查看状态
git status |
显示当前工作目录和暂存区的状态,包括哪些文件被修改、未跟踪或已暂存。
深入解析
- 检测哪些文件被修改、未跟踪或已暂存。
- 通常用于在 `git add` 和 `git commit` 之前检查当前状态。
**典型输出**:
```plaintext
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
modified: index.html
Untracked files:
(use "git add <file>..." to include in what will be committed)
newfile.txt
```
- **Untracked files**:未被 Git 追踪的文件。未标记的文件
- **Changes not staged for commit**:已被 Git 追踪,但修改未暂存的文件。
-
添加文件到暂存区
git add <file>
git add .
- 只会将更改放入暂存区,不会直接提交。
- 忽略文件需要在 `.gitignore` 文件中配置。 -
提交更改
将暂存区的更改提交到本地仓库,并附上提交信息。git commit -m "message"
- 每次提交会生成一个独一无二的 SHA-1 哈希值,便于追踪。
- `-m "message"`:直接添加提交信息。
- 不添加 `-m` 时,会打开默认编辑器(如 `vim`)编辑提交信息。
分支操作
创建与切换分支
git branch <branch_name> |
git checkout <branch_name> |
git checkout -b <branch_name> |
创建新分支(不切换)、切换到指定分支、创建并切换到新分支。
深入解析:
**分支管理最佳实践**:
- 使用描述性分支名称,如 `feature/add-login` 或 `bugfix/fix-typo`。
- 避免直接在 `master` 或 `main` 分支上开发。
-
合并分支
将指定分支的更改合并到当前分支,可能需要解决冲突。git merge <branch_name>
深入解析:
- 合并过程可能产生冲突,需要手动解决。**冲突解决流程**:
1. 打开冲突文件(通常标记为 `<<<<` 和 `>>>>`)。
2. 手动选择需要保留的更改。
3. 使用以下命令标记冲突已解决:
```bash
git add <file>
```
4. 完成合并:
```bash
git commit
``` -
删除分支
git branch -d <branch_name>
git branch -D <branch_name>
- `-d`:安全删除,检查是否已合并。
- `-D`:强制删除,忽略检查。
远程操作
管理远程仓库
git remote add origin <url> |
git remote -v |
git remote remove origin |
添加、查看和删除远程仓库。
深入解析:
- 远程仓库可以有多个别名(如 `origin`、`backup`)。
- 使用 `git remote -v` 检查关联的远程仓库。
-
拉取和推送代码
git pull <remote> <branch>
git push <remote> <branch>
git push -u origin <branch>
- 如果分支未与远程分支关联,需指定分支:
```bash
git push -u origin <branch>
```
- `-u`:将当前分支与远程分支关联,后续可直接使用 `git push`。 -
克隆仓库
git clone <url>
git clone --depth=1 <url>
深入解析:
- 克隆时会自动设置 `origin` 为默认远程仓库。
- 使用 `--depth=1` 克隆时,只下载最新一次提交。
高级功能
-
标签管理
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 apply
git stash drop
- **`git stash`**:保存当前更改到栈中。
- **`git stash apply`**:应用最近一次存储的更改。
- **`git stash drop`**:删除最近一次存储。 -
交互式 Rebase
清理提交历史,合并或重新排列提交。**深入解析**:git rebase -i <commit>
- 使用 `pick` 保留提交。
- 使用 `squash` 合并提交。
- Rebase 会重新生成提交历史,适合代码整理。 -
查看远程状态
检查远程仓库的分支和提交情况。git remote show origin
-
清理未跟踪文件
git clean -f
git clean -fd
提高效率的技巧
-
配置别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm commit
git config --global alias.st status
-
忽略文件 创建
.gitignore
文件,添加规则以忽略不需要跟踪的文件和目录。 -
查看文件变更历史
查看指定文件的修改记录。git log -- <file>