如何从git中排除提交?

如何从git中排除提交?,git,Git,昨天git历史上出现了不应该出现的提交 这是一个截图 之所以发生这种情况,是因为需要清理.gitignore下的文件,但这些文件仍然被git跟踪。为了做到这一点,我们使用了这个答案 一切都是如此。但是我们意识到实际上并不是所有在.gitignore(错误)下的文件都应该被删除 问题是-目前这些提交被推送,我们需要排除它们(恢复) 有什么办法吗 是否有一种方法可以获取所有已删除的文件(我们可以在提交中看到它们)并将其再次包含在新提交中 p.S.文件在git中,但随后被删除并推送到git。现在我

昨天git历史上出现了不应该出现的提交

这是一个截图

之所以发生这种情况,是因为需要清理
.gitignore
下的文件,但这些文件仍然被git跟踪。为了做到这一点,我们使用了这个答案

一切都是如此。但是我们意识到实际上并不是所有在
.gitignore
(错误)下的文件都应该被删除

问题是-目前这些提交被推送,我们需要排除它们(恢复)

有什么办法吗

是否有一种方法可以获取所有已删除的文件(我们可以在提交中看到它们)并将其再次包含在新提交中

p.S.文件在git中,但随后被删除并推送到git。现在我们需要把他们找回来


例如,我们有这样的提交历史
A-B-C-D
。我们在commit
A
中有一些重要的文件,然后在commit
B
中删除这些文件,然后在commit
C-D
中通过逻辑实现定期提交,等等。因此,在提交
B
中删除的文件需要返回。我们需要排除提交
B
,并保留提交
C-D
。类似这样的
A-C-D
。或者另一种方法是
A-B-C-D-B

当然,您可以恢复

git revert <SHA of erroneous commit>
git还原
或者,您可以重写完整的历史记录,但这将更新所有可能存在危险的SHA(如果其他人已准备好处理分支)

为此,您必须冻结其他开发人员,以便在此期间工作

git checkout branchA   // one of the problematic branch
git rebase -i <sha1 befor the pb>
-->   mark the "remove ignored file" commit as `edit`
// this will stop into the "guilty commit"
// at this point we undo the commit 
git reset HEAD^ 
// and then redo do the job like it should have 
....
// including the  "git commit "
// you can even do more than one git "commit"
git rebase --continue

// then 
git push -f origin branchA
git签出分支//有问题的分支之一
git-rebase-i
-->将“删除忽略的文件”提交标记为“编辑”`
//这将进入“有罪犯”阶段
//此时,我们撤消提交
git复位头^
//然后重新做它应该做的工作
....
//包括“git提交”
//您甚至可以执行多个git“提交”
git rebase--继续吗
//然后
git-push-f原始分支
其他开发人员现在可以再次拉动

注意:为了更安全地执行此操作,您可以创建一个工作分支,并在结果不符合预期时将其删除

git checkout branchA   // one of the problematic branch
git checkout -b branchA-before-rework // just in case

git checkout -b A-rework-1
git revert <SHA1 erroneous commit>

// ? happy :)
git branch -f branchA   // will force branchA to here
git push -f origin branchA
// not happy try something else

git checkout branchA   // one of the problematic branch
git checkout -b A-rework-2
// do above "git rebase -i" stuff EXCEPT push -f
// ? not happy drop it
git checkout branchA   // one of the problematic branch
git checkout -b A-rework-n
// ? happy :)
git branch -f branchA   // will force branchA to here
git push -f origin branchA
git签出分支//有问题的分支之一
git checkout-返工前的branchA//以防万一
git签出-b A-返工-1
git还原
// ? 快乐:)
git branch-f branchA//将强制branchA到这里
git-push-f原始分支
//不开心试试别的吧
git checkout branchA//有问题的分支之一
git签出-b A-返工-2
//除了push-f之外,请执行上面的“git rebase-i”操作
// ? 不高兴放下它
git checkout branchA//有问题的分支之一
git签出-b A-n
// ? 快乐:)
git branch-f branchA//将强制branchA到这里
git-push-f原始分支

最好删除手动添加的文件,并将gitignore正确地包含在项目中。请查看filter branch,以便重写history@LokendraChoudhary有超过100个文件。。。添加、查找和添加它们并不是一件简单的事情back@MadPhysicist你能解释一下你所说的过滤分支是什么意思吗?或者重写历史记录?尝试rebase-i并删除一些提交或返工,将存储库的历史记录主题化是一件非常糟糕的事情:所有您删除的提交的子项都将得到一个新的SHA。从这些提交中生成的每个分支都需要重新设置基础。每个工作目录都可能严重损坏。简言之:任何使用你删除的行的人都会看到推土机正在提升它们的基础。@DaemonPainter确定这是一个缺点,你知道更安全的方法吗?据我所知,我可以将这些行标记为
编辑
(如果我想编辑它们)或只是删除它们(如果不想编辑就删除它们),对吗?还有,例如,我从rebase文件中删除了所有这些行(comments),我有15个提交,我需要它们全部,所以我需要粘贴
git-rebase——每次提交跳过
(大约15次),或者有一个命令,比如
take-all
?所有新的提交sha都将被修改是的,这是要付出的代价。。。