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

时间:2016-10-26 16:05:38

标签: git git-tag

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

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

我用标签A1标记它们。

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

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

1 个答案:

答案 0 :(得分:2)

在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

您可以像这样强制更新标记,但标记的设计永远不会移动,与分支不同。因此,您可能想询问您的老师/教授是否可以设置测试系统来构建给定的分支,而不是标记。然后你可以这样做:

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