我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。

我如何从当地存储库撤销这些承诺?


当前回答

撤销一系列本地承诺

OP: 我如何撤销当地最近在Git的最新承诺? 我无意中犯下了错误的案卷[作为几项承诺的一部分]。

开始案例

依你所追求的结果而定, “ 不做” 有几种方式可以作为承诺的序列。 考虑到下面的起始案例, 重置、 重置和过滤处都可以用来重写您的历史 。

如何撤销 C1 和 C2 从每次承诺中移除 tmp. log 文件 ?

在下文的例子中,使用了绝对承诺参考,但如果您更多地使用相对引用(即HEAD~2或HEADn}),则使用同样的方式。

备选案文1:重置

$ git reset --soft t56pi

如果重置,分支可以重置为先前的状态,任何复合变化都可恢复到固定区,然后从该区丢弃任何不想要的变化。

注意 : 当重置先前对“ 调制区” 的所有更改组群时, 个人承诺元数据会丢失。 如果这与您有问题, 您也许更可能选择重设或过滤部门 。

备选案文2:重新基数

$ git rebase --interactive t56pi

使用交互式的重新基准,可以重写在分支中每个犯罪的行为,允许您修改和丢弃不必要的更改。在以上信息图中,右侧的源树显示的是国家邮政站的重新基准。

逐步执行

选择从哪个选项中承诺重置基底( 例如 t56pi) 选择 选择 选择 您是否愿意以编辑替换取数来更改 。 保存和关闭 。 Git 现在将停止对每个选中的承诺 , 允许您重置 HEAD, 删除不需要的文件, 并创建新承诺 。

注意: 与上面的重置选项相比, 保留了大部分承诺元数据的重基。 如果您想要保留大部分历史数据, 但只删除不需要的文件, 这很可能是一个首选选项 。

替代品3: 替代品3:过滤处

$ git filter-branch --tree-filter 'rm -r ./tmp.log' t56pi..HEAD

上面的命令会从想要的范围 t56pi.HEAD 中的所有承诺中过滤文件 ./tmp.log (假设我们最初的起始案例来自以上) 。 请见下文的清晰度说明 。

过滤处可以用来从分支的一个小节中清除不需要的文件。 过滤处可以自动提前对每项承诺采取所需行动, 而不是通过重设程序手动编辑每项承诺。

注意: 就像重置基准一样, 过滤处会保存承诺元数据的其余部分, 只丢弃想要的文件 。 通知 C1 和 C2 是如何被重写的 , 记录文件也从每次承诺中被丢弃 。

结论 结论 结论 结论 结论

就像任何与软件开发有关的事情一样,对于一个特定的问题,有多种方法可以实现相同(或类似)的结果。你只需要选择最适合你特定案例的方法。

最后 -- -- 友好建议

请注意上面所有三种选择都完全重写历史。 除非您确切知道自己在做什么, 并在团队中保持良好的沟通 — — 只有重写承诺还没有远程发布 !

来源:以上所有例子都是从这个博客借用的。

其他回答

更改上次承诺

替换索引中的文件 :

git rm --cached *.class
git add *.java

那么,如果它是私人分支, 修改承诺:

git commit --amend

或者,如果它是共享分支, 做出新的承诺:

git commit -m 'Replace .class files with .java files'

(要改变先前的承诺, 请使用惊人的互动重置 。 )


ProTipTM: 添加 *. class to a gitignore 来阻止这种情况再次发生 。


收回承诺

修改承诺是理想的解决办法,如果您需要更改最后的承诺,但更一般性的解决办法被重置。

您可以将 Git 重置为任何承诺 :

git reset @~N

N是总部行政领导之前的承付次数, 重划为上一个承付次数。

您不必修改承诺,而是可以使用:

git reset @~
git add *.java
git commit -m "Add .java files"

检查 git 帮助重置, 特别是 -- -- oft -- mixed 和 -- hard 上的章节, 以便更好地了解它的作用 。

reflog 格式

如果你搞砸了,你总是可以使用折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式折叠式

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started

git reset --soft HEAD~1

软性 : 这将只从本地端删除承诺, 并保留文件所做的更改 。

    git reset --hard HEAD~1
    git push origin master

硬性 : 这将从本地和远程删除承诺, 并删除文件中所做的更改 。

在视觉工作室中,只需返回您的承诺, 然后将它与自动创建的返回承诺一起推。 全部显示在下面的屏幕镜头中 。 @ info: status

视觉演播室代码使得这很容易。

恢复和放弃承诺是最好的,如果你想在向公共部门等提出补丁时保持历史清洁有用的话。

如果你必须放下最上层的承诺, 那么以下的单行帮助

git rebase --onto HEAD~1 HEAD

但如果你想放弃其中的 多项承诺,你确实说

- > b - > c - > > d - > 硕士

,然后您要放弃“ c” 承诺

git rebase --onto b c

这将使“ b” 成为“ d” 删除“ c” 的新基础