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

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


当前回答

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

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

git log 

然后你们可以做:

git reset --hard <commit_id>

git push origin <branch_name> -f

其他回答

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

[alias]
  undo = reset --soft HEAD^

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

第一运行 :

git reflog

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

那么,请:

git reset --hard ActionIdFromRefLog

头:

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

Git 承诺 :

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

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

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

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

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

git 重置 0xab3 # 提交编号

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

以下是图形表达式 :

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

首先,什么是总部?

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 commit --amend        # Change last commit
git reset HEAD~1 --soft   # Undo last commit