我的目标是删除 github 上所有提交中的一个文件,因此我执行了后续步骤:
我用这个命令过滤了我的分支:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch [file_name]' HEAD
Run Code Online (Sandbox Code Playgroud)
在所有提交中删除一个文件,现在在运行后删除一个文件
git status
Run Code Online (Sandbox Code Playgroud)
它要求我拉,
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
Run Code Online (Sandbox Code Playgroud)
但我不想拉。我担心如果我拉出,我的提交中会再次出现这个文件。
难道我现在不应该推送它以便更改在我的 git hub 上生效吗……我不知道该怎么做。
当然,github 上的 git 和本地计算机上的 git 有不同的历史记录:一个有文件,一个没有。你需要 :
git push --force
Run Code Online (Sandbox Code Playgroud)
覆盖 github 存储库。
是的,你应该推动......也许。
git filter-branch重写历史……只不过它没有重写历史,而是创造了新的历史。
解释一下,如果您的存储库看起来像这样,并且master分支位于提交 E 和 origin 上。
A -- B -- C -- D -- E [master]
[origin/master]
Run Code Online (Sandbox Code Playgroud)
然后,在您运行之后,git filter-branch这些提交将被重写为新的提交。但来源(在 Github 上)仍然是一样的。
A -- B -- C -- D -- E [origin/master]
\
-- B1 - C1 - D1 - E1 [master]
Run Code Online (Sandbox Code Playgroud)
他们已经“分歧”了。这就是git status告诉你的。你master不是 的孩子origin/master。
通常这意味着您已经进行了本地更改,master而其他人已经将更改推送到了 origin 的master. 所以它告诉你拉取其他人的更改。
但这是不正确的。你正在重写历史。所以你应该使用git push新版本的master. 但出于安全原因,git 不允许你这样做,所以你必须这样做git push --force。