我提交了一些我不应该提交的文件。 然后我在.gitignore中添加了这些文件,我这样做了:
git rm -r --cached somefile
我再次承诺。
git status
显示:
# On branch experiment
nothing to commit, working directory clean
我做git ls-files
并且未列出这些文件。
但是当我执行git push origin somebranch
时,这些文件仍然被推送(它们太大而无法推送到github,所以它失败了。)
答案 0 :(得分:5)
文件仍在您的git历史记录中。例如,git历史就是问题所在:
$ git log --oneline
aaaaaaa Update .gitignore and remove big files
bbbbbbb accidentally add big files to repo
ccccccc update foo
ddddddd update bar
由于推送了提交bbbbbbb
的内容而导致推送失败,因此该文件不在您当前已检出的版本中它在项目历史记录中无关紧要。
通过检查特定文件/路径的历史记录也可以确认以上内容:
$ git log --all --format=%H -- big.file
aaaaaaa Update .gitignore and remove big files
bbbbbbb accidentally add big files to repo
如果big.file
足够大以防止推送到github - 您需要提交的列表为空
有多种方法可以阻止尝试将big.file
推送到遥控器,但根据问题中最简单的信息:
$ git reset --hard ccccccc
这将删除提交aaaaaaa
和bbbbbbb
,因此不会尝试将big.file
推送到遥控器。
.gitignore
个文件影响将文件添加到存储库,do not affect files already in the index。这就是向.gitignore
添加文件对“问题”没有影响的原因。
答案 1 :(得分:1)
如果您已提交该文件。 您可以使用以下方法取消最新的提交:
git reset --soft HEAD^
然后:
git reset filename
然后将文件添加到.gitignore:
或:
git update-index --assume-unchanged filename
答案 2 :(得分:0)
这里的解决方案可以使用,但是您将在同一提交中丢失其他更改。如果您不想丢失同一提交中的其他更改,并且尚未推送该提交,则必须将HEAD更改回先前的提交,添加更改的文件并进行修改:
首先找到您想返回的提交:
$ git log --oneline
然后,需要签出另一个分支,因为您不能在活动分支中更改HEAD:
$ git checkout master
然后,将分支的头更改为较早的提交:
$ git branch -f <branch_name> <commit_id>
然后,将更改的文件添加到当前提交:
$ git add <filename>
然后,将更改修改为当前提交:
$ git commit --amend --no-edit
该多步骤解决方案为我解决了不丢失更改并将新更改添加到先前提交的问题。