我在用Git做实验。我有一个文件 a.txt 在仓库和4提交在我的主分支目前。git log:
* aabe7d0 (HEAD -> master, origin/master, origin/HEAD) Updated goats
* 57694cf (tag: customerY_release) Updated sheep
* 791b4cb (tag: customerX_release) Updated cows
* e96a52b Added init contents..'
字符串
我想修改一个较旧的提交,即在提交 791b4cb 中更改文件 a.txt 中的一行。“cats=10”到“cats=100”。然后这个变化应该反映在所有的提交中 791b4cb,57694cf,aabe7d0,并且在这个过程中不应该创建新的提交,树应该在最后看起来一样。
我尝试了以下引用:https://stackoverflow.com/questions/8824971/how-to-amend-older-git-commit:
git rebase -i HEAD~3 // HEAD~2 did not list the commit 791b4cb...
型
然后将打开的文本编辑器中的行更改为:
edit 791b4cb
pick 57694cf
pick aabe7d0
型
保存...然后在a.txt中进行所需的更改“cats=10”到“cats=100”...然后承诺。
git add a.txt
git commit --amend --no-edit
git rebase --continue
型
但是上面的过程导致了一个不同的树,添加了新的提交。
* f55fdd4 (HEAD -> master) Updated goats
* 59c850d Updated sheep
* 7aee3ea Updated cows
| * aabe7d0 (origin/master, origin/HEAD) Updated goats
| * 57694cf (tag: customerY_release) Updated sheep
| * 791b4cb (tag: customerX_release) Updated cows
|/
* e96a52b Added init contents..'
型
这不是我的本意我希望树从一开始看起来就像所有现有的提交一样:791b4cb,57694cf,aabe7d0 得到合并和修改,在 a.txt 中发生的更改在 791b4cb...在Git中可以做到这一点吗?
1条答案
按热度按时间whlutmcx1#
你的要求毫无意义。
在Git中,每个提交都是文件系统树的一个记录和一个指向其父提交的指针。如果你改变了一个提交的父提交,你实际上是在构造一个 * 不同的 * 提交。然后你复制下一个提交,这也和原始提交类似,但是有不同的父提交。诸如此类。
如果你推送(使用
--force-with-lease
选项),那么上游树将再次看起来像你的本地树。不过,请注意不要使用强制推送来让其他开发人员感到惊讶。