我的目标是在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上生效了吗?我不知道该怎么办。
4条答案
按热度按时间qgzx9mmu1#
当然,github上的git和本地计算机上的git有不同的历史记录:一个有文件一个没有您需要:
字符串
覆盖github仓库。
pkmbmrz72#
是的,你应该推。。大概吧。
git filter-branch
重写历史...只不过它没有重写而是创造了新的历史为了解释,如果你的仓库看起来像这样,在commit E和origin上有
master
分支。字符串
然后在运行
git filter-branch
之后,这些提交将被重写为新的提交。但是起源(在Github上)仍然是一样的。型
他们“分道扬镳”了。这就是
git status
告诉你的。您的master
不是origin/master
的子级。通常这意味着您对
master
进行了本地更改,而其他人则将更改推送到origin的master
。所以它告诉你去拉别人的变化。但这是不正确的。你在改写历史。所以你应该
git push
你的新版本的master
。但出于安全原因,git不允许你这么做,所以你必须使用git push --force
。j7dteeu83#
git filter-branch
所做的是重写历史。一旦你重写了它,所有来自分歧点的提交都被认为是不同的。这就是为什么它告诉你有18个不同的提交-这里的分歧点是18个提交之前。你不应该合并分支,要么做一个备份然后用
git push --force
覆盖master,要么就把它作为一个新的分支推送。yqkkidmi4#
注意:Git 2.42(Q3 2023)将更改消息,提示在某些情况下强制推送是一种有效且明智的更新远程仓库分支的方法,而不是与merge/rebase协调一致。
参见commit c577d65,commit d92304f,commit b6f3da5(2023年7月12日)by Alex Henrie (
alexhenrie
)。(由Junio C Hamano --
gitster
--合并于commit 88d08c3,2023年7月25日)remote
:并不意味着在推送之前总是需要集成签字人:亚历克斯·亨利
在一个狭窄但常见的情况下,用户是分支的唯一作者,并且不介意覆盖远程上的相应分支。
这种工作流在GitHub、GitLab和Gerrit上特别常见,它们会永久记录在为该分支打开拉取请求时推送的分支的每个版本。
在这些平台上,强制推送受到鼓励,类似于通过电子邮件发送补丁集的新版本。
当给出关于发散分支的建议时,告诉用户
git pull
(man),但不要无条件地指示用户这样做。一个不太规范的消息将有助于防止用户认为他们需要创建一个集成的历史,而不是简单地替换以前的历史。
同样,不要暗示
git pull
只用于合并。因此,而不是:
字符串
您将看到:
型