我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。
我如何从当地存储库撤销这些承诺?
我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。
我如何从当地存储库撤销这些承诺?
当前回答
为了撤销最后的本地承诺, 在不丢弃更改的情况下, 我在 ~ /. gitconfig 中有这个便用别名
[alias]
undo = reset --soft HEAD^
然后,我只需要使用Git 解码,这是超级容易记住的。
其他回答
这里是网站: 哦,该死,混蛋!
这里有许多解密的秘方 如何在Git 中解决事情。其中一些是:
哦,该死,我需要改变 信息在我的最后一次承诺!
git commit --amend
# follow prompts to change the commit message
哦,我无意中把什么东西 给了主人 本来该在全新的树枝上!
# Create a new branch from the current state of master
git branch some-new-branch-name
# Remove the commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# Your commit lives in this branch now :)
为了完整起见,我将提出前几个答复所忽略的一个明显明显的方法。
由于承诺没有被推,遥控器没有改变,因此:
删除本地仓库。 克隆远程仓库 。
有时候,如果你的高贵的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 是如何被重写的 , 记录文件也从每次承诺中被丢弃 。
结论 结论 结论 结论 结论
就像任何与软件开发有关的事情一样,对于一个特定的问题,有多种方法可以实现相同(或类似)的结果。你只需要选择最适合你特定案例的方法。
最后 -- -- 友好建议
请注意上面所有三种选择都完全重写历史。 除非您确切知道自己在做什么, 并在团队中保持良好的沟通 — — 只有重写承诺还没有远程发布 !
来源:以上所有例子都是从这个博客借用的。
在视觉工作室中,只需返回您的承诺, 然后将它与自动创建的返回承诺一起推。 全部显示在下面的屏幕镜头中 。 @ info: status
调
调
调
调
调
我验证了所提议的有效方法,这里就是使用这一方法的一个具体例子:
如果您想要永久撤销/取消您的最后一项承诺(等等, 一个一个一个, 尽可能多) , 有三个步骤 :
1: 获取您想要到达的承诺的 id = SHA, 当然
$ git log
2: 删除您先前的承诺
$ git reset --hard 'your SHA'
3: 强制使用 - f 选项( 最后一个承诺轨道将从 GitHub 历史中删除) 强制使用 GitHub 的本地新历史 。
$ git push origin master -f
示例示例示例示例
$ git log
最后一次承诺取消
commit e305d21bdcdc51d623faec631ced72645cca9131 (HEAD -> master, origin/master, origin/HEAD)
Author: Christophe <blabla@bla.com>
Date: Thu Jul 30 03:42:26 2020 +0200
U2_30 S45; updating files package.json & yarn.lock for GitHub Web Page from docs/CV_Portfolio...
现在就向总部提交我们想要的文件
commit 36212a48b0123456789e01a6c174103be9a11e61
Author: Christophe <blabla@bla.com>
Date: Thu Jul 30 02:38:01 2020 +0200
First commit, new title
删除最后一项, 达到承诺前, 删除最后一项
$ git reset --hard 36212a4
HEAD is now at 36212a4 First commit, new title
检查一下,没事的
$ git log
commit 36212a48b0123456789e01a6c174103be9a11e61 (HEAD -> master)
Author: Christophe <blabla@bla.com>
Date: Thu Jul 30 02:38:01 2020 +0200
First commit, new title
$ git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
更新 Git (Hub) 上的历史
$ git push origin master -f
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/ GitUser bla bla/React-Apps.git
+ e305d21...36212a4 master -> master (forced update)
检查一下,没事的
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean