Git 教程:如何修复 18 个常见错误
本文汇集了团队使用 Git 时最常见的 18 个问题及其解答。有些 Git 问题比较棘手,即使对于经验丰富的 Git 用户来说,也难以解答。例如,您是否忘记了包含某项更改,或者在提交信息中犯了错误?别担心。在这种情况下,您或您的团队所做的更改通常需要回滚或撤消。几乎所有 Git 操作都可以执行此操作,例如提交、合并、本地或远程更改,甚至未提交的更改。所有这些都可以“撤消”。
以下是本文的目录:
- 如何创建 Git 分支?
- 如何重命名 Git 分支?
- 如何删除本地 Git 分支?
- 如何删除远程 Git 分支?
- 如何通过 Git 签出远程分支?
- 如何编辑(修改)Git 提交消息?
- 如何撤消最后一次提交?
- Git 如何恢复到上一次提交?
- 如何恢复已推送到远程的提交?
- Git 如何恢复单个文件?
- 如何撤消 Git 添加?
- 如何从 gGit 中删除文件而不将其从文件系统中删除?
- Git Pull 与 Git Fetch
- 如何强制“Git pull”覆盖本地文件?
- 收到“需要合并”错误时如何推送到 GitHub?
- 如何在 GitHub 仓库中创建标签?
- 如何在 Git 中克隆所有远程分支?
- 如何更新或同步分叉的存储库?
1.如何创建Git分支?
在开始创建新分支之前,请确保您的 master/main 已更新最新更改:
$ git pull
完成上述步骤后,您可以创建新的分支并直接切换到该分支:
$ git checkout -b <new-branch-name>
或者,您可以直接创建新分支而不切换到该分支:
$ git branch <new-branch-name>
如果您想要在创建新分支后切换到新分支,只需使用:
$ git checkout <new-branch-name>
现在分支已创建,您可以将其推送到 GitHub:
$ git push origin <new-branch-name>
2.如何重命名 Git 分支?
为了重命名 Git 分支,一种选择是首先切换到该分支并按照以下步骤操作:
$ git checkout <old-branch-name>
之后,您应该会看到一条确认切换成功的消息:
切换到分支
现在您可以通过以下方式重命名分支:
$ git branch -m <new-branch-name>
重命名 Git 分支的另一种方法是仅使用一行,指定旧名称和新名称:
$ git branch -m <old-branch-name> <new-branch-name>
重命名 Git 分支后,建议检查其状态:
$ git branch -a
3.如何删除本地Git分支?
当开发人员开发不同的功能时,他们通常会创建其他分支,与包含主代码的主分支分开。
一旦某个功能的工作完成,通常建议删除该分支。
由于 Git 不允许您删除当前所在的分支,因此您必须先切换到未删除的分支,然后才能删除您想要的分支:
$ git checkout main // or master
$ git branch -d <branch-name>
如果分支尚未被推送或合并,您可以使用 -D 而不是 -d 强制删除该分支。
4.如何删除远程 Git 分支?
为了远程删除分支,您应该使用下一个命令:
$ git push <remote-name> --delete <branch-name>
5.如何使用 Git checkout 远程分支?
在团队协作时,您可能会使用远程仓库,这些仓库可以托管在本地,也可以存放在同事的本地副本中。每个远程仓库都包含各自的分支。要切换到远程分支,您必须先获取该分支的内容,然后再切换到该分支:
$ git fetch --all
$ git checkout <remote-branch-name>
6. 如何编辑(修改)Git 提交消息?
出于某些原因,在某些情况下,你可能想要更改提交信息。首先,你需要知道,编辑提交信息实际上意味着创建一个新的提交并替换旧的提交。
如果你还没有将你的提交推送到 GitHub,并且它只存在于你的本地仓库中,这里有一个简单的方法可以更改你最后一次提交的消息。在命令行中转到包含你最后一次提交的仓库,然后输入:
$ git commit --amend
接下来,您需要编辑提交消息并保存新的提交。下次推送时,您应该能够在 GitHub 上看到新的提交和消息。
您可能已经将提交推送到 GitHub,不用担心,您仍然可以更改最近的提交信息。为此,您需要强制推送包含修改后信息的提交。请注意:我们不建议这样做,因为它会更改您仓库的历史记录,因此请仅在绝对必要的情况下使用此选项。
首先,按照上述步骤操作,然后输入:
$ git push --force-with-lease <branch-name>
7.如何撤消最后一次提交?
您不小心向 Git 提交了错误的文件,但尚未将提交推送到您的 Git 仓库。由于您尚未推送到远程仓库,因此您的更改尚未公开。此时,您可以撤消更改。撤消上次 Git 提交的最简单方法是执行带有“-soft”选项的 $ git reset 命令,这将保留对文件所做的更改。您必须指定要撤消的提交,在本例中为“HEAD~1”。
$ git reset --soft HEAD-1
如果要删除最后一次提交,可以执行$ git reset
带有 “-hard” 选项的命令。更改将从工作目录和索引中删除,因此您将丢失所有修改。
$ git reset --hard HEAD-1
注意:如果您不熟悉这种符号,“HEAD~1”表示您想要将 HEAD(最后一次提交)重置为日志历史记录中的一次提交之前。
$ git log --oneline
8.如何恢复到上一个提交?
首先,使用 git log 命令获取提交列表以获取提交 ID:
$ git log --online
如果您想暂时返回到上一次提交,然后返回到原来的位置,您只需检出所需的提交:
$ git checkout <0c2a9da42>
或者,如果您想在那里进行提交,请继续创建一个新的分支:
$ git checkout -b old-state <0c2a9da42>
另一方面,如果你想彻底清除此后所做的一切,但你没有推送任何提交,那么也有可能。你只需重置即可:
$ git reset --hard <0c2a9da42>
如果你已经推送了提交,仍然有办法移除它们。查看下一个主题来了解如何操作。
9. 如何恢复已推送到远程的提交?
如果您已将提交链推送到远程仓库,则“还原”是取消更改的更佳方法。“还原”命令会在提交链末尾添加新的提交。
$ git revert <0c2a9da42>
10.如何使用 Git 恢复单个文件?
您已对某个文件进行了多项更改并提交。现在您想恢复到先前的文件版本。您可以执行以下操作将单个文件恢复到其先前的状态。
如果文件未提交,您可以使用:
$ git checkout <filename>
如果文件已经提交,您应该找到提交的哈希值和文件的路径,然后在终端中运行此命令:
$ git checkout <commit-hash> -- <path/to/file>
// e.g.
$ git checkout <0c2a9da42> -- assets/main.css
您可以轻松查看对给定文件进行修改的提交,并且可以通过运行以下命令获取正确的提交哈希
$ git log path/to/file
11.如何撤消Git add?
您使用 $ git add 命令将多个文件移动到暂存区,但不再希望成为提交的一部分,那么简单的重置就可以完成这项工作:
// for all files
$ git reset // OR
$ git reset HEAD // OR
$ git reset
如果你想取消暂存单个文件,你可以使用:
// for single file
$ git reset <filename> // OR
$ git reset HEAD <filename> // OR
$ git reset @ <filename>
您所做的更改仍将保留在文件中。上述命令只是将该文件从暂存区中移除。该$ git reset
命令允许您将当前分支重置为特定状态。您可以重置特定文件以及整个分支的状态。
注意:HEAD是对当前提交的引用。从 Git v1.8.5 开始, @单独是 head 的快捷方式。
12. 如何从 Git 中删除文件而不将其从文件系统中删除?
你在 Git 上提交了错误的文件,或者你忘记将文件添加到 .gitignore 并提交。现在你想从 Git 中删除该文件,但又不想将其从本地开发环境中移除。
使用 Git 移除单个文件但不删除它:
$ git rm --cached <filename>
使用 Git 移除多个文件而不删除它们
$ git rm --cached <filename1 filename2 filename3>
使用 Git 移除单个目录但不删除它:
$ git rm --cached <directory-name>
--cached
只会从索引中删除,但不允许删除本地系统上的文件。运行 后,远程存储库中的文件将被删除$ git push
。
13. Git Pull 与 Git Fetch
Git pull 和 fetch 是两个常用的命令,因此了解它们之间的区别将会很有用。
假设你正在处理一个克隆仓库,它本质上是另一个仓库的副本。在这种情况下,保持其与原始仓库同步最新更改非常重要。为了做到这一点并将这些更改本地化,你需要使用上述命令。
$ git fetch
此命令允许您从另一个存储库下载对象,但不会执行任何文件传输,这意味着它不会在本地进行任何更改。基本上,它只是检查是否有任何可用的更改。
$ git pull
这条命令会从远程仓库拉取更改,并将它们与本地分支集成。换句话说,git pull 与 git fetch 的作用相同,只是前者后面会执行一些额外的操作:
// e.g.
$ git merge
14.如何强制“git pull”覆盖本地文件?
如果您想用远程分支的副本覆盖所有内容,请注意,您将放弃所有本地更改。
如果您有尚未推送的本地提交,这些提交也将丢失。
要覆盖/重置本地文件,请按照以下步骤操作:
$ git fetch --all
$ git reset --hard origin/<branch-name>
15. 收到“需要合并”错误时如何推送到 GitHub?
如果您在尝试将更改推送到分支之前没有运行 $ git pull,则会收到合并错误。当您收到此错误时,通常意味着其他人已将提交推送到您尝试推送到的同一分支,但您尚未在本地拥有该提交。
要解决此问题,请运行以下代码:
$ git pull origin <branch-name>
$ git push origin <branch-name>
如果您想强制推送,即不想将本地分支与远程分支合并,则可以使用以下语法:
$ git push -f origin <branch-name>
16.如何在GitHub仓库中创建标签?
Git 支持两种类型的标签:轻量级标签和带注释的标签。轻量级
标签非常类似于一个不会更改的分支——它只是指向特定提交的指针。而带注释的标签则以完整对象的形式存储在 Git 数据库中。它们经过校验和;包含标记者的姓名、电子邮件地址和日期;并带有标记消息。通常建议创建带注释的标签。
创建轻量级标签:
$ git tag <tagname> // e.g $ git tag v1.0.0
创建注释标签(推荐):
$ git tag -a <tagname> // e.g $ git tag -a v1.0.0
// or create tag with message
$ git tag -a <tagname> -m "tag description" // e.g $ git tag -a v1.0.0 -m "First release"
推送到远程仓库时,默认不包含标签。您需要明确说明要将标签推送到远程仓库。
推送所有本地标签:
$ git push origin --tags
推送单个标签:
$ git push origin <tagname>
要列出所有标签,请使用以下命令:
$ git tag
17. 如何在 Git 中克隆所有远程分支?
您可以使用git clone 命令克隆本地 Git 仓库。它会将整个仓库克隆到您的系统,然后将当前工作目录更改为克隆的仓库文件夹。
$ git clone git://account_name/reponame
$ cd reponame
如果您想要一次获取多个远程分支,请执行以下操作:
$ git pull --all
接下来,查看存储库中的本地分支:
$ git branch
* main
但是你的仓库里还隐藏着其他分支!你可以使用 -a 参数查看它们:
$ git branch -a
* main
remotes/origin/HEAD
remotes/origin/main
remotes/origin/another-branch
如果您只是想快速浏览一下上游分支,您可以直接查看:
$ git checkout origin/another-branch
但是如果您想在该分支上工作,则需要创建一个本地跟踪分支,该分支通过以下方式自动完成:
$ git checkout another-branch
18. 如何更新或同步分叉的存储库?
您已成功 fork 出您感兴趣的仓库。您需要使其与原始仓库保持同步更新。原始仓库通常被称为“上游 (upstream)”。
打开终端,并在本地计算机上导航到克隆的仓库。本地仓库并非直接链接到原始仓库。您必须在 Git 中配置一个指向上游仓库的远程仓库。
$ git remote -v // list all remote
$ git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
$ git remote -v // verify the new upstream repository
将您的存储库与上游同步需要两个步骤:首先,您必须从远程获取,然后您必须将所需的分支合并到您的本地分支中。
$ git fetch upstream
$ git checkout main
$ git merge upstream/main
完成初始上游设置和主要检查后,您需要做的就是运行以下命令将您的主要内容与上游同步:
$ git pull upstream main
最后的想法
感谢阅读!以下是 Git 开发者经常问的 18 个问题。希望您找到了想要的答案。如果您在 Git 中遇到的问题不在列表中,请在下方评论区与我们分享。
额外资源
查看我们的最新存储库: