37

我开发了一个由其他开发人员开发的项目。我将我的代码发送给以前的开发人员以更改他们的代码,但他们说他们从未使用过 git,所以他们对项目添加了更改,现在它是实际版本,但不受版本控制。

所以,我已经在 github 中有提交,我需要推送这个新版本。

我做了什么:

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

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

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

4

3 回答 3

64

您可以进行强制推送。

git push -f origin branch_name

强制推送将清除远程存储库分支的所有提交历史记录,并将其替换到您的分支。

在“如何正确强制 Git 推送? ”中查看强制推送的答案。如“ Git: How to ignore fast forward and revert origin [branch] to early commit? ”中所述,强制推送可能会产生意想不到的后果,因此请检查是否相同。

在您的情况下,强制推送将是一种不正确的推送方式,因为您已经在 GitHub 上进行了先前的提交,这将删除先前提交的提交历史记录。

因此,为了保留您的提交历史记录,您可以执行以下操作:

从 git 存储库中删除所有文件,然后在此处添加新文件,然后提交更新的文件:

git rm -rf .
cp -r path/to/updated/code/* .
git add .

执行 a git statusnow 将告诉您其他开发人员修改了哪些文件, agit diff将显示那里有哪些修改。

如果一个文件一直保持不变,那么git rmgit add会相互抵消。

那些开发人员删除的文件仍然被删除,因为您git rm为他们运行了但没有git add

一旦您对这些确实是更改感到满意,您可以使用

git commit -m "Merged new code"

潜在的陷阱:

  1. 只有文件模式发生了变化(755 <=> 644) - 取决于其他开发人员发送给您的代码。
  2. 您将丢失您的 .gitignore 文件git rm -rf .(以及类似的.gitattributes文件和其他此类文件)。git reset HEAD .gitignore在提交之前为每个此类文件重置 HEAD 。
  3. 不同的行终止字符(以防使用不同的开发环境),因此请适当检查它们。
于 2013-10-10T19:12:56.687 回答
7

似乎其他人在版本控制之外在您的项目上工作,即在裸文件和文件夹上工作。

我建议您克隆存储库,用新内容复制(并因此替换)克隆的内容,提交并推送这些更改。

您正在使用的 etc 的当前命令git init会创建全新的存储库,这不是您想要的。

于 2013-10-10T19:00:12.190 回答
3

场景

就我而言,情况是我有一个feature1提交提交的分支,并在测试后将它们合并到主控。

但是有一天,我犯了一个错误,没有feature1对 . 然后我的队友注意到有一个错误。但是那天没有时间解决它,但是master分支需要有工作代码。

进行 Git 重置

git log在本地做了一个,复制了commit id我知道工作正常的提交。然后进行了重置git reset --hard <commit id>

这样我们就回到了正在工作的提交。但是当我们尝试git push origin master这个提交时,git说先做git pull一个。但是如果我们这样做了,那么我们将再次转到有错误的最新提交

解决方案 - 强制推送

而不是简单地git push origin master,我们做了

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

注意:强制推送会删除所有在强制推送提交之上的提交历史,并将此提交置于顶部。谨慎使用强制推送。

要了解有关您可能会深入研究的某些问题的解决方案的更多信息:

  1. git push --force 以及如何处理它
  2. 提交 ID 来自哪里
  3. 不要混淆合并和变基

提示:在提交时,提交有意义的信息,说明您在该提交中所做的事情。它确实有帮助。

合十礼

于 2020-06-23T15:01:14.493 回答