Git 不要只会 pull 和 push,试试这 5 条提高效率的命令

💡 原文中文,约6400字,阅读约需16分钟。
📝

内容提要

本文介绍了5个实用的Git命令:stash、reset --soft、cherry-pick、revert和reflog,以及设置Git短命令的两种方式。

🔎

延伸解读

理解命令的适用边界比记住命令更重要

文章在总结中特别指出,文中列举的应用场景有部分不太恰当,只是为了便于理解。这提醒读者,学习这些Git命令时,重点应放在理解每个命令的作用机制上,而不是机械套用场景。例如,reset --soft适合处理未推送的本地提交,而revert则用于已推送的公共历史。只有清楚命令的底层行为,才能在实际开发中灵活选择,避免因误用导致代码丢失或团队协作问题。

reset --soft 与 revert 的关键区别

两者都用于撤销提交,但机制和适用场景不同。reset --soft 通过移动HEAD指针回退提交,并将修改保留在暂存区,适合整理本地未推送的提交历史,但若已推送则需强制推送覆盖远程。revert 则是生成一个新的提交来反向应用更改,不修改原有历史,因此适合已推送的公共分支。文章通过具体场景说明,误用reset可能影响同事代码,而revert能更安全地撤回功能。

cherry-pick 冲突处理与流程控制

cherry-pick 在复制多个提交时可能遇到代码冲突,此时命令会暂停。文章介绍了解决冲突后使用 git cherry-pick --continue 继续流程,以及用 --abort 放弃操作回到初始状态,或用 --quit 保留已成功的提交并退出。这些选项让开发者能灵活控制复制过程,避免因冲突导致流程卡死。理解这些命令有助于在需要抽取特定提交到其他分支时,更从容地应对意外情况。

reflog:误操作后的最后一道保险

reflog 记录了本地仓库中所有HEAD的移动历史,包括commit、reset、merge等操作。即使使用 reset --hard 强制回退导致提交“丢失”,只要操作发生在本地,就能通过 reflog 找到之前的commitHash并恢复。文章通过误删同事提交的例子,展示了 reflog 的挽救作用。但需注意,reflog 仅记录本地操作,且默认有过期时间,不能替代远程备份,重要分支仍应谨慎操作。

❓

Q&A

正在开发功能时突然要修复线上bug,但不想提交未完成的代码,该怎么处理?

可以使用 git stash 命令将未提交的修改暂存起来,使工作目录变干净,从而切换到其他分支修复bug。修复完成后,切回原分支,使用 git stash apply 恢复暂存的代码。

git reset --soft 和 git reset --hard 有什么区别?

git reset --hard 会强制回溯到某个commit节点,并丢弃该节点之后的所有修改;而 git reset --soft 在回溯节点的同时,会保留该节点之后的修改内容,并将其放回暂存区,相当于给了一次重新提交的机会。

如何把另一个分支上的某个commit复制到当前分支?

使用 git cherry-pick <commitHash> 命令,可以将指定commit的修改应用到当前分支,并生成一个新的commit(commitHash不同,但提交时间保留)。如果需要复制多个连续的commit,可以使用 git cherry-pick commit1^..commit2。

已经推送的代码有问题需要撤回,但不想影响其他同事的提交,该用什么命令?

使用 git revert <commitHash> 可以撤销指定提交的修改内容,并生成一条新的提交记录,而不会影响其他commit。如果撤回的是合并提交,需要加上 -m 1 参数指定主线分支。

不小心执行了 git reset --hard 导致commit丢失,还能找回来吗?

可以。使用 git reflog 查看所有的commit操作记录,找到误操作前的commitHash,然后再次执行 git reset --hard <commitHash> 即可恢复丢失的commit。

如何为常用的Git命令设置简短的别名?

有两种方式:1. 使用命令行:git config --global alias.ps push;2. 直接编辑全局配置文件 ~/.gitconfig,在 [alias] 段落下添加如 co = checkout、ps = push 等。设置后即可用 git ps 代替 git push。

🏷️

标签

➡️

继续阅读