更改/添加文件到git标签?

时间:2014-10-14 13:27:44

标签: git bash tags

我只是熟悉git和现在的git标签。根据我迄今所理解的内容,标签只是我们想要跟踪的历史时间点的快照。例如,对于版本号。

当我们现在使用的是2.0版时,我有一个客户希望我将错误修复程序添加/回溯到版本1.0。我们的想法是,当我们对新的v1.0框进行成像时,会包含错误修复。

我不确定我该怎么做。

我在回购中有以下标签:

v2.0
v1.0
v0.1

我已尝试通过运行命令

来检出已标记的版本
git checkout v1.0

然后我做了我的bug修改。 然后我尝试了:

git add .
git commit
git push

当我执行推送时,我收到一条错误消息,指出更新被拒绝,因为推送的分支提示位于其远程对应的后面。
我目前正在搜索此错误,但我想知道,如果从根本上说,我做了一些我不应该做的事情。

2 个答案:

答案 0 :(得分:5)

覆盖标签/版本通常是一种不好的做法。由于您只想修复旧版本中的错误,因此git的工作方式是创建一个修复了该错误的新标记。

这就是我们拥有CHANGELOG thing的原因 - 它可以帮助人们查看版本/版本之间的差异。

如果修复旧版本(v0.1.0)中的错误,而新版本(v0.2.0)包含更改日志但无法与旧版本同步,则可能需要创建像v0.1.1这样的新标记:

# creating v0.1.0
git init
echo "console.log('Hello Wrold')" > main.js
git add .
git commit -m 'Initial commit'
git tag v0.1.0
git remote add origin ...
git push --all
git push --tags
# creating v0.2.0
echo "console.log('Hello Mars')" > main.js
git commit -m 'Hello Mars instead of Hello world' .
git tag v0.2.0
git push --all
git push --tags
# fixing typo from v0.1.0 (edit/add files) and creating v0.1.1
git checkout v0.1.0
echo "console.log('Hello World')" > main.js
git commit -m 'Fixed typo.' .
git tag v0.1.1
git push --tags
# go back to main branch
git checkout master

Fixed typo.提交不会出现在master分支中,因为它仅在v0.1.1代码中添加。


那么,如果我想覆盖v0.1.0怎么办?如果这是一种不好的做法,那么就不可能做到这一点。我们可以删除旧版git tag v0.1.1并重新创建,而不是创建新版本(v0.1.0),强制推送远程版本:

... # fixed typo
git tag -d v0.1.0
git tag v0.1.0
git push --tags -f
# go back to main branch
git checkout master

在GitHub上,它的发布将如下所示:

  

让我们看看差异:

$ git diff v0.1.0 v0.2.0 
diff --git a/main.js b/main.js
index 07e8cb2..7b366c5 100644
--- a/main.js
+++ b/main.js
@@ -1 +1 @@
-console.log('Hello Wrold')
+console.log('Hello Mars')
$ git diff v0.1.1 v0.2.0
diff --git a/main.js b/main.js
index ba72797..7b366c5 100644
--- a/main.js
+++ b/main.js
@@ -1 +1 @@
-console.log('Hello World')
+console.log('Hello Mars')
$ git diff v0.1.0 v0.1.1
diff --git a/main.js b/main.js
index 07e8cb2..ba72797 100644
--- a/main.js
+++ b/main.js
@@ -1 +1 @@
-console.log('Hello Wrold')
+console.log('Hello World')

答案 1 :(得分:2)

您将tagscommits混淆。通常tags类似于pointers to commits

对于您的场景,典型的模型如下

# Create a release branch for v1 
git checkout -b v1_release v1.0
# make your bug fixes, `git commit`, etc.
emacs foo
git add foo
git commit -m "critical bug fix"
# tag your new release 
git tag v1.1
# push the branch and the tags to the server 
git push ...

要查看哪些版本具有此修复程序,您可以使用git branch --contains FIX_SHAgit tag --contains FIX_SHA

你也可以在那里创建一个v2_release分支和git merge修复程序。

我绝不会建议为闪存到硬件上的两个不同代码映像重用相同的版本号。这听起来像是客户关系和支持的噩梦。