是否可以从标记的提交更改文件?

Is it possible to change a file from a tagged commit?

我正在为一门课程做作业,并且有一个自动测试系统。它将测试我的 Git 存储库中具有特定标签的文件。例如,我对文件进行了提交:

main.cpp
header1.h
header2.h
source1.cpp
source2.cpp

我用标签 A1 标记它们。

现在据我所知标签绑定到提交而不是文件,如果我添加标签它会转到我最后一次提交。因此,如果我未能通过自动化测试用例并且我想更改文件中的某些内容,我必须删除所有文件和标签,然后重新添加并重新提交它们并删除旧标签并创建一个新标签。鉴于有很多不同的测试用例,这需要相当长的时间。我想知道是否有一种方法可以在上次提交时更改文件,这样我就不必删除所有文件并重新上传它们。

就像我在上面提交并看到我没有通过测试用例一样,我会删除所有文件,并删除标签,然后再次重新提交所有文件并给它们一个新标签 A1 所以测试系统找到更新版本。那么是否可以选择更改现有标签下的文件?

在 Git 中,提交是不可变的,因此无法更改。由于标记指向提交,解决这种情况的唯一方法是移动标记。

首先,不需要删除所有的文件;只需进行您需要的任何更改并再次提交:

# edit files
git add .
git commit

这将在您当前的分支上创建一个新的提交(可能 master)。

接下来,如How can I move a tag on a git branch to a different commit?所述,移动标签:

git push origin :refs/tags/A1
git tag -f A1
git push origin --tags

您可以像这样强制更新标签,但与分支不同,标签被设计为永不移动。因此,您可能想询问您的 teacher/professor 是否可以将测试系统设置为构建给定的分支,而不是标签。那么你可以这样做:

git checkout master
# do work, commit, push
# when ready to test:
git checkout A1 # now a branch
git merge --ff-only master
git push origin A1