所以我正在使用Git做一些有点奇怪的事情,基本上我正在创建一个教程,我在这个过程的不同阶段对它进行标记。在每个标签处,README是不同的。我意识到上一步README中有一个拼写错误。
如何在特定代码中插入更改并将其更改?
澄清:我想我想插入一个提交,然后移动标签。只是不确定如何。
答案 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问题。