我开发了一个由其他开发人员开发的项目。我将我的代码发送给以前的开发人员以更改他们的代码,但他们说他们从未使用 git,因此他们向项目添加了更改,现在是实际版本,但不受版本控制。
所以,我已经在 github 中提交了,我需要推送这个新版本。
我做了什么:
-
git init
-
git remote add origin
-
git add .
-
git push origin master
但是有一个问题:我无法在更新本地存储库之前推送新更改。如果我更新我的存储库,它将返回以前开发人员删除的所有文件。
如何在不从 git 中提取数据的情况下推送当前版本?
您可以执行强制推送。
git push -f origin branch_name
强制推送将清除远程仓库分支的所有提交历史记录,并将其替换为分支。
在"如何正确强制 Git 推送?强制推送可能会产生意想不到的后果,如"Git:如何忽略快进并将源 [分支] 恢复到较早的提交?"中所述,因此请检查相同的内容。
强制推送将是在您的情况下推送内容的错误方式,因为您已经在 GitHub 上进行了以前的提交,这将删除以前提交的提交历史记录。
因此,要保留提交历史记录,您可以执行以下操作:
从 git 存储库中删除所有文件,然后在此处添加新文件,然后提交更新的文件:
git rm -rf .
cp -r path/to/updated/code/* .
git add .
现在执行git status
将告诉您其他开发人员修改了哪些文件,git diff
将显示有哪些修改。
如果文件保持不变,则git rm
和git add
将抵消彼此的效果。
这些开发人员删除的文件仍然被删除,因为您为他们运行了git rm
但没有git add
。
一旦你确信这些确实是更改,你可以使用
git commit -m "Merged new code"
潜在的陷阱:
- 只有文件模式发生了变化(755 <=> 644( - 取决于其他开发人员发送给您的代码。
- 您将丢失带有
git rm -rf .
的 .gitignore 文件(以及类似的.gitattributes
和其他此类文件(。在提交之前使用git reset HEAD .gitignore
重置每个此类文件的 HEAD。
不同的 - 行终止字符(如果使用不同的开发环境(,因此请适当检查它们。
似乎其他人在版本控制之外处理您的项目,即裸文件和文件夹。
我建议您克隆存储库,复制(并因此用新内容替换(克隆的内容,提交并推送这些更改。
您正在使用的git init
等的当前命令会创建全新的存储库,这不是您想要的。
场景:
就我而言,场景是我有一个分支feature1
,我在其上进行提交,并在测试后将它们合并到 master。
但是有一天,我犯了一个错误,没有对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
警告:强制推送会删除所有高于强制推送提交的提交历史记录,并将此提交置于顶部。谨慎使用强制推送。
要了解有关某些问题的解决方案的更多信息,您可以深入研究:
- git push --force以及如何处理它
- 提交 ID 从何而来
- 不要混淆合并和变基
TIP:在提交时,提交有意义的信息,说明您在该提交中做了什么。它确实有帮助。
纳马斯特🙏