常用 Git 指令及其用法
基础操作
git status
- 作用 查看当前仓库的状态
git status
能告诉你什么?- 当前所在的分支
(例如:
On branch main
) - 未跟踪的文件(新增文件)
(显示为
Untracked files
,这些文件尚未被 Git 记录) - 已修改但未暂存的文件
(显示为
Changes not staged for commit
,修改后还未git add
) - 已暂存但未提交的文件
(显示为
Changes to be committed
,已git add
但未git commit
) - 合并或变基冲突(如果有)
(显示为
Unmerged paths
,需要手动解决冲突)
- 当前所在的分支
(例如:
git add
-
作用命令可将该文件的修改添加到暂存区。
通过运行 git add 命令,你可以告诉 Git 哪些文件的修改应该包含在下一次提交(commit)中。
添加一个或多个文件到暂存区:
git commit
-
作用:提交代码变更,生成一个新的提交节点。
-
示例:
git commit -m "提交信息"
git branch <分支名>
-
作用:创建新分支,但不会切换到该分支。
-
示例:
git branch feature
git branch -f <分支名> <目标位置>
-
作用:强制移动分支到指定的提交位置(覆盖原有分支指向)。
-
场景:当需要快速调整分支到某个历史提交时使用(如修复分支指向错误)。
-
示例:
git branch -f main HEAD~3 # 强制将 main 分支移动到 HEAD 前 3 个提交 git branch -f feature a1b2c3d # 强制将 feature 分支移动到提交 a1b2c3d
-
注意:
- 若分支已推送到远程仓库,需配合
git push -f
强制推送(慎用)。 - 适用于本地分支修复,避免在公共分支上强制修改历史。
- 若分支已推送到远程仓库,需配合
git checkout <分支名/提交哈希>
-
作用:切换到指定分支或提交(分离头指针模式)。
git checkout main # 切换到 main 分支 git checkout a1b2c3d # 切换到某个提交
git merge <分支名>
-
作用:将指定分支合并到当前分支,生成一个新的合并提交。
git merge feature # 将 feature 分支合并到当前分支
-
解决冲突:当
git merge
遇到冲突时,你需要手动解决冲突文件中的冲突标记(<<<<<<<
,=======
,>>>>>>>
)。 -
标记冲突已解决:使用
git add <文件路径>
将解决后的文件标记为已暂存。 -
完成合并提交:直接运行
git commit
,Git 会自动生成一个合并提交信息。此时合并流程就完成了。
分支与提交操作
git rebase <目标分支>
-
作用:将当前分支的提交“复制”到目标分支的最新提交后,使历史线性化。
-
示例:
git rebase main # 将当前分支变基到 main 分支
-
手动解决冲突:
在 rebase 过程中,Git 会提示冲突文件,你需要:
打开冲突文件,找到 <<<<<<<、=======、>>>>>>> 标记的冲突区域。 修改代码,保留你需要的部分,删除标记。 使用
git add <文件>
标记冲突已解决。 -
继续 rebase:
git rebase --continue
-
如果放弃 rebase:
git rebase --abort
git rebase -i <目标提交>(交互式变基)
-
作用:交互式修改提交历史(如合并提交、修改提交信息、删除提交等)。
-
场景:整理本地提交历史,使其更清晰(例如:合并多个临时提交为一个完整提交)。
-
流程:
-
执行命令后进入交互界面:
git rebase -i HEAD~3 # 修改最近 3 个提交
-
在编辑器中按需修改命令(如
pick
,squash
,reword
等):pick a1b2c3d 提交A squash b2c3d4e 提交B # 将提交B合并到提交A reword c3d4e5f 提交C # 修改提交C的信息
-
保存退出后,Git 会按指令逐条处理提交。
-
-
常用命令:
pick
: 保留该提交reword
: 保留提交但修改信息edit
: 暂停变基,允许修改提交内容squash
: 合并到前一个提交,并保留提交信息fixup
: 合并到前一个提交,但丢弃当前提交信息drop
: 删除该提交
-
注意:
- 仅用于本地未推送的提交,若已推送需强制覆盖(可能影响他人)。
- 解决冲突后,使用
git rebase --continue
继续。
git reset <目标提交>
-
作用:将当前分支的 HEAD 指针移动到指定提交(默认保留工作区,
--hard
会丢弃变更)。git reset HEAD^ # 回退到上一个提交(保留修改) git reset --hard a1b2c3d # 强制回退到指定提交,丢弃后续修改
git cherry-pick <提交哈希>
-
作用:将指定提交的变更应用到当前分支。
git cherry-pick a1b2c3d # 应用提交 a1b2c3d 的变更
删除本地分支
git branch -d <分支名>
-
-d
(小写):安全删除,如果分支的代码已合并到其他分支,则允许删除。 -
示例:
git branch -d feature/login
强制删除未合并的分支(慎用!)
如果分支的代码未合并且确认要强制删除,使用 -D
git branch -D <分支名>
2. 删除远程分支
git push origin --delete <远程分支名>
-
示例:
git push origin --delete feature/login
等效写法(更简洁)
git push origin :<远程分支名>
-
示例:
git push origin :feature/login
相对引用与 HEAD
-
HEAD^
或HEAD~1
-
作用:表示当前提交的父提交(
^
用于分支合并后的父提交选择,~
用于向上移动多步)。 -
示例:
git checkout HEAD^ # 切换到父提交 git branch -f main HEAD~3 # 强制将 main 分支移动到 HEAD 前 3 个提交
-
远程仓库操作
git clone <远程仓库地址>
- 作用:克隆远程仓库到本地。
git fetch
- 作用:下载远程仓库的更新,但不自动合并到本地分支。
git pull
- 作用:相当于
git fetch
+git merge
,拉取远程更新并合并到当前分支。
git push <远程仓库> <分支名>
-
作用:将本地分支推送到远程仓库。
-
示例:
git push origin main # 推送 main 分支到 origin
高级技巧
git revert <提交哈希>
-
作用:创建一个新提交,撤销指定提交的变更(适合公共历史记录)。
-
示例:
git revert a1b2c3d # 撤销提交 a1b2c3d 的变更
交互式 Rebase (git rebase -i
):
- 作用:通过交互界面修改提交历史(如合并提交、修改提交信息等)。
强制推送 (git push -f
)
- 作用:强制覆盖远程分支(慎用,可能破坏他人代码)。
其他关键概念
- 分离头指针 (Detached HEAD):直接切换到某个提交(而非分支)时的状态,需创建分支保存更改。
- 冲突解决:合并或变基时发生冲突,需手动编辑文件后
git add
标记为已解决。
注意
- 合并分支:
git merge
或git rebase
(根据是否需要线性历史选择)。 - 撤销变更:
- 未推送:
git reset
- 已推送:
git revert
- 未推送:
- 同步远程代码:
git fetch
+git rebase origin/main
(优于直接git pull
)。