git - 如何在git中将文件 "Un-push"?

标签 git version-control push git-commit

你好,我对 Git 很陌生。我正在我的分支上工作,我不小心提交并推送了我修改的文件(但不希望出现在我的 pull 请求中)。例如:我推送了fileA.pyfileB.pyfileC.py。不过,我只希望 pull 请求中包含 fileA.pyfileB.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/

相关文章:

mysql - 如何在 Windows 8 中启动 Ruby on Rails?

git - 将包含所有历史记录的 git 存储库导入现有的 git 存储库

git - 在开始使用 Git 之前,我应该了解什么?

git - 如何将提交移动到另一个分支?

Javascript - 数组在原型(prototype)中未定义?

javascript - Dojo cometD - 配置不起作用

git - IntelliJ 中的局部更改,但针对整个功能分支

svn - 如何将GIT存储库与SVN同步?

version-control - Mercurial子存储库:防止意外的递归提交和推送

git - 如何更改多个提交的作者和提交者姓名/电子邮件?