我无意间把错误的档案 写错给Git 基特,但还没有将承诺推进到服务器上。
我如何解除那些承诺?当地当地仓库?
我无意间把错误的档案 写错给Git 基特,但还没有将承诺推进到服务器上。
我如何解除那些承诺?当地当地仓库?
当前回答
为了将一些文件从 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 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 重置” 命令, 并指定 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
`如你所见,这不会产生新的承诺,但将从根本上修改最近的承诺,以便包括您的更改。
某些情况下,你不希望所有文件再次出现:你只有一个文件可以修改一个非常具体的存储库文件。
要从 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 rebase --onto HEAD~1 HEAD
但如果你想放弃其中的 多项承诺,你确实说
- > b - > c - > > d - > 硕士
,然后您要放弃“ c” 承诺
git rebase --onto b c
这将使“ b” 成为“ d” 删除“ c” 的新基础
OP: 我如何撤销当地最近在Git的最新承诺? 我无意中犯下了错误的案卷[作为几项承诺的一部分]。
依你追求的结果而定,有几种方式可以“不做”作为承诺系列。考虑到下面的起始案例,reset
, rebase
和filter-branch
全部可以用于重写您的历史 。
如何可以C1 C1和C2 C2 级将取消以删除tmp.log
是否从每个文件中做出 ?
在下文的例子中,使用了绝对承诺参考,但如果更多地使用相对参考(即:HEAD~2
或HEAD@{n}
).
reset
$ git reset --soft t56pi
与reset
,一个分支可以重置到先前的状态,而任何复合变化都返回到等待区,从中可以放弃任何不必要的变化。
注:原为:reset
将所有先前的修改分组到等待区,个人承诺元数据将丢失。如果这与您有问题,你也许更有机会与rebase
或filter-branch
取而代之。
rebase
$ git rebase --interactive t56pi
使用交互式rebase
可以在分支中修改和丢弃不想要的更改。在以上信息图中,右侧的源树可以显示状态位置。rebase
.
逐步执行
t56pi
)pick
与edit
保存和关闭。HEAD
,删除不需要的文件,创建全新的承诺。注:与rebase
大部分承诺元数据的保存与承诺元数据的保存形成对比。reset
上方的替代选项。 如果您想要保留大部分历史, 但只删除不需要的文件, 这很可能是一个首选选项 。
filter-branch
$ git filter-branch --tree-filter 'rm -r ./tmp.log' t56pi..HEAD
上上命令会过滤文件./tmp.log
所有承诺在理想范围内的t56pi..HEAD
(假设我们最初的起步案例来自以上)请见下文说明清楚。
类似rebase
, filter-branch
可用于从分支的一个小节中清除不想要的文件。 而不是通过重设程序手动编辑每项承诺,filter-branch
能够自动预设对每项承诺的预期行动。
注:就像rebase
, filter-branch
仅丢弃所需文件, 将保存承诺元数据的其余部分 。C1 C1和C2 C2 级已经改写了, 日志文件被丢弃了, 从每个任务中 。
就像任何与软件开发有关的事情一样,对于一个特定的问题,有多种方法可以实现相同(或类似)的结果。你只需要选择最适合你特定案例的方法。
请注意上面所有三种选择都完全重写历史。 除非您确切知道自己在做什么, 并在团队中保持良好的沟通 — — 只有重写承诺还没有远程发布 !
资料来源:以上所有例子都是从中借用的博客博客.
我通常首先会发现我最近所作所为的杂草:
git log
看起来是这样的:commit {long_hash}
复制此副本long_hash
并重置它(回到相同的文件/声明在承诺上):
git reset --hard {insert long_hash without braces}
撤消上一个任务
在很多情况下,你真的想撤销你代码中的最后一项承诺。例如,因为你想对它进行广泛的重组,甚至完全抛弃它!
在这种情况下,"重置"命令就是你最好的朋友:
$ git reset --soft HEAD~1
以上命令( 重置) 将把您当前的 HEAD 分支倒回指定的修改 。 在以上的例子中, 我们想回到当前修改前的修改中, 有效地取消我们上次的修改 。
注注:--soft
旗帜 : 这样可以确保未撤销修改中的更改被保存。 在运行命令后, 您会发现这些更改是您工作副本中未承诺的本地修改 。
如果您不想保留这些修改,只需使用--hard
。确保只在确定不再需要这些更改时才这样做。
$ git reset --hard HEAD~1
#1) $ git commit -m "Something terribly misguided"
#2) $ git reset HEAD~
[必要时编辑文件]
#3) $ git add .
#4) $ git commit -c ORIG_HEAD