改变特定标签的git历史记录?

时间:2014-01-19 22:59:39

标签: git github

所以我正在使用Git做一些有点奇怪的事情,基本上我正在创建一个教程,我在这个过程的不同阶段对它进行标记。在每个标签处,README是不同的。我意识到上一步README中有一个拼写错误。

如何在特定代码中插入更改并将其更改?

  1. 我意识到这不是Git的用途。
  2. 我愿意接受更好的想法。
  3. 提前致谢。
  4. 澄清:我想我想插入一个提交,然后移动标签。只是不确定如何。

4 个答案:

答案 0 :(得分:2)

所以这就是我最终做的事情:

git checkout master

# create a copy of master
git branch master_copy

# move back to the tag where I want to change something
git reset --hard tagname

# (make changes here)
# and commit them
git commit -am "fixed something"

# tag it with a temp tag
git tag temp_tag

# delete the old tag
git tag -d tagname

# merge master_copy back onto it
git merge master_copy

# rename temp_tag to tagname
git tag tagname temp_tag
git tag -d temp_tag

# get rid of the master_copy 
git branch -d master_copy

答案 1 :(得分:1)

git中的提交是不可侵犯的 - 您无法更改提交。提交是递归定义的 - 它包括先前的提交。所以你不能只改变历史中的一个点。

你可以在错误发生之前检查最后一个好的提交 - 然后做出一个好的提交。现在,您需要将错误后标记中的所有更改重新绑定到最后一个标记。

然后你需要将错误后创建的标签移动到重新提交的提交中(使用带-f选项的git标签)。

在伪代码中(你可以使用提交的SHA代替这里的数字):

3
|
2
|
1 - mistake 
|
0

git checkout 0
* make changes *
git commit -m

3
|
2
|
1  1' (good)
| /
0

git rebase --onto 1' 1..3
* fix merge conflicts etc.*

3 3'
| |
2 2'
| |
1 1'
|/
0

现在你必须删除1,2,3上的标签并在1',2'和3'上重新创建它们(或者在git标签上用force选项移动它们)。随着旧标签的消失(假设旧提交中的任何分支名称也被删除),git gc将删除旧提交。

答案 2 :(得分:0)

如果我理解正确,您的教程用户将依次查看标签以完成教程。

在这种情况下,您需要修复错误,然后将标记移动到该提交。

我认为您需要使用我们正在讨论的标记从当前提交中分支,使用固定的README提交分支,然后移动标记。

您可以在此处了解如何实际移动代码:How can I move a tag on a git branch to a different commit?

答案 3 :(得分:0)

Git标签确实是你的教程情况的方法,我也看到它被用于其他基于git的教程。现在我们正在谈论改变git历史,它也值得一提http://rtyley.github.io/bfg-repo-cleaner/,这个工具旨在处理错误的东西在已经被推送的提交中结束的情况。它可能不完全适合您的情况,但我可以想象从这个工具中受益的人可能最终会发现这个stackoverflow问题。