Git和GitHub是每个软件工程师必须了解的最基础的东西,开发人员的日常工作中都要与这些工具进行交互。精通Git可以简化工作,极大提高生产力。
本文,我们分享一组开发者必知的Git命令。
Git 术语
先熟悉一些基本的Git术语。这能够帮助更好地理解Git命令。
- HEAD:
在Git中,HEAD是个特殊的指针/引用,它始终指向当前分支中最新的提交。当您进行新的提交时,HEAD会向前移动,指向该新的提交。例如,如果在main分支上进行了新的提交,HEAD将指向该新的提交,表示它是main分支中最新的提交。
- ^(插入符号):
在Git中,符号^用于导航项目的历史时间线。当使用HEAD^时,它引用的是当前提交之前的提交。如果在^后附加一个数字,例如HEAD^2,它引用的是当前提交之前的第二个提交。简而言之,^符号允许在项目历史中向后遍历,而数字值则可以精确指定要回溯的提交数量。
- 暂存区:
暂存区是用来存放开发人员希望在下一次提交中包含的更改的地方。暂存区可以选择要提交的内容,审查、组织和完善您的修改。通过使用暂存区,可以控制哪些更改将被包含在提交中。当使用git add命令时,实际上是将更改添加到暂存区,可以类比为声明:“我希望这些更改成为我下一次提交的一部分。”
现在逐个介绍10个Git命令。
1 将文件添加到暂存区并提交
通常,在Git中,使用git add *命令将所有修改过的文件放入暂存区,然后使用git commit -m "commitMessage"命令提交这些更改。然而,有一种更简化的命令,可以在一个步骤中完成这两个任务:
git commit -am "commitMessage"
-am标志允许开发人员在一个高效的操作中既将这些更改放入暂存区,又进行提交。
2 创建并切换到Git分支
与前面的情况类似,有另一条命令将这两个命令的功能合并在一起。不需要使用两个单独的命令,git branch branchName用于创建一个分支,然后git checkout branchName用于切换到该分支,可以使用以下命令在一个步骤中完成这两个任务:
git checkout -b branchName
带有git checkout命令的-b标志允许开发人员不仅创建一个新分支,还立即切换到该分支。
3 删除Git分支
要在Git中删除一个分支,可以使用git branch -d或git branch -D命令。-d选项用于安全删除,只有当该分支完全合并到当前分支时才会删除该分支。-D选项用于强制删除,无论该分支是否完全合并,都会删除在Git中,以下是命令示例:
安全删除(检查合并情况):
git branch -d branchName
强制删除(不检查合并情况):
git branch -D branchName
4 重命名Git分支
要重命名一个分支,可以使用git branch -m命令,后面跟上当前分支名称和新的目标分支名称。例如,如果想将一个名为oldBranch的分支重命名为newBranch,可以运行以下命令:
git branch -m oldBranch newBranch
然而,如果想要重命名当前正在工作的分支,而不明确指定旧的名称,可以使用以下命令:
git branch -m newBranchName
在这种情况下,无需指定旧的分支名称,因为Git会假设您想将当前分支重命名为新的名称。
5 取消暂存特定文件
有时,开发人员可能希望从暂存区中移除特定文件,以便在提交之前进行其他修改。使用以下命令:
git reset filename
这将取消暂存该文件,同时保留您的更改。
6 放弃对特定文件的更改
如果想要完全放弃对特定文件的更改,并将其恢复为上次提交的状态,请使用以下命令:
git checkout -- filename
该命令将确保文件返回到其以前的状态,撤消任何最近的修改。这是一种有用的方法,可以在不影响其他更改的情况下重新开始处理特定文件。
7 更新最后的Git提交
假设刚刚在Git仓库中进行了一次提交,然后意识到您忘记在该提交中包含一个更改,或者想要修复提交消息本身。您不希望为这个小的更改创建一个全新的提交。相反,您想要将其添加到先前的提交中。这时可以使用以下命令的地方:
git commit --amend -m 'message'
该命令修改最近进行的提交。它将任何暂存的更改(使用git add添加的更改)与新的注释结合起来,创建一个更新后的提交。
需要记住的是,如果您已经将提交推送到远程仓库,需要使用git push --force强制推送更改以更新远程分支。因为标准的git push操作将一个新的提交附加到您的远程仓库,而不是修改最后的提交。
8 保存更改
假设您正在两个不同的分支A和B上进行工作。当在A分支上进行更改时,团队要求您在B分支上修复一个错误。当尝试使用git checkout B切换到B分支时,Git会阻止并显示错误信息:
图片
如果收到错误消息并建议提交更改,那么提交是一个固定点,会将更改记录在项目的历史中。但是,如果您仍然需要在当前工作中继续进行其他修改,不想立即提交这些更改,那么可以使用"stash"功能来隐藏这些修改:
git stash
git stash会暂时保存尚未准备好提交的更改,允许切换分支或在其他任务上工作,而无需提交不完整的工作。
要在分支中重新应用已隐藏的更改,可以使用git stash apply或git stash pop。这两个命令都会恢复最新的隐藏更改。stash apply仅仅恢复更改,而pop则恢复更改并将其从隐藏中移除。
9 回滚 Git 提交
想象一下,你正在一个 Git 项目上工作,然后发现某个提交引入了一些不良的改动。你希望撤销这些改动,但又不想完全删除该提交的历史记录。在这种情况下,可以使用以下命令来撤销特定的提交:
git revert commitHash
这是一种安全且非破坏性的方式来纠正项目中的错误或不必要的修改。
举个例子,假设你有一系列的提交:
- 提交 A
- 提交 B(在这里引入了不良的改动)
- 提交 C
- 提交 D
要撤销提交 B 的影响,运行:
git revert commitHashOfB
Git 会创建一个新的提交,我们称之为提交 E,它会抵消提交 B 引入的改动。提交 E 成为你的分支中最新的提交,项目的状态将回到提交B之前的状态。
如果想知道如何获取提交哈希值,可以使用 git reflog 命令。在下面的截图中,被标记的部分表示你可以复制的提交哈希值:
图片
10 重置 Git 提交
假设你已经对项目进行了一次提交。然而,在检查之后,你意识到需要调整或完全撤销你最后一次的提交。针对这种情况,Git 提供了以下强大的命令:
10.1 软重置
git reset --soft HEAD^
当使用 git reset --soft HEAD^ 命令时,你进行了一次软重置。这个命令将回退到上一次的提交,同时保留所有在暂存区中的修改。简单来说,你可以轻松地取消提交,同时保留你的代码修改。当需要修改上一次的提交,可能是为了再次提交之前添加更多的修改时,这个命令非常有用。
10.2 混合重置
git reset --mixed HEAD^
当使用 git reset HEAD^ 命令而没有指定 --soft 或者 --hard 参数时,它的行为会默认为混合重置。这种方式会撤销上一次的提交,并从暂存区中删除该提交的改动,但是会保留这些改动在工作目录中。
这个命令非常有用,可以实现撤销上一次的提交,并重新开始进行修改,同时保留工作目录中的改动以便重新提交。
10.3 硬重置
git reset --hard HEAD^
硬重置会彻底抹去最后一次提交以及与之相关的所有改动。使用 --hard 参数时,无法回退。所以当想要永久丢弃最后一次提交和它的所有改动时,请谨慎使用这个命令。