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

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


这将添加一个新的承诺, 删除所添加的文件 。

git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

或者您可以重写历史来撤销最后一项承诺 。

警告:此命令将永久删除对.java 文件( 和任何其他文件) 所做的修改 -- 从工作目录中删除所有修改 :

git reset --hard HEAD~1

硬重置为 HEAD-1 将把您的工作副本设定为您错误实施前的行为状态 。


撤消一次承诺重做( R)

$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~                              # (1)
[ edit files as necessary ]                    # (2)
$ git add .                                    # (3)
$ git commit -c ORIG_HEAD                      # (4)

git 重新设置是撤销命令的责任。 它会解除您最后的承诺, 同时将您的工作树( 您在磁盘上的文件状态) 保留下来。 您需要重新添加它们才能再次执行 。 对工作树文件进行更正 。 git 添加您想要包含在您新承诺中的任何内容 。 提交修改, 重用旧承诺信件 。 重置旧头部复制到. git/ ORIG_ HEAD; 与 - c ORIG_ HEAD 承诺将打开编辑器, 该编辑器最初包含旧承诺的日志信息, 并允许您编辑它 。 如果您不需要编辑信件, 您可以使用 - C 选项 。

或者,为了编辑上一个承诺(或仅仅是其承诺信息),承诺 -- -- 修正将在当前索引中将修改添加到上一个承诺。

要删除( 不回覆) 被推进到服务器的承诺, 有必要重写历史, 使用 Git 推源主 -- force [- with- level] 重写历史。 使用 -- force; 偏好 -- force- with- level, 几乎总是一个坏主意。 正如 Git 手册中所指出的 :

如果你[重写历史]已经发表,你应该了解重写历史的意义。


继续阅读

您可以使用 git reflog 来确定您想要返回的 SHA-1 承诺的 SHA-1 。 一旦您拥有此值, 请使用上文解释的命令序列 。


HEAD~ 和 HEAD~ 1 相同。 如果您想要解开多次承诺, 文章“ HEAD ” 是否有帮助 。


添加/删除文件, 以便按照您想要的方式获取文件 :

git rm classdir
git add sourcedir

然后修正承诺:

git commit --amend

之前的错误承诺将会被编辑 以反映新的指数状态 换句话说,这就像你从未犯过错误一样

请注意,你只应该在还没有推的时候做这个。如果你已经推了,那么你只需要正常地做一个修正。


更改上次承诺

替换索引中的文件 :

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 log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

要让一切恢复到上次承诺之前的状态 我们需要重置承诺 重置承诺

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

现在 git 日志将显示我们最后的承诺已被删除 。

如何撤销公开承诺

如果您已经公开了承诺, 您将会想要创建一个新的承诺, 它将“ 撤销” 您对上一个承诺( 当前 HEAD) 所做的更改 。

git revert HEAD

你们的更改将恢复,并准备好你们承诺:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

更多信息,请查看 Git Basics - 撤销一些事情 。


撤销一项承诺是有点吓人,如果你不知道它是如何运作的。 但如果你理解的话,它其实很容易。我会告诉你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 Explos, 您可以运行 Git 撤消以撤销最近的承诺 。 git 撤消 3 将撤销最后的 3 个承诺 。


我想撤销我们共享存储库中最新的五个承诺。 我查了我想回溯到的订正代号 。 然后我输入了下面的内容 。

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

使用 git 返回 < commit- id > 。

要拿到身份证明,请使用 git 日志。


我更喜欢用Git rebase - i 来做这份工作,因为一个不错的名单会出现在我可以选择摆脱承诺的地方。它可能不像这里其他答案那样直接,但它只是感觉是正确的。

选择要列出多少个承诺, 然后这样引用( 加入最后 3 个)

git rebase -i HEAD~3

样本列表

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

然后 Git 将删除任何您删除的线条 。


如果你打算完全撤销一个本地的承诺, 无论你改变什么你对承诺所做的, 如果你对此不担心, 执行以下命令。

git reset --hard HEAD^1

(此命令将忽略您的全部任务, 您的更改将完全从您的本地工作树中消失) 如果您想要撤销您的承诺, 但是您想要您在中转区域中的更改( 在像 Git 添加后一样执行前) , 那么执行以下命令 。

git reset --soft HEAD^1

现在,您的已执行文件将进入中转区域。 如果您想要提升文件, 您需要编辑错误的内容, 那么执行以下命令

git reset HEAD

现在承诺要将文件从舞台区域移到非舞台区域。 现在文件已准备编辑, 所以无论您改变什么, 您都想要去编辑和添加它, 并做出新的/ 新的承诺 。

更多(断链接) (存档版本)


如何修正上一个本地承诺

使用 git- gui (或类似) 执行 git- committee -- amend 。 您可以从 GUI 中添加或删除承诺中的单个文件。 您也可以修改承诺信件 。

如何撤销上一个本地任务

只需将分支重置到上一个位置( 例如, 使用 gitk 或 git 重新基准 ) 即可。 然后重新应用保存的副本中的更改 。 在本地仓库收集垃圾后, 它会像未发生不想要的操作一样。 要在单一个命令中完成所有这些, 请使用 git 重置 HEAD~ 1 。

警告的话: 粗心使用 Git 重置是一个很好的方法, 让你的工作副本陷入混乱状态 。 我建议Git Novice 尽量避免这种情况 。

如何撤销公开承诺

执行反向樱桃选取( git- revert) 以撤销更改 。

如果你还没有在你的分支上做其他的修改, 你可以简单地做。 。 。

git revert --no-edit HEAD

然后将更新的分支推至共享仓库 。

承诺历史将分别显示两个承诺。


高级:对公共储存库中的私营分支机构的更正

这可能很危险 -- -- 请确定您有该分支的本地副本要反射 。

备注:如果有其他人在为分支工作,您不想这样做。

git push --delete (branch_name) ## remove public version of branch

清理你的分行 在当地,然后冲...

git push origin (branch_name)

通常情况下, 您可能不需要担心您的私人部门 将历史变为原始历史。 只要催促后续承诺( 参见上面的“ 如何撤销公共承诺 ” ) , 然后再做壁球合并来隐藏历史 。


另一种方式:

检查您想要返回的分支, 然后将本地工作副本重置到您想要在远程服务器上成为最新一份的承诺( 它将在离别后进行的一切) 。 要做到这一点, 请在 SupportTree I右键点击并选中的“ 重置 BranchNAME 以进行此承诺 ” 。

然后导航到仓库的本地目录并运行此命令 :

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

这将删除您本地仓库中当前一个后的所有承诺, 但只删除该分支 。


键入 git 日志, 并找到最后一次承诺的散列代码, 然后输入 :

git reset <the previous co>

如果您想要永久撤销它, 您克隆了一些仓库 。

犯罪身份可通过以下方式识别:

git log 

然后你们可以做:

git reset --hard <commit_id>

git push origin <branch_name> -f

在 SourceTree ( GitHub 的 GUI) 上, 您可以右键单击承诺并做一个“ 反向提交 ” 。 这将取消您的更改 。

在终点站上:

可选择使用:

git revert

或者:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

在我的案子中,我无意中犯了一些我不想犯的案卷。所以我做了以下的,它奏效了:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

用 gitk 或 git 日志 -- stat 校验结果


使用 SourceTree ( Git 的图形工具) 查看您的承诺和树。 您可以单击右键手动重置它 。


“ 将工作树重置为最后一次承诺 ”

git reset --hard HEAD^ 

"清除工作树上的未知文件"

git clean    

见 - Git 快速参考

注意: 此命令将删除您上一个任务, 请谨慎使用! git 重置 -- hard 比较安全 。


第一运行 :

git reflog

这将显示您在存储库中实施的所有可能的动作, 例如, 承诺、 合并、 调用等 。

那么,请:

git reset --hard ActionIdFromRefLog

使用 reflog 查找正确状态

git reflog

安全前的路线

选择正确的 reflog( 以我为例, f3cb6e2) 和类型

git reset --hard f3cb6e2

在那之后 重置总部将重置 重置后,HEADLOGED

最终, 折叠图看起来像下面的图片

谈判最后定本


当地承诺

git reset --soft HEAD~1

或者如果你们记不起来,那末,你们可以使用

git rm --cached <file>

用于被推动的 承诺

从存储库历史中删除文件的适当方式是使用 git 过滤器- blanch 。 也就是说,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

但我建议您谨慎使用此命令 。 更多信息请访问 git- filter- branch- blanch- 1 手册页面 。


单一个命令 :

git reset --soft 'HEAD^' 

成功推翻了当地最后的承诺!


如何撤销最后的 Git 承诺 ?

为了让一切恢复到上次承诺之前的状态 我们需要重置在总部总部之前的承诺

如果您不想保留您所做的更改: git 重置 -- hard HEAD * 如果您想要保留您的更改: git 重置 -- s软 HEAD*

现在检查您的 git 日志。 它会显示我们上次的承诺已被删除 。


要重置上一个修订版, 请永久删除所有未承诺的更改 :

git reset --hard HEAD~1

如果你犯下了破案 但没有被逼

git reset --soft HEAD~1

HEAD ~ 1 是头部前的承诺的速记。 或者, 如果您想要重置的话, 您可以引用散列的 SHA-1 。 -- 软选项会删除此项承诺, 但是它会留下您更改过的所有文件“ 更改要执行 ” , 正如 git status 所声明的那样 。 如果您想要删除工作树中跟踪文件的任何更改, 因为任务在头部使用“ 硬” 取代前, 您可以在工作树中取消此任务 。

如果你已经被推了 然后有人拉了过来 通常是我的案子 你不能用Git重置

git revert HEAD

这将产生新的承诺, 扭转意外行为带来的一切。


主要设想有两种情况:

你还没推动承诺呢

如果问题在于您所做的额外文件( 而您不希望存储库中的文件) , 您可以使用 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 : 此选项重写上次承诺的历史 ) 。


通常情况下, 您想要撤销一项承诺, 因为您犯了一个错误, 您想要修正它, 基本上就是 OP 提问时所做的。 真的, 您真的想要重做一次承诺 。

这里的大多数答案都集中在命令行上。 虽然命令行是使用Git的最佳方法, 当你对它感到舒服的时候, 它可能与来自其他版本控制系统到 Git 的人有点不同。

使用 GUI 如何操作。 如果您安装了 Git, 您已经拥有了所有您需要遵守的指示 。

注意: 我在此假设您在推动前意识到承诺是错误的。 如果您不知道推力意味着什么, 那么您可能还没有被推动。 继续执行指令。 如果您推动了错误承诺, 最危险的方法就是跟踪错误承诺, 并做出新的修正, 而在版本控制系统中, 您会这样做, 不允许您重写历史 。

使用图形用户界面来修正你最近的过错:

导航到命令行的仓库, 并用 git gui 选择“ 修正最后一项承诺 ” 启动 GUI 。 您将会看到您上次的承诺信件、 您所准备的文件 以及您没有的文件 。 现在更改了您想要它们如何查看和单击 COD 。


只需撤销最后一项承诺 :

git reset --soft HEAD~

或撤销上次承诺前的时间 :

git reset --soft HEAD~2

或撤销先前的任何承诺 :

git reset --soft <commitID>

(您可以通过 git reflog 获得对帐号)

当您撤销上一个任务时, 记住要用

git clean

更多信息,请查看文件:git-resets。


你需要做简单快的动作

    git commit --amend

是私人分行还是私人分行

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

如果它是共享的或公共的分支。


使用此命令

git checkout -b old-state 0d1d7fc32

在我的情况中,我承诺并推向错误的分支, 所以我想要的是把全部的改变都收回来, 这样我就可以把它们投向一个新的正确的分支, 所以我做了这个:

在您承诺和推动的同一分支上, 如果您输入“ gitt status” 键入“ git status” 状态, 您将不会看到任何新事物, 因为您承诺和推动, 现在键入 :

    git reset --soft HEAD~1

这将将您所有的更改( 文件) 重新回到舞台区域, 现在把它们重新回到工作目录( 非阶段) 中, 您只要输入 :

git reset FILE

“ 文件” 是您想要再次承诺的文件 。 现在, FILE 应该在工作目录中, 包含您所做的全部更改 。 现在您可以更改为您想要的分支, 并对该分支进行更改 。 当然, 您承诺的初始分支仍然有所有更改, 但对于我来说, 如果不是您的话, 您可以寻找恢复该分支承诺的方法 。


删除已被推到 Github 的错误行为

git push origin +(previous good commit id):(branch name)

请指定您想要在 Github 重置的最后一个好承诺代号 。

例如,如果最近的承诺 ID 错误, 请用分支名称在 Git 命令上方指定前一个承诺 ID 。

您可以使用 git 日志获得上一个承诺 ID 。


您可以对上一个版本进行 Git 检出 < SHA code> , 然后再对新代码再次承诺 。


典型基周期

在前几次答复中谈到与Git相关的命令时,我想向所有读者介绍我典型的Git周期,这可能是有益的。 这就是我如何与Git合作,

首次从远程服务器上克隆 $project pulling 从远程( 当我没有未完成的本地推动承诺) git 将新的本地文件 1 添加到 $to_be_compent_list_list (只是想象 $to_be_compent_list means staged 区域) git 添加 $file1 从 $to_be_compent_list_list_list 列表中删除错误添加的文件 2 (假设文件2 添加为步骤 3 ) git 重新设置 $file2 提交文件 1 , 该文件位于 $to_ be_compent_ list git 承诺 - m “ comm 信件描述” 与远程仓库同步本地文件 1 (在冲突发生时配置合并工具 Git 合并时重新解析 # re Solive 合并, 也可以手动合并 添加冲突解析文件, 让我们说: git 添加 $file1 继续我之前的重定义命令 gfile1 -- 继续推进和已经同步的上次本地承诺推进源头: rechangs/ for


要撤销您的本地承诺, 请使用 Git 重置 < tomit > 。 另外, 此教程非常有助于展示它是如何工作的 。

或者,您可以使用 git return <Conmit> : 当您想要添加另一个让更改倒退的承诺时, 应该使用 return( 但将其保留在项目历史中 ) 。


简单, 在命令行运行此操作 :

git reset --soft HEAD~ 

有许多方法可以做到:

撤消上次执行/ 上一个承诺的 Git 命令 :

警告: 如果您不知道自己在做什么, 不要使用 -- 硬。 -- 硬太危险, 它可能会删除您的文件 。

返回 Git 中的承诺的基本命令是 :

$ git reset --hard <COMMIT -ID>

$ git reset --hard HEAD~<n>

承诺的代号:

n: 是您想要返回的最后一次承诺的数

您可以获取下列承诺代号:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to multiply two numbers

d81d3f1 和be20eb8 是实施代号的 。

现在,让我们来看看一些案例:

假设您想要返回上次的“ d81d3f1 ” 。 这里有两个选项 :

$ git reset --hard d81d3f1

$ git reset --hard HEAD~1

假设您想要还原“ ebe20eb8” 承诺 :

$ git reset --hard be20eb8

欲了解更详细的信息,请参考并尝试其他命令,将头重置为指定状态:

$ git reset --help

撤消上次承诺 :

git 重设 -- s软 HEADQ 或 git 重置 -- s软 HEAD~

这将撤销最后一项承诺 。

在这里 -- 软意味着重置中。

HEAD~ 或 HEAD_ 意思是移动 在 HEAD 之前承诺。


替换上次承诺的新承诺 :

git commit --amend -m "message"

它将以新承诺取代最后一项承诺 。


我从Bitbucket拿到了身份证明 然后就做了:

git checkout commitID .

示例:

git checkout 7991072 .

它又把它恢复到那个承诺的工作副本上。


(2015年等)

如果你在视觉工作室无法同步, 因为不允许你按到像“开发”那样的分支, 那么就像我努力的一样, 在视觉工作室NEITHER, REWET NOR(硬的或软的)RESET(硬的或软的)将有效。

答案是用数字标注的:

使用此命令命令 根 你的项目根 核武器 任何试图 被推推:

git reset --hard HEAD~1

备份或拉链你的文件 只是以防你不想失去任何工作,等等...


只要使用 git 重置 -- hard < last good SHA> 来重置您的更改并给予新的承诺。您也可以使用 git 检查退出 -- < bad filename> 。


您可以使用:

git reset HEAD@{1}

此命令将删除您没有 Git 日志的错误执行 。


如何使用,重置 -- 软的或重置 -- 硬的?

@Kyralessa的回答:

如果您不确定该使用什么 -- Soft (我用这个公约来记住它 -- 安全性 -- 软性) 。

为什么?

如果您选择 -- 错误地选择 -- 错误地选择, 您将会失去以前没有的更改。 如果您选择 -- 错误地选择 -- 错误地选择 -- 软, 您可以通过应用额外命令而实现同样的结果 -- 硬

git reset HEAD file.html
git checkout -- file.html

完整示例

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

感谢@Kyralessa。


如果您是和SourceTree合作, 这会帮助您 。

在承诺上右键点击, 然后选择“ 重置( 当前分支) / master 到此承诺 ” , 最后选择“ 软” 重置 。


为了消除(所有变化)最后承诺、最后2承诺和最后n承诺:

git reset --hard HEAD~1
git reset --hard HEAD~2
...
git reset --hard HEAD~n

在做出具体承诺后,要消除任何东西:

git reset --hard <commit sha>

例如,

git reset --hard 0d12345

谨慎使用硬选项 : 它会同时删除您回购的本地更改, 并返回到上一个提及的承诺 。 您只应该运行此选项, 前提是您确定您在最后一次承诺中搞砸了, 并且想要回到过去 。

作为副注释,大约7个承诺的散列字母就足够了,但在更大的项目中,你可能需要最多12个字母才能独有。如果您愿意,也可以使用整个承诺的 SHA 。

上述命令在GitHub也为Windows服务。


假设您是在视觉工作室工作, 如果您进入您的分支历史, 并查看您的所有承诺, 只需在承诺之前选择您想要撤销的事件, 右键单击它, 并选择回溯。 简单 。


认为我们已经有了 code. txt 文件。 我们对其做了一些修改并承诺。 我们可以以三种方式撤销此承诺, 但首先, 您应该知道什么是预置文件... 一个预设文件是一个可以承诺的文件。 如果您运行 git 状态, 此文件将会显示为绿色颜色, 如果它没有被预设用于承诺, 将会显示为红色颜色 :

意思是如果您承诺更改, 此文件中的更改没有被保存 。 您可以在您的舞台上添加此文件, 添加 code. txt , 然后进行更改 :

撤消上次承诺 :

现在,如果我们想要在不做其他任何更改的情况下撤销承诺, 我们可以使用 git 重设 -- soft HEAD * 如果我们想要撤销承诺及其更改( THIS 是危险的, 因为您的更改将会丢失) , 我们可以使用 git 重置 -- 硬 HEAD * 如果我们想要撤销承诺并删除舞台上的更改, 我们可以使用 git 重置 -- mixed HEAD* 或短格式的 git 重置 HEAD***


我找到了这个网站 用来描述如何撤销 你对存储库的承诺

一些命令 :

git commit --amend        # Change last commit
git reset HEAD~1 --soft   # Undo last commit

使用此命令 :

git checkout -b old-state number_commit

在回答之前,让我们补充一些背景,解释一下这个总部是什么。

首先,什么是总部?

HEAD 只是引用当前分支的当前承诺( 最新承诺) 。 任何时候只能有一个 HEAD 。 (不包括 git worktree)

HEAD的内容存放在.git/HEAD内,包含当前承诺的40字节SHA-1。


独立头部

如果您没有在最新的承诺 - 意指HEAD指向 先前在历史中的承诺 它被称为独立的HEAD。

在命令行上,它会看起来像这个- SHA-1, 而不是分支名称, 因为 HEAD 没有指向当前分支的端端点 。

如何从独立的总部中恢复的几种选择:


git 检出

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

这将取出指向想要的承诺的新分支 。 此命令会取出给定的承诺 。 在此点上, 您可以创建一个分支, 从此开始工作 。

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git 重新格式

您也可以同时使用reflog。 git reflog 将显示任何更新 HEAD 的更改, 并检查想要的 reflog 条目, 将会将 HEAD 设置回至此任务 。

每次对总部领导部进行修改时,在重新格式中将有一个新的条目

git reflog
git checkout HEAD@{...}

这样你就可以回到你想要的事业了


git 重置 - 硬设置 < commit_ id>

"移动"你的总部 回到想要的承诺。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.

注: (自Git 2. 7) 您也可以使用 Git rebase -- no- autostash 。


git 返回 <sha-1>

“ 撤消” 指定的承诺或承诺范围。 重置命令将“ 撤消” 对给定承诺所做的任何更改 。 在原始承诺也将保留在历史中时, 将使用撤消补丁的新承诺 。

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

此 schema 显示哪个命令能做什么 。 正如您可以看到的, 重置 {}\ 检查退出 修改 HEAD 。


如果您想要删除错误的文件, 您应该做

git 重置 -- s软 < your_ last_ good_commit_hash_ here> 在这里, 如果您做 Git 状态, 您可以在集结区看到文件。 您可以选择错误的文件, 从集结区拿下来 。

喜欢下面。

git 重置错误的File1 错误的File2 错误的File3

您现在可以添加您需要按键的文件,

添加好文件1 好文件2 git 添加好文件1 goodFile2

提交提交它们

git 承诺 -v 或 git 承诺 - am "Message"

推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推,推

git 推进源源主机

但是,如果您不关心已更改的文件, 您可以硬重置到先前的良好承诺, 并将所有文件都推到服务器 。

git reset --hard <your_last_good_commit_hash_here>

git 推进源源主机

如果您已经向服务器发布错误的文件, 您可以使用 -- 强制旗将文件推到服务器并编辑历史 。

git 推推 -- 原力硕士


引用: 如何撤销 Git 中的最后一次承诺 ?

如果您已经安装了 Git 扩展名, 您可以很容易撤销/ 撤销任何任务( 您可以从这里下载 Git 扩展名 ) 。

打开 Git 扩展名, 右键单击您想要返回的承诺, 然后选择“ 回溯承诺 ” 。

将打开弹出( 见下文截图)

选择“自动创建一项承诺”,如果您想要直接进行已恢复的更改,或者如果您想要手动进行已恢复的更改,则保留未选中的框,单击“撤销此承诺”按钮。


假设您在本地犯下错误, 并将其推到远程仓库。 您可以解开这两个命令的混乱 :

首先,我们需要纠正我们的地方储存库,回到我们所希望的承诺上来:

git reset --hard <previous good commit id where you want the local repository  to go>

现在,我们通过使用此命令,在远程仓库大力推动这项良好承诺:

git push --force-with-lease

强制选项的“ 租赁” 版本将防止意外删除您不知道的新承诺( 即上次拉动后来自其它来源 ) 。


通过下列方式查看日志来查找上次承诺的散列代码 :

git log

然后

git reset <the previous co>

IntelliJIDEA 您可以按 Alt+9 键右键单击承诺列表中的某些标签打开 Git 仓库日志, 然后选择 : “ 将当前分支重置到这里... ” 。


只要使用 git 重置它执行下面的命令 :

git reset --soft HEAD~1

解释 : git 重设做什么, 它基本上是重置到任何您想要返回的承诺, 然后如果它与 -- soft 键合并, 它会返回, 但保留您文件中的更改, 所以您回到刚刚添加文件的阶段, HEAD 是分支的头部, 如果您和 ~ 1 合并( 在此情况下, 您也使用 HEAD+) , 它只会返回一个您想要的...

我为您创建了以下图像中的步骤, 详情更多, 包括所有在真实情况下可能发生的步骤, 并承诺执行代码 :


为了完整起见,我将提出前几个答复所忽略的一个明显明显的方法。

由于承诺没有被推,遥控器没有改变,因此:

删除本地仓库。 克隆远程仓库 。

有时候,如果你的高贵的Git客户告别(看着你,伊吉特),这有时是必要的。

别忘了重新承诺上次推后保存的更改 。


头:

在重置承诺之前, 我们应该知道关于 HEAD... HEAD 在您的工作目录中只是您目前的状况。 它由承诺编号代表 。

Git 承诺 :

在由独有标记表示的一承诺下指定的每项更改。 无法删除提交。 所以, 如果您想要您最后的承诺, 您可以使用 git 重设来跳入它 。

您可以使用两种方法跳入最后一个承诺 :

方法1:(如果不知道承诺编号,但想移动到第一个)

git reset HEAD~1  # It will move your head to last commit

方法2: (如果知道您只需将承诺重置到您已知的承诺上)

git 重置 0xab3 # 提交编号

注意: 如果您想要了解最近一个尝试 git 日志 - p - 1 的最近运行尝试

以下是图形表达式 :


您可以以两种方式撤销您的 Git 承诺 : 首先, 您可以使用 Git 返回, 如果您想要保留您的承诺历史 :

git revert HEAD~3
git revert <hashcode of commit>

第二是您可以使用 Git 重置, 这将删除您全部的委托历史, 并随心所欲地将您的头移到您想要的地方 。

git reset <hashcode of commit>
git reset HEAD~3

您也可以使用 -- hard 关键词, 如果有的话, 如果它开始有其他行为的话。 但是, 我建议在非常必要的时候使用它。


撤消上一个任务

在很多情况下,你真的想撤销你代码中的最后一项承诺。例如,因为你想对它进行广泛的重组,甚至完全抛弃它!

在这种情况下,"重置"命令就是你最好的朋友:

$ git reset --soft HEAD~1

以上命令( 重置) 将把您当前的 HEAD 分支倒回指定的修改 。 在以上的例子中, 我们想回到当前修改前的修改中, 有效地取消我们上次的修改 。

注意 -- soft 旗号 : 这样可以确保未撤销修改的更改被保存。 在运行命令后, 您会发现您的工作副本中这些更改是未承诺的本地修改 。

如果您不想保留这些更改, 请使用 -- 硬旗 。 您确定不需要这些更改时, 一定要这样做 。

$ git reset --hard HEAD~1


撤销上次承诺 :

git reset --soft HEAD^ or git reset --soft HEAD~

这将撤销最后一项承诺 。

在这里 -- 软意味着重置中。

HEAD~ 或 HEAD_ 意思是移动 在 HEAD 之前承诺。

替换上次承诺的新承诺:

git commit --amend -m "message"

它将以新承诺取代最后一项承诺 。


这里是网站: 哦,该死,混蛋!

这里有许多解密的秘方 如何在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 命令 Git 检出 - b 测试) 作为本地分支的本地状态和检查状态( 使用 Git 命令 Git 状态) , 没有可执行的 。

在您可以看到的下一个图像中, 我对 Feller1. txt 做了一些修改, 并将该文件添加到中继区, 然后用一些信息( 使用 Git 命令 Git 承诺 - m “ 做 承诺测试返回 ” ) 进行更改 。

"-m 用于发送信件"

在下一个图像中,您可以看到您的承诺日志(使用 Git 命令 git 日志) 。

在上述图像中,您可以看到每次承诺的承付代号, 以及您现在的委托信, 任何您想要返回或撤销执行 ID 并击中下面的 Git 命令的副本, git return {“ paste your decent id”} 。 例如 :

git revert 9ca304ed12b991f8251496b4ea452857b34353e7

我恢复了上次的承诺。 现在, 如果您检查您的 Git 状态, 您可以看到已修改的文件, 即 Flickr1. txt , 但尚未执行 。


尝试此选项, 硬重置到未添加文件的上一个任务, 然后 :

git reset --hard <commit_hash>

确保您有备份的更改, 以防万一, 因为它是一个困难的重置, 这意味着它们会丢失( 除非您更早隐藏) 。


git push --delete (branch_name) //this will be removing the public version of your branch

git push origin (branch_name) //This will add the previous version back

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

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

git rebase --onto HEAD~1 HEAD

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

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

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

git rebase --onto b c

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


git revert commit

这将产生与您想要返回的承诺相反的变化, 然后再进行这种改变。 我认为这是最简单的方式 。

http://git-scm.com/docs/git-revert https://git-scm.com/docs/git-revert


每次我需要撤销承诺/承诺时,我要做的是:

git 重置 HEADn > // 上次承诺的数量, 我需要撤销 Git 状态 / / 选项 。 所有文件现在都是红色的( 未进入阶段 ) 。 现在, 我可以添加并只承诺需要的文件 :

git 添加 < file name> & git 承诺 - m “ 消息” - m “ 细节”

可以选择:我可以将其它文件的更改(如果需要的话) 推回到它们以前的状态, 并进行退票:

git 检出 < filename>

如果我已经把它推向了遥远的起源, 之前:

git 推源 <branch name> -f // use -f 强制推 。


如果您想要撤销在回邮中的第一个承诺

你会遇到这个问题:

$ git reset HEAD~
fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

发生错误的原因是,如果最后一次承诺是存储处的初始承诺(或没有父/母),则不存在 HEAD~ 。

解决方案

如果您想要重置“ master” 分支上唯一的承诺

$ git update-ref -d HEAD
$ git rm --cached -r .

如何编辑上一个承诺

通常我并不想撤销一连串的承诺, 而是编辑早先的承诺,

我发现自己经常去修修过去的东西 以至于我写了剧本

以下是工作流程:

git exent- edit <commit- hash> 这将让您在您想要编辑的承诺时丢弃您。 承诺的更改将会被卸下, 将按您希望的第一次进行, 并准备按您希望的第一次进行。 固定并按您希望的, 并按您希望的原初阶段进行承诺 。 (您可能想要使用 git 隐藏保存 -- kep- index 来抓松任何您没有执行的文件) 重做承诺 -- amend, 例如: git 承诺 -- amend compult the rebase: git rebase -- continue


把这个调用在 Git- commit- edit 之后, 并把它放在您的 $PATH:

#!/bin/bash

# Do an automatic git rebase --interactive, editing the specified commit
# Revert the index and working tree to the point before the commit was staged
# https://stackoverflow.com/a/52324605/5353461

set -euo pipefail

script_name=${0##*/}

warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "$@"; exit 1; }

[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"

# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")

# Be able to show what commit we're editing to the user
if git config --get alias.print-commit-1 &>/dev/null; then
  message=$(git print-commit-1 "$commit")
else
  message=$(git log -1 --format='%h %s' "$commit")
fi

if [[ $OSTYPE =~ ^darwin ]]; then
  sed_inplace=(sed -Ei "")
else
  sed_inplace=(sed -Ei)
fi

export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed

echo
echo "Editing commit: $message" >&2
echo

使用此命令( 在顶部的日志 1 中, 这是最新命令) 获取上次的 身份确认 :

git log

获取执行 ID (GUID) 并运行此命令 :

git revert <commit_id>

如果您只是想要丢弃所有本地更改/ 承诺, 使您的本地分支看起来像您从... 开始的源分支...

git reset --hard origin/branch-name

撤销最后一次承诺的最简单方式是

git reset HEAD^

这将带来项目状态 之前,您已经做出承诺。


git 重置 -- 混集、 -- soft 和 -- hard 的区别

先决条件 : 当修改您存储库中的现有文件时, 最初将此项修改视为未阶段化的 。 为了实施更改, 需要分阶段进行, 这意味着使用 git 添加将其添加到索引中 。 在一次任务操作中, 被显示的文件会被添加到索引中 。

让我们举一个例子:

- A - B - C (master)

总部指向C,指数与C吻合。

-- 软

当我们执行 git 重设 -- soft B 时,我们执行 git 重设 -- soft B , 目的是删除承诺 C, 将主机/ HEAD 指向主机/ HEAD 指向 B。 主机/ HEAD 现在将指向 B, 但索引仍然与 C 。 当执行 git 状态时, 您可以看到在承诺 C 中索引的文件是分阶段的。 此时执行 git 承诺将产生与 C 相同变化的新承诺 。

-- 混合混合

执行 git 重新设置 -- mixed B 。 执行时, 主机/ HEAD 会指向 B , 索引也会因使用混合旗子而修改为 B 匹配 。 如果我们在此点运行 git 承诺, 自索引与 HEAD 匹配后, 就不会发生任何变化 。 工作目录中仍然有变化, 但是由于它们不在索引中, git 状态显示它们未显示为未显示的 。 要执行它们, 您会按常态添加并承诺 。

--- 硬

执行 git 重置 -- hard B 执行时, 主人/ HEAD 将指向 B 并修改您的工作目录 C 中添加的更改和所有未承诺的更改将被删除。 工作副本中的文件将与承诺 B 匹配, 这将导致永久删除所有在承诺 C 加上未承诺的更改中所做的更改

希望对可用用于 Git 重置命令的旗帜进行这种比较, 将有助于有人明智地使用这些旗帜。 请参考这些旗帜以获取进一步的详情链接1 (链接) 。


替换您的本地版本, 包括您对服务器版本的更改。 这两行代码将迫使 Git 调用并覆盖本地版 。

打开命令提示并浏览到 Git 工程根。 如果您使用视觉工作室, 请单击团队、 同步并点击下面的“ 打开命令提示 ” (见图像) 。

一旦进入CMD, 继续使用以下两个指示。

git fetch --all

那你就做

git reset --hard origin/master

这将覆盖 Git 服务器上的现有本地版本 。


git reset --soft HEAD~1

重置将会将您当前的 HEAD 分支倒带到指定的修订版 。

注意 -- soft 旗号 : 这样可以确保未撤销修改的更改被保存。 在运行命令后, 您会发现您的工作副本中这些更改是未承诺的本地修改 。

如果您不想保留这些更改, 请使用 -- 硬旗 。 确定只有在您确定不再需要这些更改时才这样做 。

 git reset --hard HEAD~1

撤消多个提交文件

git reset --hard 0ad5a7a6

但是,记住,使用重置命令可以解除所有在你返回后的承诺:


您可以使用 git 返回 < tomit- id> 。

为了得到身份证明,请使用git日志。


作为以下步骤。

步骤1

Hit git 日志

从日志列表中找到最后的硬化散列代码, 然后输入 :

步骤2

git reset <hash code>

我很久以前也曾写过这些话,

如何删除/ 反转 Git 承诺

基本上,你只需要做:

git 日志, 获取 SHA hash 的前七个字符, 然后进行 git return < sha> , 然后再进行 git push -- force 。

您也可以使用 Git 返回命令, 恢复此命令如下: git 返回 < sha> - m - 1, 然后按 git 键 。


为了撤销最后的本地承诺, 在不丢弃更改的情况下, 我在 ~ /. gitconfig 中有这个便用别名

[alias]
  undo = reset --soft HEAD^

然后,我只需要使用Git 解码,这是超级容易记住的。


每个人都以如此复杂的方式发表意见。

如果您想要从分支中删除最后一项承诺, 最简单的方法是:

git reset --hard HEAD~1

现在,为了摆脱你最后的承诺,你必须

git push --force

这就对了,这会消除你最后的承诺


git reset --soft HEAD~1

git status

Output

在分支母版上, 您的分支比“ 来源/ 主机” 提前 1 承诺 。 (使用“ 给予推” 来发布您的本地承诺) 更改要执行 : (使用“ 给予恢复 - 级... ” 到 取消阶段) 新文件 : 文件 1 。

git log --oneline --graph

Output

90f8bb1 (HEAD - > master) 第二次承诺\ 7083e29 初始仓库承诺\


在这种情况下,"重置"命令就是你最好的朋友:

git reset --soft HEAD~1

重置将会将您当前的 HEAD 分支倒带到指定的修改 。 在以上的例子中, 我们希望回到当前修改之前的修改 - 有效地取消我们最后的承诺 。

注意 -- soft 旗号 : 这样可以确保未撤销修改的更改被保存。 在运行命令后, 您会发现您的工作副本中这些更改是未承诺的本地修改 。

如果您不想保留这些更改, 请使用 -- 硬旗 。 确定只有在您确定不再需要这些更改时才这样做 。

git reset --hard HEAD~1

我验证了所提议的有效方法,这里就是使用这一方法的一个具体例子:

如果您想要永久撤销/取消您的最后一项承诺(等等, 一个一个一个, 尽可能多) , 有三个步骤 :

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

$ git commit -m 'Initial commit'
$ git add forgotten_file
$ git commit --amend

重要的是要明白,当你正在修正你的最后一项承诺时,你并没有完全用新的、更好的承诺来取代它,新的承诺将旧承诺推开,而将新承诺置于其位置。 事实上,这好像前一项承诺从未发生,也不会出现在你的存储库历史中。

修改承诺的明显价值是略微改进你的最后一项承诺,而不会用表格“Oops,忘记添加文件”或“Darn,在最后一项承诺中确定打字符”等字词来模糊你的存储库历史。

2.4 Git Basics - 撤销事情


git 重置 HEADn} 会重置您最后的 n 动作 。

对于重置, 对于上一个动作, 使用 git 重置 HEAD\\\ 1} 。


为了将一些文件从 Git 承诺中移除, 请使用“ - 软” 选项的“ git 重置” 命令, 并在 HEAD 之前指定此承诺 。

$ git reset --soft HEAD~1

当运行此命令时, 您将会看到最近任务( HEAD) 中的文件, 您将能够执行它们 。

现在您的文件在中转区, 您可以使用“ git reset” 命令再次删除它们( 或取消它们) 。

$ git reset HEAD <file>

注意: 这次, 您正在从 HEAD 中重新设置文件, 因为您只是要将文件从您的中转区域中排除 。

如果您对该文件不再感兴趣,请使用“git rm” 命令从索引(也称为中转区)中删除文件。

$ git rm --cached <file>

修改完成后,您可以使用“修正”选项再次进行修改。

$ git commit --amend

要验证文件是否正确从仓库中移除文件, 您可以运行“ git Is- 文件” 命令, 检查文件是否在文件中出现( 如果是新的文件) 。

$ git ls-files

 <file1>
 <file2>

使用 Git 恢复从文件中删除文件

自 Git 2. 23 以来, 有一种将文件从承诺中移除的新方式, 但是您必须确保您使用的 Git 版本大于或等于 2. 23 。

$ git --version

2.244.1 Git 版本

注: Git 2.23 于2019年8月发布,

要安装更新版本的 Git, 您可以检查此教程 。 要将文件从承诺中删除, 请使用“ git reform” 命令, 使用“ 源代码” 选项指定源代码, 并指定要从仓库中删除的文件 。

例如,为了将名为“ Myfile” 的文件从HEAD 删除, 您将写入以下命令

$ git restore --source=HEAD^ --staged  -- <file>

举例来说, 让我们假装您编辑了您最近在您的“ 主管” 分支上的承诺中的文件 。

文件已正确执行, 但您想要从您的 Git 仓库中删除它 。

要从 Git 仓库中删除您的文件, 您需要先恢复它 。

$ git restore --source=HEAD^ --staged  -- newfile

$ git status

在分支“ 校长” 上

您的分支比“ 来源/ 主管” 提前 1 个承诺 。 (使用“ 提供推动” 来发布您本地的承诺 )

拟承诺的修改:

 (use "git restore --staged <file>..." to unstage)
    modified:   newfile

未准备进行的更改:

 (use "git add <file>..." to update what will be committed)
 (use "git restore <file>..." to discard changes in working directory)
      modified:   newfile

如你所见 你的档案又回到了中转区

从那里,您有两个选择, 您可以选择编辑您的文件, 以便重新重新打开它, 或者简单地从您的 Git 仓库中删除它 。

从 Git 仓库中删除文件

在本节中,我们将描述从您的 Git 仓库中删除文件的步骤。

首先,您需要卸载您的文件, 因为如果它被摆放, 您将无法删除它 。

要卸载文件, 请使用“ git 重置” 命令, 并指定 HEAD 为源代码 。

$ git reset HEAD newfile

当您的文件被正确卸载时, 请使用“ git rm” 命令, 使用“ cached” 选项来从 Git 索引中删除此文件( 这不会删除磁盘上的文件)

$ git rm --cached newfile

r m ' newfile' (新文件)

如果您现在检查了仓库状态, 您将可以看到 Git 正在准备删除承诺 。

$ git status

在分支“ 校长” 上

您的分支比“ 来源/ 主管” 提前 1 个承诺 。 (使用“ 提供推动” 来发布您本地的承诺 )

拟承诺的修改:

 (use "git restore --staged <file>..." to unstage)
    deleted:    newfile

现在您的文件已经准备就绪, 只需使用“ 授权承诺” 和“ 修正” 选项, 以修正您仓库中的最新承诺 。

`$ git commit --amend

 [master 90f8bb1] Commit from HEAD
  Date: Fri Dec 20 03:29:50 2019 -0500
  1 file changed, 2 deletions(-)
  delete mode 100644 newfile

`如你所见,这不会产生新的承诺,但将从根本上修改最近的承诺,以便包括您的更改。

从 GitCroud 中删除指定文件

某些情况下,你不希望所有文件再次出现:你只有一个文件可以修改一个非常具体的存储库文件。

要从 Git 承诺中删除特定文件, 请使用“ 软” 选项中的“ git 重置” 命令, 指定 HEAD 之前的承诺, 以及您要删除的文件 。

$ git reset HEAD^ -- <file>

修改完成后,您的文件就会回到中转区

首先,您可以选择使用“ Git 重置” 命令从中转区域删除文件,并指定您要从 HEAD 中重置。

$ git reset HEAD <file>

注意: 这并不意味着您会丢失此文件中的更改, 只是文件会被从中转区删除 。

如果您想要从索引中完全删除文件, 您就必须使用“ git rm” 命令, 并使用“ cached” 选项 。

$ git reset HEAD <file>

为了确保您的文件被正确从中转区移除, 请使用“ git Is- files” 命令来列出属于索引的文件 。

$ git ls-files

当您的修改完全完成后, 您可以使用“ git deform” 命令和“ amend” 选项来修改您删除文件的承诺 。

$ git commit --amend

我通常首先会发现我最近所作所为的杂草:

git log

看起来是这样的: 执行{long_hash}

复制此长 Hash 并重置它( 回到相同的文件/ 声明在其中) :

git reset --hard {insert long_hash without braces}

如果存储库是在当地承诺的,但尚未被推到服务器上,那么另一种粗糙/佣人解决它的方法将是:

Git 在另一个位置克隆仓库。 将修改( 文件/ 目录) 从原始仓库复制到这个新的仓库。 然后承诺并按下新仓库的修改。 用这个新的仓库替换旧的仓库 。


您可以使用您不想播放的文件重置不想要的文件命令。 通过使用此命令, 我们可以将更改的文件从中位区域移到工作目录 。

我如何在本地及远程解析 Git 承诺?


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


#1) $ git commit -m "Something terribly misguided" 
#2) $ git reset HEAD~                              

[必要时编辑文件]

 #3) $ git add .
#4) $ git commit -c ORIG_HEAD  

如果您想要还原最后一个任务, 但仍要保留在任务中本地作出的更改, 请使用此命令 :

git reset HEAD~1 --mixed

在回答之前,让我们补充一些背景,解释一下这个总部是什么。

首先,什么是总部?

HEAD 只是引用当前分支的当前承诺( 最新承诺) 。 在任何特定时间( 不包括 git worktree) 只能有一个 HEAD 。

HEAD的内容存放在.git/HEAD内,包含当前承诺的40字节SHA-1。


独立头部

如果您没有在最新的承诺 - 意思是,HEAD指向 历史的先前承诺, 它被称为独立的HEAD。

在命令行上, 它会看起来像这个 - SHA-1 而不是分支名称, 因为 HEAD 没有指向当前分支的端点 :


如何从独立的总部中恢复的几种选择:


git 检出

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits to go back

这将检查指向想要的承诺的新分支 。 此命令将检查退出给定的承诺 。 在此点上, 您可以创建一个分支, 从此开始工作 。

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git 重新格式

您也可以同时使用reflog。 git reflog 将显示任何更新 HEAD 的更改, 并检查想要的 reflog 条目, 将会将 HEAD 设置回至此任务 。

每次对总部领导部进行修改时,在重新格式中将有一个新的条目

git reflog
git checkout HEAD@{...}

这样你就可以回到你想要的事业了


git 重置 - 硬设置 < commit_ id>

"移动"你的总部 回到想要的承诺。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.

注: (自Git 2. 7) 您也可以使用 Git rebase -- no- autostash 。


git 返回 <sha-1>

“ 撤消” 指定的承诺或承诺范围。 重置命令将“ 撤消” 对给定承诺所做的任何更改 。 在原始承诺也将保留在历史中时, 将使用撤消补丁的新承诺 。

# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>

此图示显示哪个命令做什么。 正如您可以看到的, 重置 {} 检查退出 修改 HEAD 。


撤销一系列本地承诺

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 是如何被重写的 , 记录文件也从每次承诺中被丢弃 。

结论 结论 结论 结论 结论

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

最后 -- -- 友好建议

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

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


如果你还想背到最后承诺 并改过历史

使用下面的命令可以表示您想要转到先前的已执行 SHA - 71e2 e57458bde883a37b332035f784c6653ec509 的操作, 您可以指向此操作, 此操作在此操作后不会显示任何日志消息, 之后所有历史将被删除 。

git 推进源 + 71e2e57458bde883a37b332035f784c6653ec509: 技术主管


git reset --soft HEAD~1

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

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

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


如果你们在本地做出你们不喜欢的事,而他们还没有被推倒,而你们却可以把事情重现为以往的善事。这好像坏事从未发生过。下面是这样的:

在您的终端中( 终端、 Git Bash 或 Windows 命令提示) , 浏览到您的 Git repo 的文件夹中。 运行 git 状态, 并确保您有干净的工作树。 每个承诺都有一个独特的散列( 看起来像 2f5451f ) 。 您需要找到最后一件好事的散列( 您想要返回到哪个地方 ) 。 这里有两个地方您可以看到要承诺的散列 : 在 GitHub 或 Bitbucket 网站或网站的承诺历史中 。 在您的终端中( 终端、 Git Bash 或 Windows 命令快递) 运行命令 git 日志 -- 在线, 一旦您知道最后一件好事的仓列( 您想要返回到哪个地方) , 请运行以下的命令( 将 2f5451f 与您的承诺重写 ) :

git reset 2f5451f
git reset --hard 2f5451f

注意 : 如果您确实重置承诺, 将会删除, 但更改将显示为未承诺, 允许您访问代码 。 这是最安全的选项, 因为也许您想要一些代码, 现在您可以做出一些好的更改和新承诺 。 通常您会想要撤销承诺, 丢弃代码, 这正是 Git 重置 -- hard 所做的 。


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


git diff + git 应用程序是迄今为止我团队的最好选择, 清洁和非常容易, 不仅对最后一次任务来说


简单的分步骤指南如下:

销毁承诺并抛弃任何未承诺的变更

git reset --hard HEAD~1

取消承诺,但保留您的更改

git reset HEAD~1

保存您的文件, 并自动将所有更改都放回后方

git reset --soft HEAD~1

使你们复活,而你们被毁灭;

git reflog #to find the sh