git常用操作
# Git 常用操作
Git是一个分布式版本控制系统,它允许你跟踪文件和目录的历史更改。以下是一些常用的Git操作和它们的相关知识:
# 初始化仓库
git init:在当前目录创建一个新的 Git 仓库。
# 初始化一个 README 文件
这里讲述以 Git 命令来初始化 README 文件
touch README.md
echo "# Project Title" > README.md
git add README.md
git commit -m "Initialize README file"
2
3
4
# 配置
git config --global user.name "[name]":设置全局用户名。git config --global user.email "[email address]":设置全局邮箱。
# 添加文件
git add <file>:将指定文件添加到暂存区。git add .:将当前目录的所有更改添加到暂存区。
# 提交更改
git commit -m "message":将暂存区的文件提交到仓库,并附上提交信息。
# 查看状态
git status:查看当前文件的状态,哪些文件被修改了,哪些文件在暂存区。
# 查看提交历史
git log:查看提交历史记录。git log --oneline:以简化的方式查看提交历史。
# 分支操作
git branch:列出所有分支。git branch <name>:创建一个新分支。git checkout <name>:切换到指定分支。git checkout -b <name>:创建新分支并切换到该分支。
# 合并分支
git merge <branch>:将指定分支合并到当前分支。
# 撤销操作
git reset <file>:将文件从暂存区撤回到工作区(相当于--mixed,默认行为)。git reset --soft <commit>:回退到指定提交,但保留暂存区和工作区的修改。git reset --mixed <commit>:回退到指定提交,保留工作区修改,但清空暂存区(默认行为)。git reset --hard <commit>:回退到指定提交,彻底丢弃暂存区和工作区的所有修改(不可恢复,慎用)。git revert <commit>:撤销某次提交,创建一个新的提交来抵消之前的提交(不改写历史,安全)。<commit>是要撤销的提交的哈希值。
reset vs revert:
reset是"回退",把 HEAD 指针移到之前的提交,会改写历史(已推送的提交慎用)revert是"反向操作",创建一个新提交来撤销旧提交,不改写历史(已推送的提交推荐用这个)
# 远程仓库操作
# 基本操作
git clone <repository>:克隆远程仓库到本地。<repository>可以是远程仓库的 URL。git clone <repository> <directory>:将远程仓库克隆到指定的本地目录。git clone --recurse-submodules <repository>:克隆含子模块的仓库(同时拉取所有子模块)。git remote add <name> <url>:添加远程仓库。git remote remove <name>:删除远程仓库关联。git remote rename <旧名称> <新名称>:重命名远程仓库。git remote set-url <name> <新url>:修改远程仓库地址。git remote -v:查看所有远程仓库地址(-v表示显示 URL)。git push <remote> <branch>:将本地分支的更改推送到远程仓库。git pull <remote> <branch>:从远程仓库拉取分支的更改并合并到本地。git fetch <remote>:从远程仓库拉取最新信息,但不合并(比pull更安全,可以先查看再决定是否合并)。
# 多远程仓库管理(Fork 工作流)
当你 Fork 一个开源项目进行二开时,通常需要配置两个远程仓库:
# origin 指向你的 fork(有推送权限)
git remote add origin https://gitee.com/你的用户名/项目.git
# upstream 指向原仓库(只有拉取权限,用于同步上游更新)
git remote add upstream https://gitee.com/原作者/项目.git
# 查看所有远程仓库
git remote -v
2
3
4
5
6
7
8
详细的 Fork 工作流和上游同步流程,参见 Fork 工作流与上游同步。
# 强制推送
当你在本地修改了已推送的提交历史(如 git commit --amend、git rebase、git reset --hard),需要强制推送到远程:
# --force:强制推送,无论远程是否有他人的新提交都会覆盖(危险)
git push --force origin <分支名>
# --force-with-lease:安全的强制推送(推荐)
# 如果远程分支有你本地未同步的新提交,会拒绝推送,避免覆盖他人工作
git push --force-with-lease origin <分支名>
2
3
4
5
6
始终优先使用
--force-with-lease而非--force。前者会检查远程分支是否有你未拉取的新提交,避免意外覆盖他人的工作。
# 解决冲突
- 当合并时出现冲突,需要手动解决冲突后,使用
git add <resolved-file>添加解决后的文件,然后git commit提交。
# 标签操作
git tag <tagname>:创建一个标签。git push <remote> <tagname>:推送标签到远程仓库。
# 查看差异
git diff:查看工作区和暂存区的差异。git diff <branch>:查看当前分支和指定分支的差异。
# 编辑已经提交的 commit
# 情况一:修改最近一次的提交
如果你只是想修改刚刚提交的 commit 信息,或者想追加/修改刚刚提交的文件,使用 git commit --amend 即可。
1. 仅修改提交信息(Commit Message)
方法A(推荐):直接在终端输入
git commit --amend,会进入默认编辑器(如 Vim 或 VSCode),修改完保存退出即可。方法B(快捷):如果你只想快速改个文案,可以直接使用一行命令:
git commit --amend -m "这里填写你新的提交信息"1
2. 修改提交的文件或代码内容 如果你发现上次提交漏了文件,或者代码有笔误:
- 第一步:正常修改你的代码,然后使用
git add .将修改后的文件重新加入暂存区。 - 第二步:执行
git commit --amend(可以加--no-edit保持原提交信息不变)。Git 会将暂存区的新内容合并到上一次的提交中,替换掉旧的提交。
3. 同步到远程 如果该提交之前已经推送过,修改完成后需要强制推送:
git push -f origin <你的分支名>
# 情况二:修改历史中的某次提交(交互式变基)
如果你需要修改的不是最后一次,而是更早之前的某次提交,需要使用交互式变基(Interactive Rebase)。
假设你的提交历史是 A -> B -> C -> D,你现在想修改中间的 C 提交:
1. 启动交互式变基
你需要回到目标提交的上一个节点。可以使用 git log 查看提交哈希,找到 C 的上一个提交 B 的哈希值。然后执行:
git rebase -i <B提交的哈希值>
# 或者如果你想修改最近3次提交中的某一次,可以直接写:
git rebase -i HEAD~3
2
3
2. 将 pick 改为 edit
执行后会打开一个编辑器,列出从 B 之后的提交列表。找到你想修改的 C 提交那一行,将行首的 pick 改为 edit(或简写 e),然后保存并退出。
3. 修改该次提交
此时 Git 会暂停变基过程,并停留在 C 提交的状态。
- 修改代码或文件。
- 执行
git add .暂存修改。 - 执行
git commit --amend修改该次提交的说明或内容。
4. 完成变基并推送 修改完成后,执行以下命令让 Git 继续完成剩下的变基操作:
git rebase --continue
最后,同样需要使用 git push -f 强制推送到远程仓库。
# 操作失误,兜底操作
如果在修改过程中改乱了,或者不想改了,可以执行以下命令,一键将本地分支回退到和远程仓库一模一样的状态(注意:这会丢失你本地未推送的所有修改):
git reset --hard origin/dev<你的分支名>
# 示例
git reset --hard origin/dev
2
3
4