我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。
我如何从当地存储库撤销这些承诺?
我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。
我如何从当地存储库撤销这些承诺?
当前回答
主要设想有两种情况:
你还没推动承诺呢
如果问题在于您所做的额外文件( 而您不希望存储库中的文件) , 您可以使用 git rm 来删除文件, 然后用 -- amend 进行 -- amend
git rm <pathToFile>
您也可以用 -r 来删除整个目录, 或甚至与其他 Bash 命令合并
git rm -r <pathToDirectory>
git rm $(find -name '*.class')
删除文件后, 您可以使用 -- amend 选项执行 -- amend 选项
git commit --amend -C HEAD # the -C option is to use the same commit message
这将重写您最近的本地承诺删除额外文件, 因此, 这些文件将不会被按键发送, 并且 GC 将会从您本地的. git 仓库中删除 。
您已经推进了任务
您可以对其它情景应用相同的解决方案, 然后用 -f 选项进行 Git 推, 但建议不推荐, 因为它以不同的变化覆盖了远程历史( 它会干扰您的仓库 ) 。
相反,您必须在不做 -- amend 的情况下做承诺(记住关于 -amend : 此选项重写上次承诺的历史 ) 。
其他回答
通过下列方式查看日志来查找上次承诺的散列代码 :
git log
然后
git reset <the previous co>
这将添加一个新的承诺, 删除所添加的文件 。
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
或者您可以重写历史来撤销最后一项承诺 。
警告:此命令将永久删除对.java 文件( 和任何其他文件) 所做的修改 -- 从工作目录中删除所有修改 :
git reset --hard HEAD~1
硬重置为 HEAD-1 将把您的工作副本设定为您错误实施前的行为状态 。
每个人都以如此复杂的方式发表意见。
如果您想要从分支中删除最后一项承诺, 最简单的方法是:
git reset --hard HEAD~1
现在,为了摆脱你最后的承诺,你必须
git push --force
这就对了,这会消除你最后的承诺
撤销一项承诺是有点吓人,如果你不知道它是如何运作的。 但如果你理解的话,它其实很容易。我会告诉你4种不同的方式, 你可以解除一项承诺。
说你们有这个,C是你们的总部,(F)是你们档案的状态。
(F)
A-B-C
↑
master
选项1: git 重设 -- hard
您想要销毁C实施者, 并丢弃任何未承诺的更改 。 您这样做 :
git reset --hard HEAD~1
结果是:
(F)
A-B
↑
master
B现在是 HEAD 。 因为您使用 -- hard 键, 您的文件被重置为在承诺 B 状态 。
备选2:Git重置
实施 C 可能不是一场灾难, 只是有点不对劲 。 您想要撤销此承诺, 但要在做出更好的承诺之前先保留您的更改, 然后再进行编辑 。 从这里重新开始, 以 C 为主机 :
(F)
A-B-C
↑
master
做到这一点, 离开 -- hard :
git reset HEAD~1
在这种情况下,结果是:
(F)
A-B-C
↑
master
在两种情况下, HEAD 都只是最新承诺的指针。 当您重置 HEAD~ 1 时, 您会告诉 Git 将 HEAD 指针移回一个。 但是( 除非使用 -- hard) 您会离开文件原样。 因此, Git 状态显示您检查到 C 的更改 。 您没有丢失任何东西 !
备选方案3: git 重设 -- 软
对于最轻的触摸,你甚至可以撤销你的承诺,但留下你的文件和索引:
git reset --soft HEAD~1
这不仅留下您的文件, 甚至留下您的索引 。 当您做 Git 状态时, 您就会看到相同的文件在索引中 。 事实上, 在此命令之后, 您就可以做 Git 承诺, 您就会重做您刚刚做的同样的事情 。
选项 4: 您确实重置了 git -- hard 重置, 并且需要将代码调回
还有一件事:假设你像第一个例子一样摧毁一个承诺,但发现你毕竟需要它?运气不好,对吧?
不,还有办法把它拿回来,按这个键
git reflog
你将看见一份你所迁入的沙子(部分),你将看见它。你应当发现你所破坏的,你应当做这件事:
git checkout -b someNewBranchName shaYouDestroyed
承诺在Git不会在90天内被摧毁 所以你通常可以回去 拯救一个你本不想除掉的人
每次我需要撤销承诺/承诺时,我要做的是:
git 重置 HEADn > // 上次承诺的数量, 我需要撤销 Git 状态 / / 选项 。 所有文件现在都是红色的( 未进入阶段 ) 。 现在, 我可以添加并只承诺需要的文件 :
git 添加 < file name> & git 承诺 - m “ 消息” - m “ 细节”
可以选择:我可以将其它文件的更改(如果需要的话) 推回到它们以前的状态, 并进行退票:
git 检出 < filename>
如果我已经把它推向了遥远的起源, 之前:
git 推源 <branch name> -f // use -f 强制推 。