Epiphyllum

Git的常用指令

2025-02-24

常用 Git 指令及其用法#

基础操作#

git status#

  • 作用 查看当前仓库的状态
  • git status 能告诉你什么?
    1. 当前所在的分支 (例如:On branch main
    2. 未跟踪的文件(新增文件) (显示为 Untracked files,这些文件尚未被 Git 记录)
    3. 已修改但未暂存的文件 (显示为 Changes not staged for commit,修改后还未 git add
    4. 已暂存但未提交的文件 (显示为 Changes to be committed,已 git add 但未 git commit
    5. 合并或变基冲突(如果有) (显示为 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 <目标提交>(交互式变基)#

  • 作用交互式修改提交历史(如合并提交、修改提交信息、删除提交等)。

  • 场景:整理本地提交历史,使其更清晰(例如:合并多个临时提交为一个完整提交)。

  • 流程

    1. 执行命令后进入交互界面:

      git rebase -i HEAD~3  # 修改最近 3 个提交
    2. 在编辑器中按需修改命令(如 pick, squash, reword 等):

      pick a1b2c3d 提交A
      squash b2c3d4e 提交B  # 将提交B合并到提交A
      reword c3d4e5f 提交C  # 修改提交C的信息
    3. 保存退出后,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 mergegit rebase(根据是否需要线性历史选择)。
  • 撤销变更
    • 未推送:git reset
    • 已推送:git revert
  • 同步远程代码git fetch + git rebase origin/main(优于直接 git pull)。
Git的常用指令
https://epiphyllum.masttf.fun/post/how_git
作者
Masttf
发布于
2/24/2025
许可协议
CC BY-NC-SA 4.0