Git 常用命令速查表
一、仓库初始化与克隆
命令 | 说明 |
---|---|
git init | 在当前目录初始化本地仓库 |
git clone <远程仓库地址> | 克隆远程仓库到本地(例:git clone https://github.com/user/repo.git ) |
二、文件状态与提交
命令 | 说明 |
---|---|
git status | 查看工作区 / 暂存区文件状态 |
git add <文件名> | 将指定文件添加到暂存区 |
git add . | 将所有变更文件添加到暂存区 |
git commit -m "提交说明" | 从暂存区提交到本地仓库(说明需简洁) |
git commit -am "提交说明" | 跳过暂存区,直接提交已跟踪文件的修改 |
三、分支操作
命令 | 说明 |
---|---|
git branch | 列出本地分支(当前分支前带 * ) |
git branch -r | 列出远程分支 |
git branch <分支名> | 创建新分支(基于当前分支) |
git checkout <分支名> | 切换到指定分支(Git 2.23+ 推荐用 git switch ) |
git switch <分支名> | 切换到指定分支(较新语法) |
git checkout -b <分支名> | 创建并切换到新分支(等价于 git switch -c ) |
git merge <分支名> | 将指定分支合并到当前分支 |
git branch -d <分支名> | 删除已合并的本地分支 |
git branch -D <分支名> | 强制删除未合并的本地分支 |
git push origin -d <分支名> | 删除远程分支 |
git branch -vv | 显示本地分支的详细信息,包括每个分支与远程分支的关联关系、最新提交以及本地与远程的同步状态 |
四、远程仓库交互
命令 | 说明 |
---|---|
git remote add origin <远程地址> | 关联远程仓库(origin 为默认别名) |
git remote -v | 查看远程仓库地址 |
git pull origin <分支名> | 拉取远程分支最新代码并合并到本地(例:git pull origin main ) |
git push origin <分支名> | 将本地分支推送到远程仓库(首次推送可加 -u 关联:git push -u origin main ) |
git fetch | 获取远程仓库最新分支信息(不合并) |
git merge | 将一个分支的修改合并到当前分支 |
五、版本查看与回溯
命令 | 说明 |
---|---|
git log | 查看提交历史(按 q 退出) |
git log --oneline | 简洁显示提交历史(一行一个提交) |
git log --graph --oneline | 图形化显示分支合并历史 |
git reflog | 记录本地仓库所有引用(分支、标签等)变更历史 远程操作需用git log或者git fetch同步后查看 |
git reset --hard <提交哈希> | 回退到指定版本(哈希从 git log 获取) |
git checkout -- <文件名> | 撤销工作区中文件的修改(恢复到最近提交状态) |
git reset HEAD <文件名> | 将暂存区的文件移回工作区(取消 git add 操作) |
git revert <提交哈希> | 创建新提交以撤销某次提交的修改(安全回溯,保留历史) |
六、其他常用命令
命令 | 说明 |
---|---|
git stash | 暂存当前工作区的变更(用于临时切换分支) |
git stash pop | 恢复最近一次 stash 的内容并删除 stash 记录 |
git stash list | 查看所有 stash 记录 |
git tag <标签名> | 给当前提交打标签(用于标记版本,如 git tag v1.0 ) |
git tag | 列出所有标签 |
git push origin <标签名> | 推送标签到远程仓库 |
git diff | 查看工作区与暂存区的差异 |
git diff --cached | 查看暂存区与本地仓库的差异 |
git remote
git remote
是 Git 中用于管理本地仓库与远程仓库(如 GitHub、GitLab 等平台上的仓库)连接关系的命令。它的核心作用是简化对远程仓库的操作 —— 通过给远程仓库地址设置一个 “别名”,避免每次与远程仓库交互时都输入冗长的 URL。
具体作用
管理远程仓库的别名
远程仓库的 URL 通常很长(如https://github.com/username/project.git
),git remote
可以为其设置一个简短别名(默认常用origin
),之后操作远程仓库时只需用别名即可(如git push origin main
替代git push https://github.com/... main
)。查看远程仓库信息
可以通过git remote
相关命令查看当前本地仓库关联了哪些远程仓库,以及它们的地址。添加 / 删除 / 修改远程仓库连接
当需要关联新的远程仓库、移除无效连接,或更换远程仓库地址时,都可以通过git remote
命令完成。
常用 git remote
命令示例
命令 | 说明 |
---|---|
git remote | 列出当前本地仓库关联的所有远程仓库的别名(如 origin ) |
git remote -v | 显示每个远程仓库别名对应的详细 URL(-v 是 --verbose 的缩写),包括拉取(fetch)和推送(push)地址 |
git remote add <别名> <远程仓库URL> | 添加一个新的远程仓库关联(例如:git remote add origin https://github.com/user/repo.git ) |
git remote remove <别名> | 移除指定别名的远程仓库关联(例如:git remote remove origin ) |
git remote rename <旧别名> <新别名> | 重命名远程仓库的别名(例如:git remote rename origin myrepo ) |
git remote set-url <别名> <新URL> | 修改远程仓库的 URL(例如:git remote set-url origin https://github.com/new-user/repo.git ) |
git merge
基本用法
假设当前在 main
分支,要将 feature/login
分支的修改合并到 main
分支:
# 1. 确保当前分支是目标分支(如 main)
git checkout main# 2. 合并 feature/login 分支到当前分支
git merge feature/login
合并的三种常见情况
快进合并(Fast-forward)
如果目标分支(如main
)没有新提交,而待合并分支(如feature/login
)是基于目标分支创建的,Git 会直接将目标分支指针移动到待合并分支的最新提交,不会产生新的合并记录。
示例输出:Updating a1b2c3d..e4f5g6h
普通合并(No-fast-forward)
如果目标分支有新提交,Git 会创建一个新的合并提交,将两个分支的修改整合,同时保留双方的提交历史。
示例输出:Merge made by the 'ort' strategy.
(会生成新的合并提交哈希)冲突合并(Conflict)
若两个分支修改了同一文件的同一部分,Git 无法自动合并,会提示冲突(Automatic merge failed
),需要手动解决冲突后再提交:
# 1. 解决文件中标记的冲突(搜索 <<<<<<< HEAD 等标记)
# 2. 标记为已解决
git add <冲突文件>
# 3. 完成合并提交
git commit -m "Resolve merge conflicts"
常用选项
命令 | 说明 |
---|---|
git merge --no-ff <分支名> | 强制创建合并提交(即使可以快进合并),保留分支合并轨迹 |
git merge --abort | 放弃当前合并过程,恢复到合并前的状态(适用于解决冲突失败时) |
git merge --squash <分支名> | 将待合并分支的所有修改压缩为一个新提交,再合并到当前分支(简化历史) |
注意事项
- 合并前建议先拉取远程最新代码(
git pull
),减少冲突概率。 - 合并只影响当前分支,待合并分支的内容不会被修改。
- 复杂项目中,建议使用
git merge
整合经过测试的功能分支,避免直接合并未完成的代码。
git cherry-pick
只转移源分支上特定的某次或某几次提交(而非整个分支的所有历史)到目标分支,可以使用 git cherry-pick
命令,它能精准地将指定提交应用到当前分支。
操作步骤:
- 查看源分支的提交记录,找到需要转移的提交的哈希值(commit ID):
# 切换到源分支
git checkout 源分支名# 查看提交历史(获取需要转移的提交的哈希值,通常是前几位即可)
git log --oneline
输出类似:
a1b2c3d (HEAD -> 源分支) 修复XX问题
e4f5g6h 添加XX功能
...
假设要转移的是 a1b2c3d
这次提交。
- 切换到目标分支(要转移到的分支):
git checkout 目标分支名
- 将指定提交应用到目标分支:
# 应用单个提交
git cherry-pick a1b2c3d
如果需要转移连续的多个提交(例如从 e4f5g6h
到 a1b2c3d
),可以指定范围:
git cherry-pick e4f5g6h..a1b2c3d
- 处理冲突(若有):
- 如果出现冲突,命令行会提示
Automatic cherry-pick failed.
- 打开冲突文件,找到并解决冲突标记(
<<<<<<<
、=======
、>>>>>>>
) - 解决后执行:
- 如果出现冲突,命令行会提示
git add . # 标记冲突已解决
git cherry-pick --continue # 继续完成cherry-pick
若想放弃此次操作,执行:git cherry-pick --abort
特点:
- 只转移指定的提交内容,不影响目标分支的其他历史。
- 每个被转移的提交会在目标分支生成一个新的提交(哈希值与源分支不同,但内容相同)。
适合场景:只想同步源分支上的某几个特定改动,而非整个分支的所有更新。
git reflog
git reflog
是 Git 中用于记录本地仓库所有引用(分支、标签等)变更历史的命令。它能追踪几乎所有对仓库的操作(如提交、切换分支、合并、重置等),即使是被删除的提交或分支,也能通过 reflog
找到痕迹。
核心作用
- 恢复误操作:当你不小心删除分支、执行了错误的
git reset
或git merge
,导致提交丢失时,reflog
可以帮你找到丢失的提交哈希值,从而恢复数据。 - 追踪操作历史:记录你在本地仓库的所有关键操作(如切换分支、提交、合并等),方便回溯操作轨迹。
基本用法
执行以下命令查看本地引用变更历史:
git reflog
示例输出(简化版):
8a639f182 (HEAD -> ADCNODL, origin/ADCNODL) HEAD@{0}: commit: Solve cross-platform issue
7b32c5d1e HEAD@{1}: checkout: moving from master to ADCNODL
890611a6d (master) HEAD@{2}: pull origin master: Fast-forward
a1b2c3d4e HEAD@{3}: commit: Fix bug in login module
输出内容解读:
每一行代表一次引用变更,格式为:
<提交哈希> HEAD@{<操作序号>}: <操作类型>: <操作描述>
<提交哈希>
:操作后指向的提交 ID(前几位)。HEAD@{<操作序号>}
:HEAD
指针的变更记录,@{0}
表示最近一次操作,@{1}
表示上一次,以此类推。<操作类型>
:如commit
(提交)、checkout
(切换分支)、reset
(重置)、merge
(合并)等。<操作描述>
:对操作的简要说明(如提交信息、分支名等)。
实用场景
恢复丢失的提交
若执行 git reset --hard
误删了提交,可通过 git reflog
找到被删除的提交哈希,再用 git reset --hard <哈希>
恢复:
git reflog # 找到需要恢复的提交哈希(如 a1b2c3d4e)
git reset --hard a1b2c3d4e
恢复删除的分支
若分支被删除,可通过 reflog
找到该分支最后一次提交的哈希,再基于此创建分支:
git reflog # 找到被删分支的最后一个提交哈希(如 7b32c5d1e)
git checkout -b 恢复的分支名 7b32c5d1e
查看近期操作轨迹
当忘记自己做过哪些操作时(如切换过哪些分支、合并过哪些提交),git reflog
可清晰展示操作历史。
注意事项
reflog
仅记录本地仓库的操作,不包含远程仓库的变更(远程操作需用git log
或git fetch
同步后查看)。- 默认情况下,
reflog
记录会保留 90 天(可通过配置修改),过期后会自动清理。 - 它是本地安全网,不会上传到远程仓库,仅对当前本地仓库有效。
如何将远程分支变为本地分支
要将远程分支(如 origin/feature-branch
)转换为本地可编辑的分支,通常需要创建一个与远程分支关联的本地分支,并建立跟踪关系(方便后续 pull
/push
操作)。以下是具体步骤:
步骤 1:获取远程分支的最新信息
首先确保本地仓库知晓远程分支的存在(尤其是远程新创建的分支),需要先同步远程仓库的元数据:
git fetch origin # origin 是远程仓库的别名,同步该远程的所有分支信息
步骤 2:查看远程分支
确认需要转换的远程分支名称(格式通常为 远程别名/分支名
):
git branch -r # 列出所有远程分支
# 示例输出:origin/main、origin/feature/login、origin/bugfix/v1.0
步骤 3:创建并切换到本地分支(关联远程分支)
有两种常用方式,效果相同,选择其一即可:
方式 1:直接切换(推荐,自动关联)
使用 git checkout
或 git switch
(Git 2.23+ 推荐)直接基于远程分支创建本地分支,Git 会自动建立跟踪关系:
# 语法:git checkout 远程分支名(省略远程别名,如 origin/feature/login → feature/login)
git checkout feature/login# 或用 git switch(更直观)
git switch feature/login
执行后,本地会创建一个名为 feature/login
的分支,并自动关联远程分支 origin/feature/login
。
方式 2:手动创建并关联(更灵活)
如果需要自定义本地分支名(与远程分支名不同),或明确指定关联关系:
# 语法:git checkout -b 本地分支名 远程别名/远程分支名
git checkout -b my-login origin/feature/login# 或用 git switch(更直观)
git switch -c my-login origin/feature/login
上述命令会创建本地分支 my-login
,并关联远程分支 origin/feature/login
。
步骤 4:验证是否成功
检查本地分支及其关联的远程分支:
git branch -vv # 列出本地分支,并显示关联的远程分支
# 示例输出:
# * feature 8a639f182 [origin/feature] 提交说明
# master 890611a6d [origin/master: behind 1] 提交说明# 这两行信息清晰展示了:# 本地有两个分支:ADCNODL(当前分支)和 master。
# 两个分支都分别关联了远程仓库(origin)的同名分支。
# master 分支需要从远程拉取 1 个新提交才能与远程同步,而 ADCNODL 分支与远程分支状态一致(无落后 # / 超前提示)。
第一行:* feature 8a639f182 [origin/feature] 提交说明
*
:表示当前处于feature
分支(当前工作分支)。feature
:本地分支的名称。8a639f182
:该本地分支最新一次提交的哈希值(前几位,用于唯一标识这个提交)。[origin/feature]
:表示这个本地分支关联了远程仓库(origin)的 feature分支(即 “跟踪关系”),后续执行git pull
/git push
时会默认与该远程分支交互。- 最后的文字:该本地分支最新一次提交的说明信息。
第二行:master 890611a6d [origin/master: behind 1] 提交说明
master
:另一个本地分支的名称(非当前分支,因为没有*
)。890611a6d
:该分支最新一次提交的哈希值。[origin/master: behind 1]
:表示本地master
分支关联了远程仓库的origin/master
分支,且本地分支比远程分支落后 1 个提交(即远程origin/master
有 1 个本地master
没有的新提交,需要git pull
拉取更新)。- 最后的文字:该分支最新一次提交的说明信息。
后续操作
关联后,对本地分支的修改可以直接推送到远程分支,无需指定远程和分支名:
git push # 等价于 git push origin feature/login(如果当前分支是 feature/login)
git pull # 等价于 git pull origin feature/login,拉取远程最新更新
回退Git合并
回退 Git 合并操作(即撤销已完成的 git merge
)需要根据合并是否已推送到(推送到远程仓库)采取不同的处理方式,核心是要撤销合并产生的变更并恢复到合并前的状态。
情况 1:合并后未推送到远程(仅本地操作)
如果合并仅在本地完成,尚未 git push
到远程仓库,可直接使用 git reset
回退到合并前的状态:
找到合并前的提交哈希
先通过 git log
或 git reflog
查看合并记录,找到合并前的最后一个正常提交的哈希值(假设合并前的提交哈希为 a1b2c3d
):
git log --oneline # 查看提交历史,合并提交会显示 "Merge branch 'xxx'"
# 或
git reflog # 查看操作记录,找到合并前的状态(如 HEAD@{2}: checkout: ...)
回退到合并前的状态
使用 --hard
选项彻底回退工作区、暂存区和本地仓库:
git reset --hard a1b2c3d # 替换为合并前的提交哈希
执行后,当前分支会回到合并前的状态,合并产生的变更被完全撤销。
情况 2:合并已推送到远程(需谨慎)
如果合并已经推送到远程仓库,不能用 git reset
(会导致本地与远程历史不一致),推荐使用 git revert
创建一个 “反合并” 提交,既能撤销变更,又不破坏提交历史:
找到合并提交的哈希
合并提交是 git merge
产生的新提交,通过 git log
找到它的哈希值(假设为 m7n8o9p
)
git log --oneline # 合并提交会显示 "Merge branch 'xxx' into yyy"
创建反合并提交
使用 git revert
并添加 -m 1
选项(表示保留当前分支的版本,撤销被合并分支的变更):
git revert -m 1 m7n8o9p # 替换为合并提交的哈希
-m 1
中的1
表示 “第一个父提交”,即合并操作前当前分支的最后一个提交(可理解为 “保留当前分支,撤销合并进来的分支”)。
提交反合并结果
执行后会自动打开编辑器,填写撤销合并的说明(如 “Revert "Merge branch 'feature/x'"”),保存退出即可完成提交。
推送到远程
最后将反合并提交推送到远程,同步变更:
git push origin <当前分支名>
关键区别
方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
git reset --hard | 未推送远程 | 操作简单,彻底删除合并记录 | 会修改历史,推送后会影响他人 |
git revert -m | 已推送远程 | 不修改历史,安全协作 | 会产生新的提交,历史中保留合并和反合并记录 |
注意事项
- 若合并后有新的提交,
git reset
会同时删除这些新提交(需谨慎),而git revert
只会撤销合并本身的变更。 - 执行操作前,建议用
git branch
创建一个临时分支备份当前状态,防止误操作。