Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除一些过去重复的git提交?_Git_Github - Fatal编程技术网

如何删除一些过去重复的git提交?

如何删除一些过去重复的git提交?,git,github,Git,Github,在我的办公室里,我发现我向github提交了一个敏感文件。因此,我习惯于从过去的提交中删除该文件。所以它被删除了,我很高兴。我猜提交哈希在那个时候已经更改了 我回到家,打开了一个github桌面。它说我需要从原点出发,我做到了。在那之前没有任何问题 但github桌面说我必须推送3次提交。这很奇怪,但我很好奇,所以我同意推。我不该这么做。现在所有提交都有重复项 这就像最近在顶部提交的内容: 5 min ago : Merge branch 'master' of https:.... 3 hrs

在我的办公室里,我发现我向github提交了一个敏感文件。因此,我习惯于从过去的提交中删除该文件。所以它被删除了,我很高兴。我猜提交哈希在那个时候已经更改了

我回到家,打开了一个github桌面。它说我需要从原点出发,我做到了。在那之前没有任何问题

但github桌面说我必须推送3次提交。这很奇怪,但我很好奇,所以我同意推。我不该这么做。现在所有提交都有重复项

这就像最近在顶部提交的内容:

5 min ago : Merge branch 'master' of https:....
3 hrs ago : commit 3
22 hrs ago : commit 2
22 hrs ago : commit 2
00 days ago : commit 1
00 days ago : commit 1
00 days ago : initial commit
“提交1”和“提交2”具有重复项。 还有一个提交'commit 1',一个提交'commit 2'和'Merge branch…'都有我删除的敏感文件。它现在已从github桌面重新上载


我需要删除三个提交,而不涉及其他提交。

我认为这可能正是您在这里寻找的内容:

编辑:我认为上面的链接更适合您的情况,因为您的提交ID可能是相同的。如果身份证不是,我不明白为什么这不起作用

这也可能是有用的:

也许运行这里列出的提示可以撤消您想要删除的提交

运行这个:git revert{commit_id},并使用您想要去掉的提交id可能会起作用。然而


还有一节是关于撤消上次提交的,但听起来您需要撤消3。一定要有备份,以防万一

我想这可能正是您在这里寻找的:

编辑:我认为上面的链接更适合您的情况,因为您的提交ID可能是相同的。如果身份证不是,我不明白为什么这不起作用

这也可能是有用的:

也许运行这里列出的提示可以撤消您想要删除的提交

运行这个:git revert{commit_id},并使用您想要去掉的提交id可能会起作用。然而


还有一节是关于撤消上次提交的,但听起来您需要撤消3。一定要有备份,以防万一

我能想到的最好的方法就是在这里使用rebase来重写历史,并对其进行推进。以下是一些有助于此的步骤:

$> git rebase -i HEAD~6 // takes in 6 commits you want to edit

// Update the ones which you want to drop
drop xxxxxx initial commit
pick xxxxxx commit 1
drop xxxxxx commit 1
pick xxxxxx commit 2
drop xxxxxx commit 2
pick xxxxxx commit 3
drop xxxxxx Merge branch 'master' of https:....
注意:提交按与通常相反的顺序列出 使用log命令查看它们


更详细的说明。

我能想到的最好的方法是在这里使用rebase来重写历史记录,并执行推力。以下是一些有助于此的步骤:

$> git rebase -i HEAD~6 // takes in 6 commits you want to edit

// Update the ones which you want to drop
drop xxxxxx initial commit
pick xxxxxx commit 1
drop xxxxxx commit 1
pick xxxxxx commit 2
drop xxxxxx commit 2
pick xxxxxx commit 3
drop xxxxxx Merge branch 'master' of https:....
注意:提交按与通常相反的顺序列出 使用log命令查看它们


更详细的说明。

在本例中,您的本地分支很可能处于原始的预清理状态,而远程分支处于更改状态。重写历史记录后,应删除所有本地副本,或将本地分支重置为远程分支。不过,现在你需要自己做一些清理工作

我的本地电脑是干净的,遥控器不是 如果你清理了当地的分支机构,你的结局是这样的:

M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Original Commit 2
│ o ccccc Original Commit 1
o │ bbbbb Commit 3
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Commit 3
│ o ccccc Original Commit 2
│ o bbbbb Original Commit 1
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
在这里,你需要摆脱99999和aaaaa。您可以像使用一样使用交互式重基来完成此操作,也可以通过重置分支来完成此操作:

git reset --hard bbbbb
git push --force origin master
遥控器是干净的,我的本地电脑不是 如果您清理了遥控器,您的历史记录可能如下所示:

M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Original Commit 2
│ o ccccc Original Commit 1
o │ bbbbb Commit 3
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Commit 3
│ o ccccc Original Commit 2
│ o bbbbb Original Commit 1
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
在本例中,AAAA是以前的源/主,DDD是您的本地分支。你想要的结果是:

  o ddddd Commit 3
o─┘ aaaaa Cleaned Commit 2
o   99999 Cleaned Commit 1
o   88888 Previous Commit
您可以通过一个重基来实现这一点,您甚至可以添加-i来确认它正在实现您的期望:

 git checkout master
 git rebase --onto aaaaa ddddd^
 git push --force origin master
无论您在本地分支上进行了多少次提交,都可以使用此功能;您可以直接引用ccccc要删除的最新本地提交,或DDD^要保留的第一个提交的父提交

警告-强制推送至主机
请注意,您正在再次向master branch重写历史记录。考虑到您的原始提交包含敏感文件,并且您以前很乐意重写master的历史以消除此问题,因此您可以再次这样做。只需确保让此存储库的任何其他用户知道情况。

在这种情况下,您的本地分支很可能处于原始的预清理状态,而远程分支处于已更改状态。重写历史记录后,应删除所有本地副本,或将本地分支重置为远程分支。不过,现在你需要自己做一些清理工作

我的本地电脑是干净的,遥控器不是 如果你清理了当地的分支机构,你的结局是这样的:

M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Original Commit 2
│ o ccccc Original Commit 1
o │ bbbbb Commit 3
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Commit 3
│ o ccccc Original Commit 2
│ o bbbbb Original Commit 1
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
在这里,你需要摆脱99999和aaaaa。使用interactive或rebase重置分支时,您可以执行以下操作:

git reset --hard bbbbb
git push --force origin master
遥控器是干净的,我的本地电脑不是 如果您清理了遥控器,您的历史记录可能如下所示:

M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Original Commit 2
│ o ccccc Original Commit 1
o │ bbbbb Commit 3
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
M─┐ eeeee Merge branch 'master' of ...
│ o ddddd Commit 3
│ o ccccc Original Commit 2
│ o bbbbb Original Commit 1
o │ aaaaa Cleaned Commit 2
o │ 99999 Cleaned Commit 1
o─┘ 88888 Previous Commit
在本例中,AAAA是以前的源/主,DDD是您的 当地分行。你想要的结果是:

  o ddddd Commit 3
o─┘ aaaaa Cleaned Commit 2
o   99999 Cleaned Commit 1
o   88888 Previous Commit
您可以通过一个重基来实现这一点,您甚至可以添加-i来确认它正在实现您的期望:

 git checkout master
 git rebase --onto aaaaa ddddd^
 git push --force origin master
无论您在本地分支上进行了多少次提交,都可以使用此功能;您可以直接引用ccccc要删除的最新本地提交,或DDD^要保留的第一个提交的父提交

警告-强制推送至主机

请注意,您正在再次向master branch重写历史记录。考虑到您的原始提交包含敏感文件,并且您以前很乐意重写master的历史以消除此问题,因此您可以再次这样做。只需确保让此存储库的任何其他用户知道情况。

运行bfg repo cleaner后,您是否进行了强制操作?恐怕你又从遥控器中取出了你的敏感文件。@k0pernikus正是因为他没有做推进力,所以他得到了他的当前情况。他本应该使用强制,但他却像你说的那样,将他的敏感文件拉回到了存储库中。我真的不喜欢就强制推送或剥离提交的堆栈溢出给出建议,人们总是不知道自己在做什么,而且往往会陷入比以前更糟糕的境地。然而,您可能需要做的是类似于git reset-hard HASH-OF-LAST-GOOD-COMMIT的事情,即,在您拉之前,清理分支的顶端是没有敏感数据的COMMIT 3的HASH,然后是git push-f。但是,如果您同时进行了其他提交,您需要做一些完全不同的事情。无论哪种方式,请确保您的存储库、敏感数据和所有内容都有一个良好的备份,这样无论您做什么,您都不会丢失所有内容。谢谢大家。作为将来的参考,我在应用BFG cleaner之后使用了git push-我应该使用git push-f。在运行BFG repo cleaner之后,您是否使用了推力?恐怕你又从遥控器中取出了你的敏感文件。@k0pernikus正是因为他没有做推进力,所以他得到了他的当前情况。他本应该使用强制,但他却像你说的那样,将他的敏感文件拉回到了存储库中。我真的不喜欢就强制推送或剥离提交的堆栈溢出给出建议,人们总是不知道自己在做什么,而且往往会陷入比以前更糟糕的境地。然而,您可能需要做的是类似于git reset-hard HASH-OF-LAST-GOOD-COMMIT的事情,即,在您拉之前,清理分支的顶端是没有敏感数据的COMMIT 3的HASH,然后是git push-f。但是,如果您同时进行了其他提交,您需要做一些完全不同的事情。无论哪种方式,请确保您的存储库、敏感数据和所有内容都有一个良好的备份,这样无论您做什么,您都不会丢失所有内容。谢谢大家。作为将来的参考,我在应用BFG cleaner之后使用了git push-我应该使用git push-f。这很奇怪,但“git log”命令给了我四次提交,但github显示了七次提交。。这可能吗?远程存储库和本地存储库是否同步?谢谢大家,但这个答案最简单,而且效果很好。为了将来参考,git rebase-i-root将通过editorvisualstudio代码为我打开git rebase todo文件。然后,您可以选择要选择的提交。选择xxxxxxx初始提交删除xxxxxxx提交1删除xxxxxxx提交2选择xxxxxxx提交1选择xxxxxxx提交2选择xxxxxxx提交3删除xxxxxxx合并分支…这很奇怪,但“git log”命令给出了四次提交,但github显示了七次提交。。这可能吗?远程存储库和本地存储库是否同步?谢谢大家,但这个答案最简单,而且效果很好。为了将来参考,git rebase-i-root将通过editorvisualstudio代码为我打开git rebase todo文件。然后,您可以选择要选择的提交。选择xxxxxxx初始提交删除xxxxxxx提交1删除xxxxxxx提交2选择xxxxxxx提交1选择xxxxxxx提交2选择xxxxxxx提交3删除xxxxxxx合并分支…这很奇怪,但“git log”命令给出了四次提交,但github显示了七次提交。。这是可能的吗?如果master和origin/master具有相同的ID,则它们具有相同的提交。执行git-fetch-origin,后跟git-rev-parse-master和git-rev-parse-origin/master进行比较。然后看看git日志图主控和git日志图源/主控。我还发现它对查看git历史记录特别有用。谢谢,我发现在我的例子中,origin/master和master是不同的。我认为它们总是相同的。在像Subversion这样的非分布式世界中,远程和本地之间没有区别。在git中,远程分支可以与其本地等价分支不同,就像两个本地分支可以彼此不同一样。事实上,git pull本质上与m相同
正如您刚刚发现的,将远程分支合并到本地分支中-例如git fetch&&git merge@{upstream}。这很奇怪,但是“git log”命令给了我四次提交,但github显示了七次提交。。这是可能的吗?如果master和origin/master具有相同的ID,则它们具有相同的提交。执行git-fetch-origin,后跟git-rev-parse-master和git-rev-parse-origin/master进行比较。然后看看git日志图主控和git日志图源/主控。我还发现它对查看git历史记录特别有用。谢谢,我发现在我的例子中,origin/master和master是不同的。我认为它们总是相同的。在像Subversion这样的非分布式世界中,远程和本地之间没有区别。在git中,远程分支可以与其本地等价分支不同,就像两个本地分支可以彼此不同一样。事实上,正如您刚才所发现的,git pull本质上与将远程分支合并到本地分支相同,例如git fetch&&git merge@{upstream}。