【Git】项目管理全解
写在前面
之前写的git攻略太过粗略,故决定更新一篇更加完整的
概念定义
- Git:
一个分布式版本控制系统,主要功能包括但不限于:追踪文件变化,版本回退,团队协作,多分支开发 - 工作区 (Workspace):
你电脑上能看到的项目目录,是你正在进行修改的地方。 - 暂存区 (Staging Area / Index):
一个临时的存储区域,用于存放你希望在下一次提交中包含的修改。 - 本地仓库 (Local Repository):
存放在你本地电脑上的完整项目历史记录(.git
文件夹)。 - 远程仓库 (Remote Repository):
托管在网络服务器上的项目仓库(如 GitHub, GitLab),用于团队协作和数据备份。
数据流转路径:
工作区 -> (add) -> 暂存区 -> (commit) -> 本地仓库 -> (push) -> 远程仓库
远程仓库 -> (pull / fetch) -> 本地仓库 -> (checkout / merge) -> 工作区
上图均来自菜鸟教程
Git常用指令解析
1. 初始配置 (全局只需一次)
第一次使用 Git 时,需要配身份信息,这些信息会记录在每一次提交中。
- 指令:
git config --global user.name "Your Name" git config --global user.email "youremail@example.com"
- 使用场景: 新电脑上首次安装和使用 Git。
- 使用方法: 打开终端或 Git Bash,依次输入以上两条指令,将
"Your Name"
和"youremail@example.com"
替换成自己的名字和邮箱,随便写也可以,git并不关心真伪,除非团队有要求之类的。
2. 创建与克隆仓库
-
git init
- 使用场景: 将一个现有的本地项目目录初始化为 Git 仓库,或者创建一个全新的空仓库。
- 使用方法:
执行后,目录下会多出一个隐藏的# 进入你的项目目录 cd my-project # 初始化 git init
.git
文件夹,所有版本控制信息都存放在这里。
-
git clone
- 使用场景: 从远程仓库(如 GitHub)下载一个项目的完整副本到本地。这是参与一个现有项目的标准方式。
- 使用方法:
例如,从 GitHub 克隆一个项目:git clone <repository_url>
git clone https://github.com/example/repo.git
3. 日常修改与提交 (最常用的操作)
这是开发过程中使用最频繁的指令组合。
-
git status
- 使用场景: 查看当前工作区和暂存区的状态。可以知道哪些文件被修改了、哪些文件还未被跟踪等。
- 使用方法:
git status
-
git add
- 使用场景: 将工作区的修改添加到暂存区,准备进行下一次提交。
- 使用方法:
# 添加单个文件 git add <file_name> # 添加多个文件 git add file1.txt file2.js # 添加当前目录下所有修改(最常用) git add .
-
git commit
- 使用场景: 将暂存区的所有内容提交到本地仓库,形成一个新的版本记录(一个 commit)。
- 使用方法:
git commit -m "Your descriptive commit message"
-m
参数允许你直接在命令行中添加提交信息。提交信息应该清晰、简洁地描述这次提交做了什么,例如"feat: 添加用户登录功能"
或"fix: 修复了首页的显示 bug"
。
-
git log
- 使用场景: 查看项目的提交历史。
- 使用方法:
# 查看完整的提交历史 git log # 查看简化的单行历史 git log --oneline # 查看带分支图形的历史 git log --graph --oneline --decorate --all
4. 分支管理 (团队协作与功能开发的核心)
分支是 Git 最核心的功能,它允许开发者从主线(通常是 main
或 master
)分离出去,进行独立的开发工作,完成后再合并回来。
-
git branch
- 使用场景: 查看、创建或删除分支。
- 使用方法:
# 查看所有本地分支(当前分支会用 * 标记) git branch # 创建一个新分支 git branch <branch_name> # 删除一个已经合并的分支 git branch -d <branch_name> # 强制删除一个未合并的分支(慎用) git branch -D <branch_name>
-
git checkout
(在较新版本的 Git 中,推荐使用git switch
和git restore
)- 使用场景: 切换到不同的分支,或者恢复工作区的文件。
- 使用方法:
# 切换到一个已存在的分支 git checkout <branch_name> # 创建并立即切换到一个新分支(常用) git checkout -b <new_branch_name>
-
git switch
(推荐使用)- 使用场景: 专门用于切换分支。
- 使用方法:
# 切换到一个已存在的分支 git switch <branch_name> # 创建并切换到一个新分支 git switch -c <new_branch_name>
-
git merge
- 使用场景: 将一个分支的修改合并到当前所在的分支。
- 使用方法:
解决冲突:如果两个分支都修改了同一个文件的同一部分,# 1. 首先,切换到你希望接收合并的分支(例如 main) git switch main # 2. 然后,执行 merge 命令,指定要合并过来的分支 git merge <feature_branch_name>
git merge
会失败并提示冲突。你需要手动打开冲突文件,解决冲突内容,然后再次git add .
和git commit
来完成合并。
5. 远程协作
-
git remote
- 使用场景: 管理与本地仓库关联的远程仓库。
- 使用方法:
# 查看关联的远程仓库 git remote -v # 添加一个新的远程仓库 git remote add <remote_name> <repository_url> # 通常默认的远程仓库名为 origin git remote add origin https://github.com/user/repo.git
-
git push
- 使用场景: 将本地仓库的提交推送到远程仓库,这样其他团队成员才看到你对代码的修改。
- 使用方法:
# 将当前分支的提交推送到名为 origin 的远程仓库 git push origin <branch_name> # 如果本地分支与远程分支同名,可以简写 git push # 首次推送一个新创建的本地分支时,需要设置上游(upstream) git push -u origin <branch_name>
-
git pull
- 使用场景: 从远程仓库获取最新的修改,并自动与本地当前分支合并。这是保持本地代码与团队同步的常用方式。
- 使用方法:
git pull origin <branch_name> # 如果当前分支已经与远程分支关联,可以简写 git pull
git pull
实际上是git fetch
+git merge
两个命令的组合。
-
git fetch
- 使用场景: 从远程仓库获取最新的信息(如新的分支、新的提交),但不会自动合并到你的本地分支。这让你可以在合并前先查看远程的修改。
- 使用方法:
执行后,你可以通过git fetch origin
git log origin/main
来查看远程主分支的最新提交。
6. 版本回退与撤销
-
git reset
- 使用场景: 将当前分支的 HEAD 指针移动到指定的提交,同时可以选择性地修改暂存区和工作区。用于回退版本。
- 使用方法:
# 回退到上一个版本,但保留工作区的修改 git reset --soft HEAD^ # 回退到上一个版本,同时重置暂存区(工作区不变) git reset HEAD^ # 彻底回退到上一个版本,工作区和暂存区的修改都将丢失(危险!) git reset --hard HEAD^ # 也可以指定 commit_id git reset --hard <commit_id>
-
git revert
- 使用场景: 创建一个新的提交,内容与指定的旧提交相反。这是一种更安全的回退方式,因为它不会修改项目历史,而是以一次新的提交来“撤销”之前的修改。非常适合在公共分支上使用。
- 使用方法:
git revert <commit_id>
-
git restore
(推荐使用)- 使用场景: 专门用于恢复工作区的文件或撤销暂存区的修改。
- 使用方法:
# 撤销工作区中某个文件的修改(从暂存区恢复) git restore <file_name> # 将文件从暂存区中移除(unstage),但保留工作区的修改 git restore --staged <file_name>
日常开发工作流
个人开发流程:
git init
或git clone
开始项目。- 修改代码。
git status
查看状态。git add .
将修改添加到暂存区。git commit -m "完成xx功能"
提交到本地仓库。- 重复 2-5 步。
git push
推送到远程仓库备份。
团队协作流程:
git clone
克隆项目到本地。git pull
开始工作前,先拉取最新代码保持同步。git switch -c feature/new-login
创建并切换到一个新的功能分支。- 在
feature/new-login
分支上进行开发和提交(add
->commit
)。 git push -u origin feature/new-login
将功能分支推送到远程。- 在 GitHub/GitLab 上发起一个 Pull Request (或 Merge Request),请求将你的功能分支合并到
main
分支。 - 代码被审查(Code Review)通过后,由项目负责人合并到
main
分支。 - 切换回主分支
git switch main
,然后git pull
获取包含你代码的最新版本。
但也不是说个人工作流一定不需要git pull,比如我有多个机器人,但是它们之间只有参数的区别,在机器人A上增加了新功能,然后我推一次到远程仓库,在其他机器人上拉下来;如果每次开发前都记得本地程序是否最新,那也行,但是通常会忘记,所以每次开发前还是拉一次比较好
关于独占文件的管理
比如我自己开发了一个调试用的插件或上位机,但是我不希望被其他同事看见,或者说我不希望被别人同步走;或者说有多个机器人共享同一套控制程序,但是它们各自的配置文件是不同的,我们不希望每次同步配置文件会被篡改;再或者说,工程内部存在一些调试临时生成的日志、保存、存档等,它们也没有必要被push到远程
这时候就需要.gitignore了,它可以把配置文件的管理责任从 Git 中分离出去,Git 只负责同步控制程序
# .gitignore# 忽略所有具体的配置文件
config.json# 其他需要忽略的文件,如日志、临时文件等
*.log
# / 表示该目录下的所有文件
tmp/
其中所有文件的路径均相对于项目的根目录,也就是.git文件夹所在的位置,.gitignore同样存放在同一目录