我正在为课程做作业,并且有一个自动测试系统。它将测试我的Git存储库中具有特定标记的文件。例如,我使用文件进行提交:
main.cpp
header1.h
header2.h
source1.cpp
source2.cpp
我用标签A1
标记它们。
现在据我所知,标签被绑定到提交而不是文件,如果我添加标签,它会转到我做的最后一次提交。因此,如果我在自动化测试用例中失败并且我想要更改文件中的某些内容,我必须删除所有文件和标记,然后读取并重新发送它们并删除旧标记并创建一个新标记。考虑到有很多不同的测试用例,这需要相当长的时间。我想知道是否有一种方法可以在我上次提交时更改文件,这样我就不必删除所有文件并重新加载它们。
就像我上面提交并看到我的测试用例失败一样,我会删除所有文件,然后删除标签,之后再次重新发送所有文件并给它们一个新标签A1
,以便测试系统找到更新的版本。那么是否可以选择在现有标签下更改文件?
答案 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