我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。
我如何从当地存储库撤销这些承诺?
我无意中把错误的文件给了Git, 但还没有把承诺推到服务器上。
我如何从当地存储库撤销这些承诺?
当前回答
简单的分步骤指南如下:
销毁承诺并抛弃任何未承诺的变更
git reset --hard HEAD~1
取消承诺,但保留您的更改
git reset HEAD~1
保存您的文件, 并自动将所有更改都放回后方
git reset --soft HEAD~1
使你们复活,而你们被毁灭;
git reflog #to find the sh
其他回答
如果你打算完全撤销一个本地的承诺, 无论你改变什么你对承诺所做的, 如果你对此不担心, 执行以下命令。
git reset --hard HEAD^1
(此命令将忽略您的全部任务, 您的更改将完全从您的本地工作树中消失) 如果您想要撤销您的承诺, 但是您想要您在中转区域中的更改( 在像 Git 添加后一样执行前) , 那么执行以下命令 。
git reset --soft HEAD^1
现在,您的已执行文件将进入中转区域。 如果您想要提升文件, 您需要编辑错误的内容, 那么执行以下命令
git reset HEAD
现在承诺要将文件从舞台区域移到非舞台区域。 现在文件已准备编辑, 所以无论您改变什么, 您都想要去编辑和添加它, 并做出新的/ 新的承诺 。
更多(断链接) (存档版本)
git reset --soft HEAD~1
软性 : 这将只从本地端删除承诺, 并保留文件所做的更改 。
git reset --hard HEAD~1
git push origin master
硬性 : 这将从本地和远程删除承诺, 并删除文件中所做的更改 。
撤消上一个任务
在很多情况下,你真的想撤销你代码中的最后一项承诺。例如,因为你想对它进行广泛的重组,甚至完全抛弃它!
在这种情况下,"重置"命令就是你最好的朋友:
$ git reset --soft HEAD~1
以上命令( 重置) 将把您当前的 HEAD 分支倒回指定的修改 。 在以上的例子中, 我们想回到当前修改前的修改中, 有效地取消我们上次的修改 。
注意 -- soft 旗号 : 这样可以确保未撤销修改的更改被保存。 在运行命令后, 您会发现您的工作副本中这些更改是未承诺的本地修改 。
如果您不想保留这些更改, 请使用 -- 硬旗 。 您确定不需要这些更改时, 一定要这样做 。
$ git reset --hard HEAD~1
调
如何编辑上一个承诺
通常我并不想撤销一连串的承诺, 而是编辑早先的承诺,
我发现自己经常去修修过去的东西 以至于我写了剧本
以下是工作流程:
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
这将添加一个新的承诺, 删除所添加的文件 。
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"
或者您可以重写历史来撤销最后一项承诺 。
警告:此命令将永久删除对.java 文件( 和任何其他文件) 所做的修改 -- 从工作目录中删除所有修改 :
git reset --hard HEAD~1
硬重置为 HEAD-1 将把您的工作副本设定为您错误实施前的行为状态 。