替换git中的提交

son*_*002 7 git github

我很久以前就提交了一个糟糕的提交,我想将它完全从git历史中删除,好像它从未发生过一样.我知道提交ID让我们说1f020.我已经尝试了git rebase并将其删除,但是在重新定位时存在很多冲突,这是不可能的.该提交是一个简单的1行代码更改,并推送一些与项目无关的文件.所以我想写一行代码更改并提交它,然后替换以某种方式用很久以前的那个替换这个新的提交.

Gre*_*con 6

如果违规提交在私有存储库中,那么您想要做的事情并不是什么大问题.重写已发布的git历史记录会让您的协作者感到恼火,因此请确保删除此行是值得的.

git-rebase文件有一个有用的通道.

git rebase [...] [<--onto newbase>] [<upstream>] [<branch>]
Run Code Online (Sandbox Code Playgroud)

也可以使用rebase删除一系列提交.如果我们有以下情况:

E---F---G---H---I---J  topicA
Run Code Online (Sandbox Code Playgroud)

那么命令

git rebase --onto topicA~5 topicA~3 topicA
Run Code Online (Sandbox Code Playgroud)

会导致删除提交FG:

E---H'---I'---J'  topicA
Run Code Online (Sandbox Code Playgroud)

如果FG在某种程度上存在缺陷,或者不应该成为其中的一部分,那么这很有用topicA.请注意,参数--onto上游参数可以是任何有效的commit-ish.

假设您的历史记录是线性的并且违规提交在您的主分支中,您可以通过运行来调整上面的示例

git rebase --onto 1f020~ 1f020 master
Run Code Online (Sandbox Code Playgroud)

对于更多的情况,使用交互式rebase.您可能会发现按照一个合并两个提交的示例很有帮助,但是不是用s壁球标记提交,而是删除整行以从历史记录中删除提交.


Cur*_*ind 5

这有点复杂,但无论如何,这是它的方式:

分离头并移动到那个糟糕的提交提交.使用git log查找1f020之后的下一次提交.

git checkout <SHA1-for-commit-just-after-bad-commit-1f020>
Run Code Online (Sandbox Code Playgroud)

移动HEAD只是提交错误之前提交,但保留索引和工作树

git reset --soft <SHA1-for-just-previous-to-bad-commit-1f020>
Run Code Online (Sandbox Code Playgroud)

在重新使用提交消息的错误提交之后重做提交,但现在在提交之前提交错误提交.因此,删除那个错误的提交

git commit -C <SHA1-for-commit-just-after-bad-commit-1f020>
Run Code Online (Sandbox Code Playgroud)

重新应用从提交之后的提交到此新位置的所有内容

git rebase --onto HEAD <SHA1-for-commit-just-after-bad-commit-1f020> master
Run Code Online (Sandbox Code Playgroud)