本文对开发中git的常用概念和操作做一个总结。参考@绿毛鸭子的部分内容。
git分布式的体现
1.本地完整的版本库:
每个克隆下来的 Git 仓库都包含了项目的所有历史记录、提交、分支等信息。这意味着每个开发者的本地仓库是一个完整的版本控制系统,包括了整个项目的历史,不仅仅是当前的工作副本。即使不连接到中央服务器,开发者依然可以执行几乎所有的 Git 操作(如提交、分支切换、查看历史等)。
2.无需依赖中央服务器:
在 Git 中,每个开发者的本地仓库就是一个完整的版本控制数据库,因此不需要连接到中央服务器就能进行大多数操作(例如提交、查看历史)。
3.离线工作、分布式协作:
提交、查看历史记录、创建分支、合并等操作都可以在本地进行,直到需要同步到远程仓库时才进行网络操作。团队成员之间并不是直接依赖中心服务器进行协作,而是通过推送(push)和拉取(pull)操作,将本地仓库的更改同步到其他开发者的仓库中。开发者可以将自己的工作分享到远程仓库,其他人可以从该仓库拉取并合并更改,整个过程不需要中央服务器一直保持在线。
常用命令
git init
git init
在当前目录下创建一个新的Git仓库。
git status
git status
显示当前 Git 仓库的工作状态。
作用
- 显示当前分支:它会告诉你当前所在的分支名称。
- 显示文件更改状态:
- Untracked files:显示那些未被 Git 跟踪的新文件。
- Changes not staged for commit:显示已经修改过但尚未添加到暂存区的文件。
- Changes to be committed:显示已被添加到暂存区,等待提交的文件。
git add
git add <file>
git add用于将文件的更改添加到暂存区。暂存区是一个中间区域,用于准备提交(commit)之前,标记哪些文件或文件的哪些更改将被包括在下次提交中。这个命令不会直接修改 Git 仓库的历史记录,它只是告诉 Git 哪些更改是你想要在下次提交中包括的。
添加单个文件:
git add <file>
这将把指定文件添加到暂存区,标记为已修改并准备好提交。
示例:
git add index.html
添加多个文件:
git add <file1> <file2> ...
可以一次性将多个文件添加到暂存区。
示例:
git add file1.txt file2.txt
添加所有文件:
git add .
这个命令会将当前目录下的所有更改(包括新增文件、修改的文件以及删除的文件)添加到暂存区。如果你想添加所有更改的文件,可以使用这个命令。
添加所有更改的文件(包括删除的文件):
git add -A
使用
-A
参数,Git 会将所有更改的文件(包括新添加的文件、修改的文件以及删除的文件)都添加到暂存区。(整个工作区)添加指定模式的文件:
git add "*.txt"
使用通配符可以添加符合特定模式的文件。例如,
git add "*.txt"
会将所有.txt
文件添加到暂存区。添加部分文件的更改:
git add -p
-p
(patch)参数可以让你选择性地将某些修改的部分添加到暂存区,而不是整个文件。在运行git add -p
命令后,Git 会逐个显示每个文件的修改块,并提示用户选择是否将该块添加到暂存区。git commit
用于将暂存区的更改(也就是已经通过 git add
命令添加到暂存区的文件)记录到本地仓库中的命令。每次执行 git commit
时,都会生成一个新的提交对象,并为这个提交生成一个唯一的提交哈希值。每个提交还会有一个描述性的消息,通常用来描述本次更改的内容。
主要参数:
-m
或--message
:- 用于指定提交信息。提交信息是对本次修改的简短描述,帮助其他人(或者自己)理解这次更改的目的。
- 例如:
git commit -m "Fix bug in login feature"
--amend
:- 如果你想修改最近一次的提交,可以使用
--amend
参数。这会将最新的提交修改为当前暂存区的内容。 - 如果你忘记添加文件或者提交信息有误,可以通过
git commit --amend
来修正。 - 注意:
--amend
会修改历史提交,可能会影响其他依赖该提交的工作,因此要小心使用。
例如:
git commit --amend -m "Updated commit message"
- 如果你想修改最近一次的提交,可以使用
--no-edit
:- 这个选项与
--amend
一起使用,表示不修改提交信息,仅修改提交的内容。 - 例如:
git commit --amend --no-edit
- 这个选项与
--date="date"
:- 用于指定提交的时间戳。例如:
git commit --date="2025-04-20 12:00:00" -m "Custom date for commit"
- 用于指定提交的时间戳。例如:
-a
或--all
:- 在执行
git commit
时,自动将所有已跟踪文件的修改直接提交到版本库,而不需要使用git add
。 - 但是不会包括新文件(未跟踪的文件)。例如:
git commit -a -m "Commit all tracked changes"
- 在执行
--author="name <email>"
:- 用于指定提交的作者。如果你希望指定不同于当前配置的作者,可以使用此选项。
- 例如:
git commit --author="John Doe <john@example.com>" -m "Custom author commit"
git三大区域
Workspace:工作区,就是你平时存放项目代码的地方;
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index);
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;
git 回滚
git HEAD
1.HEAD 是指向当前所在分支的最新提交的指针。当你切换分支时,HEAD 会随之移动,指向新分支的最新提交。
2.分离 HEAD(Detached HEAD):
- 当 HEAD 不指向任何分支,而是指向某个具体的提交时,称为“分离的 HEAD”状态。这通常发生在你使用
git checkout <commit>
或git checkout <commit_hash>
时。 - 在这种状态下,如果你进行提交,Git 不会将新的提交与任何分支关联,而是创建一个孤立的提交。你可以在这种状态下进行实验性的修改,但如果不创建新的分支来保存这些提交,它们最终可能会丢失。
git log
- 查看提交历史:
这个命令会显示从最近的提交开始,按时间倒序列出所有提交记录,包括提交的哈希值、作者、提交日期和提交信息。git log
简洁输出: 如果只想看到提交的简洁信息(如提交哈希和提交信息),可以使用
--oneline
选项:git log --oneline
这会显示每个提交的一行简洁信息,通常会看到提交的简短哈希值和提交信息。
显示具体的文件变更: 如果你想查看每次提交时修改了哪些文件,可以使用
--stat
选项:git log --stat
这个命令会显示每个提交的文件变更统计信息(例如,修改了多少行代码等)。
git reflog
git reflog记录了 HEAD 和分支引用的历史变动。
git log
:记录的是 Git 仓库的提交历史,即所有的 commit 对象。它显示的是你仓库的版本历史(从当前 HEAD 开始),包括所有的提交、作者、日期、提交信息等。git reflog
:记录的是 Git 仓库中引用的变动历史,即 HEAD 或分支引用(例如master
或develop
)的移动。它不仅记录提交,还记录如git checkout
、git reset
、git merge
等操作如何影响引用的位置。git reflog
能帮助你追踪本地分支的变动历史,包括那些不再出现在提交历史中的变动。
回滚
回滚至之前版本
git log
git reset --hard 版本号
回滚至之后版本
git reflog
git reset --hard 版本号