Git 详解:深入比较
Git 是一款非常强大的工具,它拥有丰富的功能供您使用。有些命令的结果略有相似,值得您了解和比较它们,以便选择最符合您需求并优化工作流程的命令。本文将定义并比较以下命令:revert、checkout、reset、merge 和 rebase。
恢复、签出、重置
这些工具允许您撤消和操作存储库中的更改。问题是它们非常相似,因此很容易混淆。我们将详细定义它们,并列出它们的异同。
Git 恢复
这是一种非常规且安全的撤销操作方法,因为它可以防止丢失历史记录。Git revert 会反转提交中添加的更改,并添加一个包含反转内容的新提交。当您已将更改推送到远程存储库时,此命令尤其有用,因为它可以保持原始提交的完整性。
要使用提交哈希恢复:git revert [SHA]
要使用范围恢复:git revert HEAD~[num-of-commits-back]
Git 签出
这是一个多功能工具,它允许您在分支之间切换,检查旧的提交,并通过移动 HEAD 并相应地更新工作目录来撤消本地未提交的更改。
要在分支之间切换:git checkout [branch-name]
要使用提交哈希检查较旧的提交:git checkout [SHA]
要使用范围检查较旧的提交:git checkout HEAD~[num-of-commits-back]
笔记:
- 将 HEAD 移动到不同的分支或提交时,您将需要提交或存储任何可能丢失的未提交的更改。
- 切换到旧提交后,您将处于分离的 HEAD状态,这有利于检查,但不利于修改。换句话说,您不再位于当前分支,因此请勿在分离的 HEAD上添加任何提交,因为切换到其他分支时,这些提交将会丢失。如果您计划在分离的 HEAD 上提交更改,请务必从该分支创建新的分支。
要撤消所有本地未提交的更改:git checkout .
要撤消特定的本地未提交的更改:git checkout -- [file-name]
Git 重置
这是一种强大但复杂的撤消操作的方法。有三个可用参数:
--mixed
这是默认模式,因此git reset --mixed
与 相同git reset
。通过使用其中任何一个命令,您将 HEAD 移动到最新的提交,并且在该提交之后添加的所有更改都将作为未跟踪的更改在工作目录中提供。
--soft
此操作与使用 --mixed 参数执行的操作类似。HEAD 会移动到最新的提交,但在该提交之后添加的更改仍会保留在暂存区。
--hard
仅在您清楚自己在做什么时 使用此命令git reset --hard
,因为它非常危险。使用硬重置会将 HEAD 移动到最新提交,并破坏之后添加的更改。此操作无法撤消,因此请谨慎使用。
如果您已将代码推送到远程仓库,则不应使用此git reset
选项。移除其他团队成员仍在其上继续构建的提交非常困难,并且会扰乱团队成员的工作流程。
附加操作:用于git reset -- [file-name]
取消暂存尚未提交的文件。
合并与变基
当多个人同时在一个项目中工作时,你需要在某个时刻合并代码。Git rebase 和 merge 分别使用不同的方法将一个分支的更改合并到另一个分支。
Git 合并
它使用非破坏性操作来合并两个分支的历史记录,而不会更改它们。此外,每次使用时,它都会创建一个新的“合并提交”。这是一种合并更改的好方法,但是,根据主分支的活跃程度,您的提交历史记录可能会包含多个合并提交,这可能会变得繁琐。
将 master 中的最新更改合并到您的分支中:git checkout [branch-name]
git merge master
Git 变基
这是一个破坏性操作,因为它通过使用新的提交重写项目历史将整个分支的历史移动到另一个分支之上。
如果您希望项目历史记录简洁明了、线性流畅,此命令非常有用。但是,基于已推送到远程仓库 master 分支的更改进行 rebase 操作并不安全,因为这样会更改 master 分支的历史记录,而团队成员则会继续处理该分支的不同版本。
此外,Git 不允许您轻松地将已变基的分支推送回远程仓库。您需要使用 强制执行此操作git push --force
,但这会覆盖远程分支,并可能导致其他协作者遇到问题。换句话说,请避免仅使用变基来清理正在进行的功能,而不是主分支,以免给团队成员带来困惑并造成繁琐的冲突。
希望这些比较对您有所帮助,并且易于理解。我每周六都会探索、定义和讲解 Git 概念!
如果您是 git 新手,请查看我之前的文章《Git 解释:基础知识》。
文章来源:https://dev.to/milu_franz/git-explained-an-in-deep-comparison-18mk