【问题标题】:Can't add new file to remote repo, says I need to pull but already did无法将新文件添加到远程仓库,说我需要拉但已经拉
【发布时间】:2020-11-22 23:21:45
【问题描述】:

对于我是唯一一个创建代码的个人项目,我有时会在两个不同的 IDE 之间切换。因此,源代码本地存储在两个不同的地方。我想对 Bitbucket 上的代码进行历史记录/备份。 Git 能解决这个问题吗?

我在目录source_code 中有foo.cpp。我不想将远程仓库中的所有内容复制到source_code。添加并提交foo.cpp 后,我尝试运行git push origin master 并给出错误

 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://bitbucket.org/...'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

就像它建议我做 git pull origin master 但它出错了

error: Pulling is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

在这种情况下,未合并到底意味着什么?我怎样才能具体找到问题所在的文件?我猜问题是我有同名的文件,但我只想从目录中跟踪一个特定的文件。如此简单的任务,我希望很容易。

当我做git status 时,它给了

You are currently rebasing branch 'master' on '930b2f7'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
        both added:      foo2.cpp

Bitbucket 的 foo2.cpp 版本是正确的,所以我删除了本地版本。然后我运行了 $ git restore --staged foo2.cpp,它起作用了。现在git pull origin master 工作。但是还是推不开。

 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://bitbucket.org/...'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

同样,我要做的只是将文件添加到远程仓库的主分支。 (此外,“远程仓库”是否是指代托管服务(如 Bitbucket)上的特定项目的正确术语?)

它还说(master|REBASE 2/3),我不知道它是什么意思。

【问题讨论】:

  • 如果您仍在进行 rebase 操作,请运行 git rebase --continue 以恢复 rebase。
  • 另外,darn 确保您没有重新调整以前从 master 推送的提交。
  • 你是什么意思你是“在两个IDE之间切换”本地存储在两个不同的地方?这是否意味着您在本地有两个 repo 副本,每个 IDE 一个?
  • 问:“说我需要拉,但已经这样做了……” 答:这正是它的意思:你的遥控器与你的本地仓库没有正确同步:( LightCC 给出了一个很好的回复。如果您觉得有用,请务必“点赞”和“接受”。更重要的是:请务必阅读。请相应地调整您的git workflow。如果您有其他问题,请回复。
  • @LightCC 我的意思是我对大部分代码使用重量级 IDE,但有时更喜欢 Notepad++ 用于小型驱动程序/实验。 Notepad++ 创建的文件与 IDE 创建的文件位于不同的目录中。

标签: git bitbucket git-push git-pull


【解决方案1】:

Git 很好。

Git 非常努力地确保基线和基线历史的完整性。

你刚刚有一个Series of Unfortunate Events,很抱歉:(

您还提出了几个很好的问题:

  • Q1:使用 IDE 开发是正常的。我使用 Netbeans。大多数人是否在此位置设置 git,即他们是否进入项目目录并运行 git init...?

    简短回答:您通常会让 IDE 为您创建本地存储库

  • Q2:在不确定每个命令的作用的情况下,在重要文件上使用 Git 太危险了。如何安全地学习它?

    简短回答:尝试一些“hello world”项目和一个好的 Git 教程;您可以随时为您的项目制作备份副本。

建议:

  1. 在您的 IDE 中使用 Git:

    • 请务必使用您的 IDE(例如 Netbeans)。我碰巧主要在 Java 上使用 Eclipse,在 Windows 上使用 MSVS。
    • 我会在 IDE 中创建您的项目并初始化 Git。
    • 假设您使用的是 Windows,我还将下载并安装以下其中一个/两个:
    • 您会发现,您可以将这些 Git 客户端中的 ANYANY 组合的方式用于您的工作。
  2. Git 完全不知道您使用的客户端。

    一旦您开始了一个项目并下载了一个或两个“其他”Git 客户端,请浏览到您的项目目录并让自己满意,他们都“看到相同的东西”。

  3. 熟悉一些基本的 Git 工作流程

    • 创建项目后,请找到一个好的教程并开始使用 Git 功能。在本地,和/或使用 Github 或 BitBucket。

    • 签入、签出、推送、拉取、“reset --hard”、创建分支、合并分支等。

    • 每一步...“cd”到项目的物理目录...并制作辅助副本。一旦你获得信心,你会发现这个“额外的备份”是不必要的。在那之前,它可以成为救生员:)

    • 永远记住,在任何时候,无论出于何种原因,只要你有隐藏的“.git”子目录,你就可以随时恢复你的最新提交:

      git reset --hard

'希望对您有所帮助...

【讨论】:

  • 您的意思是使用内置于 IDE 中的 Git 功能并在相同文件上使用 Git 客户端是很常见的?我理解正确吗?
  • 是的 - 这正是我要说的。在实践中,这意味着 a) 您可以使用 IDE 的内置工具(从而节省一些击键,并遵守 IDE 鼓励的任何约定),但是 b) 您始终可以根据需要使用其他 Git 客户端 :) 我是还建议您可以并且应该通过一些教程并做一些“实验”以更好地熟悉 Git 的工作原理......以免您遇到另一个“一系列不幸事件”;)
  • 如果我有一个 git 正在跟踪的文件夹(例如运行 git init),将其拖放到另一个位置是否安全?或者这会破坏 git?
  • git repo 所需的一切(EVERYTHING)都包含在隐藏文件夹“.git”中。所以是的,您可以安全地拖放您的目录(例如“MyProject”)......只要您ALSO确保包含“.git”子目录。
【解决方案2】:

本地和远程存储库必须具有相同的文件才能提交

您的第一个问题的答案是,是的,Git 可以处理多个本地存储库 - 但您似乎没有按照设计使用 Git 的方式使用 Git - 因此很难帮助您解决此问题,或者至少如果你想用 Git 来改变你的工作流程会更好。

让我解释一下:

我在 source_code 目录中有 foo.cpp。我不想将远程仓库中的所有内容都复制到 source_code 中。

我假设“远程仓库”是指远程服务器上的仓库 - 即 Bitbucket。在 Git 中,没有一个远程仓库的本地副本,对于给定的提交,它的文件更少。当你克隆一个 Git 存储库时,你会得到所有的文件。实际上,通常情况下,所有文件都包含所有提交/历史记录。这实际上是 Git 的重点 - 对所有文件进行版本控制,因此您可以从任何 PC 上的任何提交重新创建所有文件的精确副本。

如果你只想更新仓库中的foo.cpp,只需更改foo.cpp,将其添加到索引中,然后将其推送回远程。新提交仍将包含所有其他文件,只是在新提交中更改了 foo.cpp



如何摆脱现状?

您可以通过硬重置到本地存储库中的最新提交来退出 rebase/merge。这将重置事情以重新开始。但我不认为你能够按照自己的意愿工作并且仍然保持同步。

当您获取并尝试变基、快进或合并时,如果您删除文件,Git 会感到困惑,因为您不希望它们在本地仓库中,但它们存在于远程仓库中 - 因此您遇到的错误得到



多个本地仓库?

我不确定您为什么要为不同的 IDE 提供不同的本地存储库,但如果确实需要,您可以这样做。只需将 repo 两次克隆到不同的目录中。

只要意识到,每当您从一个本地人推送到远程时,它看起来就像另一个用户从另一个仓库推送到远程一样。您需要在其他本地存储库中获取这些更改并快进/合并(git pull 是git fetchgit merge 的组合)以合并它们。如果您独立更新两个本地存储库,如果它们编辑相同的文件,您最终会遇到合并冲突。但是,如果您总是通过从一个上推,然后在处理另一个之前拉下的方式在 repos 之间“交接”,那么这种情况永远不会发生。



考虑只使用一个本地仓库(或多个远程仓库)

但是,我会质疑为什么您会在本地需要两个单独的存储库,用于“不同的 IDE”。我真的会检查您以这种方式进行设置的原因 - 可能会有更好的工作流程。

您应该能够使用包含任一 IDE 所需的所有文件的单个本地存储库。如果您确实需要不同的文件并且需要单独管理它们,请考虑为它们制作完全独立的存储库。有多种技术可用于在两个 repo 之间共享公用文件,例如将第三个 repo 的子模块作为具有公用文件的库。

我们需要更多关于在同一个 repo 中使用两个独立 IDE 的目的的详细信息,以回答如何使用 Git 实现这一目标的最佳实践。例如,一种设置用于开发,另一种用于发布? (那将是一个很好的独立 StackOverflow 问题......)

【讨论】:

  • there is no such thing as having a local copy of a remote repo that has fewer files for a given commit 可以在两个目录之间拆分本地 repo,以便它们的组合文件将包含给定提交中的所有文件?
  • 我的意思是我知道我可以通过进入 Bitbucket 的 Web 界面并在那里添加 foo.cpp 来“手动”解决这个问题。
  • 不,这不是 git 的目的。您所描述的是两个不同的存储库。如果文件相同,您可以在本地共享文件,或者正式地您可以为共享的内容创建一个单独的存储库,并将其作为两个存储库中的每个存储库中的子模块。或者你可以在不同的分支中使用不同的文件来破解它。当它们只是原型/实验时,这可能会更好......(即,如果它们是临时案例,请使用分支,如果是永久的,请使用另一个 repo)。
猜你喜欢
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2020-09-28
  • 2011-08-26
  • 2014-09-27
  • 2014-03-29
相关资源
最近更新 更多