无需拉动即可将更改推送到github

时间:2013-10-10 18:54:32

标签: git github

我有一个愚蠢的情况。我开发了一个由另一个开发人员开发的项目。我已将我的资源发送给之前的开发人员,以便对其来源进行更改。但他们说他们从未使用过git。所以他们已经添加了对项目的更改,现在是实际版本。但它不受版本控制代码的限制。

所以我已经在github上提交了,我需要推出这个新版本。

我做了什么:

  1. git init
  2. git remote add origin
  3. git add。
  4. git push origin master
  5. 但这是一个问题,我当然无法在更新本地回购之前推出新的更改。但是,如果我更新我的仓库,它将返回之前开发人员删除的所有文件。

    我的问题:如何在不从git中提取数据的情况下推送当前版本。

    我知道喜剧情况,但我需要帮助。

    由于

4 个答案:

答案 0 :(得分:28)

你可以强制推动。

git push -f origin branch_name

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

检查强制推送here的答案。强制推送可能会出现意外consequences,因此请检查相同内容。

修改

强制推送将是一种不正确的推送方法,因为你已经在github上提交过了,这将删除之前提交的提交历史记录。

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

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

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"

一旦您确信这些确实是更改,您可以使用

提交
git rm -rf .

潜在的陷阱

  1. 仅文件模式已更改(755< => 644) - 取决于其他开发人员发送给您的代码
  2. 您将使用.gitattributes(以及类似git reset HEAD .gitignore和其他此类文件)丢失.gitignore文件。在提交之前使用{{1}}为每个此类文件重置HEAD。
  3. 不同的行终止字符(如果使用不同的开发环境),请相应地检查它们。

答案 1 :(得分:5)

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

我建议您克隆存储库,使用新内容,提交和推送复制(并因此替换)克隆的内容。你正在尝试git init等创建全新的回购,这不是你想要的。

答案 2 :(得分:0)

场景

在我的情况下,情况是我有一个分支feature1,我在该分支上进行提交,并在测试后将其合并为master。

但是有一天,我犯了一个错误,并且没有对feature1中的更改进行过多测试,因此我将代码合并为master。 然后我的队友注意到有一个错误。但是那天没有时间解决它,但是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 and how to deal with it
  2. Where do Commit Ids Come From
  3. Don't confuse between merge and rebase

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

Namaste?

答案 3 :(得分:-2)

您可以尝试git stash,它会拍摄工作树的快照。然后你可以从github中提取更改。来自man git stash

  

如果要记录工作目录和索引的当前状态,但想要返回干净的工作目录,请使用git stash。该命令将保存您的本地修改并恢复工作目录以匹配HEAD提交。

所以:

git stash
git pull me@github.com/myrepo.git
git stash apply
git commit -a