使用Git拯救一天并从提交历史中移除

你在使用Git时遇到过任何错误或提交问题吗?也许一个错误的秘密或敏感数据已经被保存了。幸运的是,你可以使用Git处理你的文件,从提交中移除并修复历史记录。

如果你已经进行了多次提交或克隆了一个已经存在提交历史记录的仓库,通常你会想回顾一下都有哪些提交。在这个教程中,你将学习如何从Git历史记录中移除一个条目。

继续阅读,用Git挽回局面吧!

先决条件

本教程包含逐步说明。如果你想跟着做,请确保你已经准备好了以下内容:

  • A local machine to test the Git commands – This tutorial uses Windows 10, but later versions will also work.
  • Git Bash – 本教程使用的是Git Bash 2.36。

从Git提交中移除文件

当你在团队中使用Git工作时,你每天会进行数百次提交。因此,有很高的机率你可能需要撤销特定的提交,比如由于一个错误的文件或多个文件。这种需求通常是由于代码或配置的更改而引起的,并且会成为一个问题。

为了解决这个问题,你需要运行Git命令从Git提交中移除文件或多个文件。你将使用一个流行的工具来从Git提交中移除单个文件,即Git Bash工具。

1. 在您的Windows计算机上打开Git Bash工具。

2. 然后,运行下面的命令创建一个存储库文件夹并切换到该文件夹。这些命令在终端上不会提供输出。但请确保将 ~/Desktop/Repository/repo1 替换为您喜欢的文件夹路径和名称。

# 创建Repository文件夹和repo1子文件夹
mkdir -p ~/Desktop/Repository/repo1
# 切换工作目录到repo1
cd ~/Desktop/Repository/repo1

3. 运行以下命令初始化您的存储库并创建两个名为test1.txttest2.txt的文本文件。

# 初始化本地存储库(创建.git隐藏文件夹)
git init
# 创建两个文本文件
touch test_file1.txt test_file2.txt
Initializes the local repository

4. 现在,执行下面的命令检查Git提交的状态。

git status

执行命令后,您会注意到提交是未跟踪的,尚未提交,如下所示。

Checking the status of Git commits on the Git terminal

5. 运行下面的git add命令,将在第三步中创建的两个文本文件(test_file1.txttest_file2.txt)添加到您的本地存储库。

此命令不提供输出,但将文件添加到本地存储库而不将其推送到远程存储库。

git add .

6. 接下来,运行下面的git commit命令,以便Git跟踪您在本地存储库中进行的进展和更改。

git commit -m "Adding two new files test_file1.txt and text_file2.txt"
Committing Changes to Repository

7. 提交后,运行以下命令从 Git 提交中删除特定文件(test_file2.txt)。

git rm --cached test_file2.txt
Removing a Specific File from the Git Commit

8. 最后,重新运行下面的 git status 命令,验证仓库的状态。

git status

正如下面所示,该文件已从暂存区(Git 提交)中移除,并显示该文件(test_file2.txt)在未跟踪文件下。

Verifying the Removed Git Commit (test_file2.txt)

移除所有最近提交的文件

您刚刚学会了从 Git 提交中删除特定文件。但通常,您可能需要删除多个文件,而 Git 可以通过git reset命令完成此任务。git reset 命令是一个复杂但同时多才多艺的工具,用于撤消仓库中的更改。

为了了解 git reset 如何工作,您将提交两个文件,然后重置更改以删除存储在 Git 提交中的最近提交的文件:

1. 在~/Desktop/Repository/repo1文件夹中创建两个名为test_file3.txttest_file4.txt的新文本文件。

touch test_file3.txt test_file4.txt

2. 接下来,运行以下 git add 命令,该命令不提供输出,但将新文本文件添加到您的本地仓库(~/Desktop/Repository/repo1)。

git add .

3. 运行以下 git commit 命令,以提交文件,使 Git 跟踪仓库中的进展和您所做的更改。

git commit -m "Adding two more files"
Committing Changes to the Repository

4. 现在,请运行以下命令来验证本地仓库的状态。

git status

如下所示,输出显示没有要提交的消息,表示仓库中的一切都就绪。

Checking the Status of Git Commits

5. 接下来,运行以下git reset命令,以撤销在第三步中最近进行的提交。这个命令不会提供输出,但会移除文件test_file3.txttest_file4.txt

git reset --soft HEAD~1

您还可以使用git reset –soft HEAD^命令,以移除直到现在已提交的所有文件。

6. 接下来,重新运行以下git status命令,以验证仓库的状态。

git status

下面,输出显示文件test_file3.txt和test_file4.txt需要被提交。这个输出表示这些文件需要从Git提交中移除。

Verifying the Recent Commits were Removed

从Git历史中移除特定提交

如果您想从干净的状态开始,删除所有已提交的文件是个好办法。但是如果您只需要删除特定的提交呢?git revert命令将是解决方案,只要您知道提交的ID。

在“移除最近提交的所有文件”部分的最后一步中,您注意到提交并未提交,而是发生了更改。现在,为了查看git revert命令的效果,您将提交这些更改。

运行以下git commit命令,以提交本地仓库的最新更改。

git commit -m "Hello, I am committing those two files again"

执行命令后,您会注意到两个文本文件已经再次提交,并且提交 ID 是 0315b85, 如下所示。

Committing the Changes in the Local Repository

现在,运行以下 git revert 命令以撤销您在上一步中进行的提交。确保用您提交的 ID 替换 0315b85

git revert 0315b85

下面,您可以看到您最近提交的两个文件已被删除。

Reverting the Changes in the Local Repository

从Git提交历史中删除目录

到目前为止,您已经知道如何删除已提交的文件,但是删除目录呢?从Git提交中删除目录类似于删除文件。

1. 运行下面的命令,它们不提供输出但执行以下操作:

  • 在本地存储库内创建一个名为 myfolder 的文件夹(~/Desktop/Repository/repo1)。
  • ~/Desktop/Repository/repo1/myfolder 文件夹内创建一个名为 l.txt 的文件。
mkdir myfolder && touch myfolder/l.txt

2. 接下来,运行以下git命令将新文件夹(~/Desktop/Repository/repo1/myfolder)添加到您的本地存储库中。

git add .
git commit -m "Adding folder"
Adding the new folder (folder) to the Local Repository

3. 运行以下git rm命令以删除您在第二步中提交的文件夹(myfolder)。

git rm -r myfolder/
Removing the New Folder (folder) in Git Commit

4. 最后,运行git status命令验证存储库的状态,并查看文件夹是否已被删除。

git status

下面,您可以看到整个文件夹(myfolder)以及其中的l.txt文件已成功删除。

Verifying the Folder (myfolder) Has Been Removed Successfully

结论

在本教程中,您已经学会了如何处理Git提交,例如删除特定的提交、文件或多个文件。您还涉及了在本地存储库中删除整个文件夹并提交更改。

到目前为止,您可以自信地提交对存储库的更改并删除您认为不必要的提交,而不会弄乱事情。

根据您在本教程中学到的知识,您认为哪种方法对团队处理提交可能非常出色呢?

Source:
https://adamtheautomator.com/git-and-remove-from-commit/