你好,我对 Git 很陌生。我正在我的分支上工作,我不小心提交并推送了我修改的文件(但不希望出现在我的 pull 请求中)。例如:我推送了fileA.py
、fileB.py
、fileC.py
。不过,我只希望 pull 请求中包含 fileA.py
和 fileB.py
。
来自
- FileA.py
- FileB.py
- FileC.py
至
- FileA.py
- FileB.py
我找到的大多数答案都涉及删除fileC.py
。我不想真正删除 fileC.py
,我仍然希望它在存储库中只是未修改的版本,就像在 master 中一样。有没有 git 命令可以实现这一点?感谢您的帮助!
最佳答案
警告:既然您提到了 pull 请求,我假设您正在推送到一个单独的分支,除了您之外没有其他人在处理该分支。否则,通常不鼓励进行强制推送。
让我们假设某种状态:
$ touch fileA.py fileB.py fileC.py
$ git add .
$ git commit -m "my message"
$ git push
$ ls
fileA.py* fileB.py* fileC.py*
$ git ll
* 537443d - (HEAD -> my-branch) my message (9 seconds ago) <Aleksander Stelmaczonek>
0 0 fileA.py
0 0 fileB.py
0 0 fileC.py
注意:git ll
是我自定义的命令别名,请参阅最后的定义。
要从提交中删除 fileC.py
并将其保留在工作目录中,您可以使用 git rm
命令,然后修改您的提交并重新推送它(强制推送)用修改后的提交替换原始提交。请注意,默认情况下此命令还会从磁盘中删除文件,您需要使用 --cached
选项。
$ git rm -h
usage: git rm [<options>] [--] <file>...
-n, --dry-run dry run
-q, --quiet do not list removed files
--cached only remove from the index
-f, --force override the up-to-date check
-r allow recursive removal
--ignore-unmatch exit with a zero status even if nothing matched
现在:
$ git rm --cached fileC.py
rm 'fileC.py'
$ git status
On branch my-branch
Changes to be committed:
deleted: fileC.py
Untracked files:
fileC.py
$ git commit --amend -m "my message"
[my-branch beebdc1] my message
Author: Aleksander Stelmaczonek <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6827040d03283c3827242d234604070b09040c0705090106" rel="noreferrer noopener nofollow">[email protected]</a>>
Date: Wed Nov 10 18:25:37 2021 +0100
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 fileA.py
create mode 100644 fileB.py
$ git ll
941acb2 - (HEAD -> my-branch) my message (13 seconds ago) <Aleksander Stelmaczonek>
0 0 fileA.py
0 0 fileB.py
$ ls
fileA.py* fileB.py* fileC.py*
$ git push --force
我想强烈强调,如果有多个人在这个分支上工作,那么强制推送是一个非常糟糕的主意。潜在的问题并不那么容易解决,尤其是对于新手来说。
一般来说,我强烈建议阅读 Git Book 。它是免费的并且写得很好。对于新手来说,值得阅读的章节是第 1、2、3、7.1、7.2、7.3 和 7.7 章。
就我个人而言,对于与创建和修改提交相关的所有内容,我通常只使用 GUI。找出最适合您的 GUI 工具。我用https://git-fork.com/ .
这就是如何使用我的 git ll
命令 ( and others ) 增强 git 体验:
git config --global alias.ll "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %Cblue<%an>%Creset' --abbrev-commit --date=relative --numstat"
关于git - 如何在git中将文件 "Un-push"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69917499/