推送至远程之前如何撤销 Git 提交

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本教程中,你将学习如何在推送到远程仓库之前撤销 Git 提交。我们将涵盖 Git 提交和分支的基础知识,并探索有效管理 Git 历史记录的实际场景和技术。无论你是初学者还是有经验的 Git 用户,本指南都将为你提供在提交推送到远程之前撤销它们的知识,确保你的 Git 仓库干净且有条理。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/DataManagementGroup(["Data Management"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/commit("Create Commit") git/DataManagementGroup -.-> git/reset("Undo Changes") git/DataManagementGroup -.-> git/stash("Save Changes Temporarily") git/DataManagementGroup -.-> git/restore("Revert Files") git/BranchManagementGroup -.-> git/branch("Handle Branches") git/BranchManagementGroup -.-> git/checkout("Switch Branches") git/BranchManagementGroup -.-> git/merge("Merge Histories") git/BranchManagementGroup -.-> git/rebase("Reapply Commits") subgraph Lab Skills git/commit -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} git/reset -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} git/stash -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} git/restore -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} git/branch -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} git/checkout -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} git/merge -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} git/rebase -.-> lab-398128{{"推送至远程之前如何撤销 Git 提交"}} end

理解 Git 提交和分支

什么是 Git 提交?

Git 提交是项目文件在特定时间点的快照。当你对项目进行更改并想要保存这些更改时,你会创建一个新的提交。每个提交都包含你所做的更改以及一条描述你更改内容的消息。

Git 分支

在 Git 中,分支是一条独立的开发线路。当你开始一个新功能或修复一个漏洞时,你通常会创建一个新分支,将你的工作与主代码库隔离开来。这使你能够同时处理多个功能或漏洞修复,而不会影响主项目。

graph LR A[主分支] --> B[功能分支] A --> C[漏洞修复分支]

提交更改

要在 Git 中提交更改,你可以按以下步骤操作:

  1. 使用 git add 添加你想要包含在提交中的文件。
  2. 使用 git commit -m "提交消息" 创建一个带有描述性消息的新提交。
## 将文件添加到暂存区
git add file1.txt file2.py

## 使用消息提交更改
git commit -m "实现新功能"

查看提交历史记录

你可以使用 git log 命令查看提交历史记录。这将显示提交消息、作者以及每个提交中所做的更改。

## 查看提交历史记录
git log

## 查看更简洁的提交历史记录
git log --oneline

理解分支与提交的关系

提交通过分支结构相互连接。当你在不同分支之间切换时,实际上是在不同的提交历史记录之间切换。

graph LR A[主分支] --> B[提交 1] B --> C[提交 2] C --> D[提交 3] A --> E[功能分支] E --> F[提交 4] E --> G[提交 5]

在推送到远程之前撤销提交

修改最后一次提交

如果你在最后一次提交中犯了错误,并且尚未将其推送到远程仓库,你可以使用 git commit --amend 命令来修改该提交。

## 对文件进行更改
git add file1.txt file2.py
git commit --amend -m "修正上一次提交中的拼写错误"

这将用一个包含你最新更改的新提交替换上一次提交。

重置到上一次提交

如果你想在推送到远程之前撤销多个提交,可以使用 git reset 命令。这会将分支指针移回到指定的提交,从而有效地撤销该点之后的所有提交。

## 将分支重置到上一次提交
git reset HEAD~2

这将撤销最后两次提交,但保留工作目录中的更改。

丢弃本地更改

如果你想完全丢弃本地更改并恢复到上一次提交的状态,可以使用 git checkout 命令。

## 丢弃所有本地更改
git checkout.

这将丢弃工作目录中的所有更改,并使你的项目处于最后一次提交的状态。

将更改推送到远程

在撤销本地提交之后,你可以将更改推送到远程仓库。如果你使用了 git resetgit commit --amend,可能需要使用 git push --force 强制推送更改。

## 将更改推送到远程仓库
git push

处理冲突

如果你已经将提交推送到远程仓库,而在此期间其他人进行了更改,那么在尝试推送你的更改时可能会遇到冲突。在这种情况下,你需要在推送更改之前解决冲突。

## 从远程拉取最新更改
git pull
## 解决文件中的冲突
git add.
git commit -m "解决冲突"
git push

实际场景与技巧

场景1:修正最后一次提交中的拼写错误

假设你刚刚提交了一个更改,但你注意到提交消息中有一个拼写错误。你可以使用 git commit --amend 命令来修正它:

## 修正最后一次提交中的拼写错误
git commit --amend -m "修正上一次提交中的拼写错误"

这将用上一个包含修正后的提交消息的新提交替换上一次提交。

场景2:在本地撤销多个提交

如果你已经进行了几次提交,并且想在推送到远程仓库之前全部撤销,你可以使用 git reset 命令:

## 撤销最后3次提交,但保留工作目录中的更改
git reset HEAD~3

## 撤销最后3次提交并丢弃所有更改
git reset --hard HEAD~3

第一个命令会将分支指针向后移动3次提交,但保留工作目录中的更改。第二个命令会丢弃所有更改。

场景3:丢弃特定更改

如果你对多个文件进行了更改,而只想丢弃对特定文件的更改,可以使用 git checkout 命令:

## 丢弃对特定文件的更改
git checkout -- file1.txt

这将丢弃对 file1.txt 所做的所有更改,并将其恢复到最后一次提交的状态。

场景4:推送时解决冲突

如果你对一个在远程仓库中也被修改的文件进行了更改,在尝试推送你的更改时会遇到冲突。在这种情况下,你需要在本地解决冲突,然后推送更改:

## 从远程拉取最新更改
git pull
## 解决文件中的冲突
git add.
git commit -m "解决冲突"
## 将更改推送到远程
git push

这个过程包括从远程拉取最新更改、解决文件中的冲突、创建一个新提交,然后将更改推送到远程仓库。

总结

在本教程结束时,你将对如何在推送到远程仓库之前撤销 Git 提交有扎实的理解。你将能够浏览你的 Git 历史记录,还原或修改提交,并维护一个干净且有条理的代码库。这些知识将使你能够掌控你的 Git 工作流程,并避免因过早提交而可能出现的潜在问题。