Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分,每天都要与之互动。
精通Git不仅能简化你的日常操作,还能显著提高生产力。在这篇文章中,我们将探讨一组能够极大提升生产力的命令。
随着对这些命令越来越熟练的运用,会节省大量的时间,成为一个更高效的软件工程师。
Git 术语
在逐一深入探讨Git命令之前,我们先来熟悉一些基本的Git术语。这不仅有助于更好地理解这些命令,而且在本文后续的部分使用这些术语时,也能避免混淆。
HEAD
在Git中,HEAD
是一个特殊的指针/引用,始终指向当前分支中的最新提交。当你进行新的提交时,HEAD
会向前移动,指向那个新的提交。例如,如果你处于main
分支,并进行了新的提交,HEAD
现在将指向那个新的提交,表明它是main
分支中最新的提交。
^(尖角符号):
在Git中,^
符号用作导航穿越项目历史时间线的手段。当你使用HEAD^
时,它引用的是你当前提交之前的提交。如果你在^
后面追加一个数字,比如HEAD^2
,它指的是当前提交之前的第二个提交。简而言之,^
符号允许你在项目的历史中向后遍历,而数字值让你能够精确地确定你希望回退的提交数量。
暂存(Staging)
暂存是你组装下一个提交中想要包含的更改的地方。暂存让你能够仔细策划你的提交,使其易于审查、组织和完善你的修改。有了暂存,你可以控制哪些更改包含在你的提交中。要暂存更改,你使用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
来切换到它。
可以使用以下命令在一个步骤中完成这两个任务:
代码语言:javascript复制git checkout -b branchName
-b
标志和git checkout
命令一起使用,不仅允许我们创建一个新的分支,还能立即切换到它。
3、删除一个Git分支
要在Git中删除一个分支,可以使用git branch -d
或者git branch -D
命令。-d
选项是安全删除,它只会在该分支已经完全合并到当前分支时才删除它。-D
选项是强制删除,无论该分支是否已经完全合并都会删除它。以下是命令。
安全删除(检查合并):
代码语言:javascript复制git branch -d branchName
强制删除(不检查合并):
代码语言:javascript复制git branch -D branchName
4、重命名一个Git分支
要重命名一个分支,可以使用git branch -m
命令,后面跟着当前分支名和新的期望分支名。例如,如果你想把一个叫做oldBranch的分支重命名为newBranch,执行以下命令:
git branch -m oldBranch newBranch
然而,如果你想重命名现在正工作的当前分支,而不显式指定旧名称,可以使用以下命令:
代码语言:javascript复制git branch -m newBranchName
这里,你不需要指定旧的分支名,因为Git会假设你想将当前分支重命名为新的名称。
5、取消暂存特定文件
有时,可能想要从暂存区中移除特定的文件,以便在提交前进行额外的修改。使用:
代码语言:javascript复制git reset filename
这将取消该文件的暂存状态,同时保持你的更改不变。
6、丢弃对特定文件的更改
如果你想完全放弃对特定文件所作的更改,并将其恢复到最后一次提交的状态,使用:
代码语言:javascript复制git checkout -- filename
这个命令确保文件回到它之前的状态,撤销任何最近的修改。它是一种在不影响其他更改的情况下重新开始编辑特定文件的有用方式。
7、更新你的最后一次 Git 提交
想象一下,你刚刚在Git仓库中做了一个提交,但随后你意识到你忘记在那次提交中包含一个更改,或者你可能想要修正提交信息本身。你不想为这个小改动创建一个全新的提交。相反,你想要把它添加到之前的提交中。这时可以使用的命令:
代码语言:javascript复制git commit --amend -m 'message'
这个命令修改了你最近做的提交。它将任何已暂存的更改(你已经用git add
添加的)和你的新评论结合起来创建一个更新的提交。
需要记住的一点是,如果你已经将提交推送到远程仓库,你需要使用 git push --force
来强制推送更改以更新远程分支。因为标准的git push
操作是将一个新的提交追加到你的远程仓库,而不是修改最后的提交。
8、暂存更改
想象你正在同时在两个不同的分支上工作,A和B。当你在分支A上做更改时,你的团队要求你在分支B中修复一个bug。当你尝试使用git checkout B
切换到分支B时,Git阻止了这个操作,并显示了一个错误:
我们可以按照错误消息的建议提交更改。但提交更像是一个固定的时间点,并不是一个正在进行中的工作。这时可以应用错误消息的第二个建议并使用暂存功能的地方。我们可以使用这个命令来暂存更改:
代码语言:javascript复制git stash
git stash
临时保存你还没准备好提交的更改,允许你切换分支或者在不提交未完成工作的情况下进行其他任务。
要在我们的分支中重新应用暂存的更改,你可以使用git stash apply
或者git stash pop
。这两个命令都恢复最新暂存的更改。应用暂存只是恢复更改,而弹出暂存则是恢复更改并将其从暂存中移除。
9、还原Git提交
想象你正在一个Git项目上工作,发现一个特定的提交引入了一些不希望的更改。你需要撤销这些更改,但又不想从历史记录中擦除该提交。你可以使用以下命令来撤销那个特定的提交:
代码语言:javascript复制git revert commitHash
这是一种安全且非破坏性的方式来纠正你的项目中的错误或不想要的修改。 例如,假设你有一系列的提交:
- 提交 A
- 提交 B(这里引入了不希望的更改)
- 提交 C
- 提交 D
为了逆转提交B的影响,运行如下命令:
代码语言:javascript复制git revert commitHashOfB
Git将会创建一个新的提交,我们称之为提交E,它将抵消提交B引入的更改。提交E成为你分支中的最新提交,项目现在反映的状态就像提交B从未发生过一样。
如果你想知道如何检索提交哈希值,使用git reflog
是直接的。在下面的截图中,高亮的部分代表你可以轻松复制的提交哈希值:
10、重置Git提交
假设你对项目进行了提交。然而,在检查后,你意识到需要调整或完全撤销最后一次提交。对于这种情况,Git提供了这些强大的命令。
软重置:
代码语言:javascript复制git reset --soft HEAD^
当使用git reset --soft HEAD^
时,执行一个软重置。这个命令允许回溯到最后一次提交,同时保留所有更改在暂存区中。简单来说,可以使用这个命令轻松地撤销提交,同时保留你的代码更改。当需要修改最后的提交,也许是在再次提交之前添加更多更改时,这很方便。
混合重置:
代码语言:javascript复制git reset --mixed HEAD^
这是当你不指定--soft
或--hard
时使用git reset HEAD^
的默认行为。它撤销了最后的提交,并从暂存区中移除了它的更改。然而,它会保留这些更改在工作目录中。当你想要撤销最后的提交并从头开始进行更改,同时在重新提交之前保持更改在工作目录中时,这很有帮助。
硬重置:
代码语言:javascript复制git reset --hard HEAD^
现在,来看看git reset --hard HEAD^
。它会彻底抹除最后的提交以及所有相关更改从你的Git历史记录中。当你使用--hard
标志时,就没有回头路了。所以在你想要永久性地丢弃最后的提交及其所有更改时,一定要非常谨慎地使用。
小结
希望这篇文章对你有所帮助,可以学到了一些新的Git命令。