如何在不进行pull操作的情况下将更改推送到Github

44

我开发了一个项目,该项目之前由其他开发人员开发。我将我的代码发送给先前的开发人员以更改他们的代码,但他们说他们从未使用过git,因此他们添加了更改到项目中,这是实际版本但不在版本控制下。

所以,我已经在github上有提交记录,并且我需要推送这个新版本。

我做了什么:

  1. git init
  2. git remote add origin
  3. git add .
  4. git push origin master

但是存在一个问题:在更新本地存储库之前,我无法推送新的更改。如果我更新我的存储库,它将返回之前开发人员删除的所有文件。

如何在不拉取git数据的情况下推送当前版本?


只要您在本地提交中有这些文件,从远程更新不会导致您丢失它们。 - alex
4个回答

78

你可以进行强制推送。

git push -f origin branch_name
强制推送将会擦除远程代码库分支的所有提交历史,并替换为你的分支。请参考“如何正确地强制 Git 推送?”中关于执行强制推送的答案。如同“Git: How to ignore fast forward and revert origin [branch] to earlier commit?”所提到的,强制推送可能会产生意外后果,请注意检查。
在您的情况下,强制推送将是一个不正确的推送方式,因为您已经在 GitHub 上有了之前的提交,这将擦除以前提交的提交历史记录。因此,为了保留您的提交历史记录,您可以执行以下操作:
从 Git 存储库中删除所有文件,然后在此处添加新文件,再将更新后的文件提交:
git rm -rf .
cp -r path/to/updated/code/* .
git add .

现在执行 git status 命令,可以查看其他开发者修改了哪些文件,执行 git diff 命令可以查看修改的内容。

如果一个文件没有被修改,那么使用 git rmgit add 命令将互相抵消。

其他开发者删除的文件会一直保持删除状态,因为你已经对它们执行了 git rm 命令,但没有执行 git add 命令。

如果确认这些就是需要的更改,就可以通过提交命令进行提交:

git commit -m "Merged new code"

可能会出现的问题:

  1. 仅文件模式已更改(755 <=> 644)-这取决于其他开发人员发送给您的代码。
  2. 使用 git rm -rf . 删除时,您将失去 .gitignore 文件(以及类似的 .gitattributes 和其他文件)。在提交之前,使用 git reset HEAD .gitignore 恢复每个此类文件的 HEAD。
  3. 不同的行尾字符(如果使用不同的开发环境),所以要适当地检查它们。

我是其中一个投反对票的人。我投反对票是因为 OP 有一个现有的版本控制源,需要更新以包括其他人目前未在版本控制中进行的更改。将当前源码不带 VC 创建一个单一提交,并覆盖现有历史记录,是当前无法跟踪编辑的最糟糕的解决方案。有时强制推送是有用或必要的,但这绝不是其中之一。正如我的先前评论所述,处理这种情况的正确方法是创建新的提交,而不是删除旧的提交。 - cjc343
@cjc343,我最初认为OP想要一个新的存储库(对于git init他所做的步骤感到困惑)。谢谢!我现在已经更新了我的答案。 - Anshul Goyal

9
似乎其他人在您的项目中使用裸文件和文件夹,未使用版本控制。我建议您克隆存储库,复制(并替换)克隆内容与新内容,提交并推送这些更改。您当前使用的git init等命令创建了全新的存储库,这不是您想要的。

2
创建一个新的提交,其中包含当前存储库状态和当前源状态之间的差异,似乎是这种情况下最好的解决方案。它非常简单,并且可以正确记录其他人所做的更改,同时保留历史记录。 - cjc343
1
我认为以下链接提供了更好的方法https://dev59.com/5Wkv5IYBdhLWcg3wkBga - Mani

5

场景:

我的情况是,我有一个分支 feature1,我在上面进行了提交并在测试后将其合并到主分支。

但有一天,我犯了一个错误,在没有充分测试 feature1 中的更改的情况下,将代码合并到了主分支。 然后我的队友注意到有一个 bug。但那天没有时间解决它,但是 master 分支需要有可用的代码。

进行 Git 重置

我在本地运行了 git log,复制了我知道的可以工作的提交的 commit id,然后通过 git reset --hard <commit id> 进行了重置。

这样我们就回到了正常工作的提交。但是当我们尝试 git push origin master 这个提交时,git 要求先执行 git pull。但如果我们这样做,我们会再次回到具有 bug 的最新提交。

解决方案 - 强制推送

我们不是简单地使用 git push origin master,而是执行:

git push --force origin <commit id>:master

注意:强制推送 删除所有在强制推送提交之上的提交历史记录 并将该提交带到顶部。请谨慎使用 强制推送

要了解更多有关某些问题的解决方案,请深入研究:

  1. git push --force 和如何应对
  2. 提交 Id 是从哪里来的
  3. 不要混淆合并和变基

提示:提交时,请使用具有意义的消息进行提交,描述您在该提交中所做的内容。它确实有帮助。

Namaste


0
我有一个本地项目,比远程主分支更加推进,但我无法推送它,因为这会导致冲突。
所以我做了以下操作:
1)创建了一个远程分支,我们称之为“last”,它是本地和远程开始不同的最后一个提交。
2)在本地创建了一个提交,然后...
git checkout last
git branch -f main
git push origin main -f

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接