我的目标是在github上的所有提交中删除一个文件,以便我接下来的步骤:
我已使用此命令过滤了我的分支:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch [file_name]' HEAD
删除所有提交中的单个文件,现在运行
git status
它要我拉,
ubuntu@ubuntu:/var/www/html/laravel/app_folder$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 18 and 18 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean
但我不想拉。我担心,如果我拉,我会在我的提交中再次提供此文件。
我现在不应该推它,所以更改会在我的git hub上生效....我不知道该怎么做。
答案 0 :(得分:3)
是的,你应该推......可能。
git filter-branch
重写历史记录...除非它没有重写历史记录,否则会创建新历史记录。
要解释一下,如果您的存储库看起来像这样,提交E上的master
分支以及原点。
A -- B -- C -- D -- E [master]
[origin/master]
然后在运行git filter-branch
之后,这些提交将被重写为新的提交。但是起源(在Github上)仍然是相同的。
A -- B -- C -- D -- E [origin/master]
\
-- B1 - C1 - D1 - E1 [master]
他们已经"分歧"。这是git status
告诉你的。您的master
不是origin/master
的孩子。
通常这意味着您已对master
进行了本地更改,而其他人已将更改推送到master
。所以它告诉你要引起其他人的变化。
但这是不正确的。你覆盖了历史。因此,您应该git push
新版master
。除了git不允许你出于安全原因这样做,所以你必须git push --force
。
答案 1 :(得分:2)
git filter-branch
的作用是重写历史记录。一旦你重写了它,从发散点开始的所有提交都被认为是不同的。这就是为什么它告诉你你有18个不同的提交 - 这里的分歧是18次提交。
您不应该合并分支,进行备份,然后使用git push --force
覆盖master或者将其作为新分支推送。
答案 2 :(得分:2)
当然,gitub和本地计算机上的git有不同的历史:一个有文件,一个没有。 你需要:
git push --force
覆盖github存储库。