没有什么可比较的。没有什么可比较的,分支是完全不同的提交历史

我在我的机器上安装了一个 CMS 主题。我正在通过 git 跟踪它的更改 并决定在 GitHub 上备份它,这样我就可以分享这些变化。

所提供的主题也可以在 GitHub 上找到 这是一个遥远的上游。现在我可以很容易地看到我的主人之间的变化 使用以下命令,以及远端的上游:

git diff --color master upstream/number

如果我可以在 GitHub 上添加远程上游,我就可以很容易地共享这些更改。 有可能在 GitHub 上建立这种关系吗?

我试过以下方法:

git push -u origin upstreambranch

它在 GitHub 的主控上添加了一个 upstreambranch 比较两个分支都不起作用,我在 GitHub 上得到的结果是: 没什么可比的

有没有其他的方法来比较这些?

283250 次浏览

简短的回答

看起来 GitHub 不允许你比较分支,因为 < strong > < em > 它们不允许 即使他们可能有着相同的历史,但实际上他们有着相同的历史 大部分相同的文件和代码。

这里是一个截图的临时叉我做的回购,在那里我试图 像您描述的那样,将 masterupstreambranch进行比较 信息:

Error message screenshot

上面写着:

没什么可比较的。

masterupstreambranch的提交历史完全不同。

长答案

您可能下载了原始源代码并将其添加到一个全新的 而不是克隆原始的回购,对吗? 这样做将使它成为 你的回购历史将是 完全不同从 原始回购的历史,因为你的新回购将不会有任何相同的 使用相同的 sha ID 进行提交。

可以通过反向记录 master分支和 返回文章页面

# Your first commit, see commit sha
git log --reverse master
commit c548d7b1b16b0350d7fbdb3ff1cfedcb38051397 # <== HERE
Author: Padraic Stack <padraic.stack@nuim.ie>
Date:   Wed Apr 2 15:11:28 2014 +0100


First commit of everything


# First commit sha of the original repo
git log --reverse upstreambranch
commit 105a12817234033c45b4dc7522ff3103f473a862 # <== THERE
Author: Jeremy Boggs <jeremy@clioweb.org>
Date:   Mon Feb 22 16:00:53 2010 +0000


Creates repo directories for the Seasons theme.

解决方案

如果您在原始历史记录的基础上重新提交,那么您应该能够 有几种不同的方法可以重做你的 承诺,包括

git rebase --onto

还有

git cherry-pick

如果有必要,还可以手动重做每次提交。

这看起来像是 github 的不良行为,但是很容易修复。您想要做的是根据现有历史记录中的合理(任何合理)提交来重新定位分支。您所能做的就是获取 github repo,并找出它的历史中哪棵树与您开始使用的那棵最相似。这样开始:

git remote add github u://r/l
git fetch github


myroot=`git rev-list master --max-parents=0`
root_tree=`git rev-parse $myroot^{tree}`


github_base=`git log --pretty=%H\ %T github/master | sed -n "s/$root_tree//p"`

幸运的话,它会在 github 历史记录中找到一个提交,其中包含与开始时一样的树。如果真是这样,

git rebase --onto $github_base $myroot master

你就完了。


如果找不到匹配的树,你就得找到最接近的近似值。这里有一个方法可以粗略估计这些差异:

git log --pretty='echo %H $(git diff-tree -p -b -U0 '$myroot:' %T|wc -l)' github/master \
| sh

它将对 github/master历史记录中每个提交的树和根树之间的行进行最小差异计数。似乎有理由希望有一个不错的小差异,您可以在调用 github_base提交并执行上面的 rebase 之前仔细观察它的实际差异。


如果知道从哪个提交问题开始,可以将分支重置为该提交,然后将它们合并。

我发现所提供的答案没有一个真正对我起作用; 真正对我起作用的是:

git push --set-upstream origin *BRANCHNAME*

在创建了一个新的分支之后,就可以正确地跟踪它了(我有 Git2.7.4)

我不认为我们有同样的情况在这里 ,但仍然 别人可能会觉得有帮助

当类似的错误发生在我身上时,它将是第一次合并和第一次提交。在线知识库里什么都没有。 因此,在 git-hub 上没有可以比较的代码。

我只是删除了空存储库并创建了一个具有相同名称的新存储库。 然后就没有错误了。

我得到了这个错误消息,因为我正在将一个应用程序从 SVN 迁移到 GitHub,在从 SVN 签出的源代码的位置调用 走吧是不够的,但是您需要调用 Git svn 克隆来获得所有的提交历史记录。 这样,GitHub 上的两个源代码将有一个相互的历史,我可以打开拉请求。

我有一个问题,我推到我的远程回购从一个本地回购,不符合历史的远程。我就是这么做的。

我在本地克隆了我的回购协议,所以我知道我正在处理新的回购协议:

git clone Your_REPO_URL_HERE.git

切换到您试图进入遥控器的分支:

git checkout Your_BRANCH_NAME_HERE

添加原件的遥控器:

git remote add upstream Your_REMOTE_REPO_URL_HERE.git

做一个抓取和拉动的动作:

git fetch --all


git pull upstream Your_BRANCH_NAME_HERE

如果存在合并冲突,请使用

git mergetool kdiff3

或者其他你选择的合并工具。

一旦冲突得到解决和保存,提交并推送更改。

现在转到 gitub.com 的原始回购,并尝试创建一个 pull 请求。您应该可以选择创建拉请求,而不会看到“无需比较,分支是完全不同的提交历史” 注意: 您可能需要为您的拉请求选择跨叉比较。

这种情况昨天发生在我身上,因为我下载了原始回购的代码,并试图把它推到我的分叉回购,花了很多时间搜索解决“无法推错误”,并强行推它。

解决方案:

只需删除前一个重新叉回购和克隆从叉回购到新的文件夹。

将新文件夹中的旧文件替换为新文件夹中的旧文件,并将其推到回收文件夹,然后执行新的拉请求。

顶尖人物可能是正确的,你下载,而不是克隆回购在开始。 这里有一个简单的解决方案,不需要太专业。

  • 在新的编辑器窗口中,将回购文件克隆到另一个目录中。
  • 再开一家分店。
  • 然后通过复制粘贴从编辑器窗口复制到新的回购文件中。

通过查看旧的 github 分支,确保所有的编辑都被复制了。

我通过覆盖分支解决了我的问题:

我的情况是: 我想用 version_2覆盖 develop中的任何代码。

  1. 删除冲突分支的本地副本:
git checkout version_2
git branch -D develop
  1. version_2检查一个新的分支,然后强制推入 git:
git checkout -b `develop`
git push origin `develop`

我不需要重新定位,但在我的情况下,我不需要从旧代码中提取代码。

我用这些命令解决我的问题

git checkout [BRANCH]
git branch master [BRANCH] -f
git checkout master
git push origin master -f

来自实验分支

git rebase master
git push -f origin <experiment-branch>

这将创建一个公共提交历史记录,以便能够比较两个分支。

一个更简单的方法,你不能和主人混在一起。

考虑到我有 masterJIRA-1234分行,当我试图合并 JIRA-1234master我得到上述问题,所以请按照下面的步骤:-

  1. JIRA-1234剪下一个分支 JIRA-1234-rebase(它是一个临时分支,可以有任何名称。我认为 JIRA-1234-rebase是有意义的。)

    git checkout JIRA-1234

    git checkout -b JIRA-1234-rebase

  2. 上面的命令将创建一个新的分支 JIRA-1234-rebase并签出它。

  3. 现在我们将重新调整 master的基础。

    git rebase master(在同一个分支 JIRA-1234-rebase中执行)

  4. 您将在 JIRA-1234-rebase上看到一个窗口,显示从第一次提交到最后一次提交的提交历史记录。所以如果我们有98次提交,那么它会将它们一个一个地重新定基,你会看到类似1/98的结果。

  5. 在这里我们只需要选择我们想要的提交,所以如果你想要这个提交,那么不要做任何事情,只是打 Esc然后 :q!和打 ENTER
  6. 在发生冲突的情况下会有一些更改,您需要解决这个冲突,然后通过

    git add <FILE_NAME>.

  7. 现在执行 git rebase continue,它将带您重新基于2/98,同样,您必须通过所有的98提交和解决所有这些问题,记住,我们需要在每个提交中添加文件。

  8. 最后,你现在可以推这些提交,然后提出拉请求

    git pushgit push origin JIRA-1234-rebase

我解决了那个问题。在我的例子中,当我在我选择的一个目录中做了“ git 克隆”,而没有在该存储库中做“ git init”。然后我转移到克隆存储库,其中已经有一个“。Git”(是一个 git 存储库,也就是说不需要“ git init”) ,最后我开始做我的更改或任何东西。

它可能不会解决问题,但是会告诉你如何避免它。

如果没有子模块存在,git 克隆命令应该是一个“ cd”命令。

我有一个类似的情况,我的 师父分支和我试图合并的 开发分支有不同的提交历史。以上的方法对我都不管用。真正的诀窍是:

从大师开始:

git branch new_branch
git checkout new_branch
git merge develop --allow-unrelated-histories

现在在 new _ Branch 中,有所有来自 development 的内容,我可以轻松地将它们合并到 master 中,或者创建一个 pull 请求,因为它们现在共享相同的提交历史。

术语

首先,让我们先说一些术语。

上游 < = 远程 git repo (很可能其主服务器或发布分支正在生产中)

远程[实验 git repo ](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo)也称为“起源”。

Local repo < = 在本地工作站上使用的文件和目录,可能是通过运行 git clone my-forked-repo.git命令获得的

Local index < = 也称为本地 git“ stage”,也就是在将文件推送到远程回购之前进行处理的地方。

Github 工作流流程

接下来,让我们谈谈对上游回购进行更改的过程:

这个过程通常是在一个功能分支上工作,然后推动所述分支,并打开一个拉请求,要么到您的分叉回购的 师父分支,要么到上游的 师父分支

通过运行 git checkout -b FEATURE_BRANCH_NAME创建一个特性分支

添加/删除/修改文件项目文件。

通过运行 git add .添加文件

通过运行 git commit -m'My commit message'将文件提交到索引

通过运行 git push origin FEATURE_BRANCH_NAME来推送已分级的文件

完全不同的提交历史的解决方案

当您创建了一个 git 存储库并更改了 git 历史记录时,可能会出现 Master 和上游分支的提交历史完全不同消息。

例如,如果你分叉一个回购和拉你的分叉回购工作,在本地..。

如果您决定重写整个应用程序,然后决定删除所有现有的文件,包括分叉回购的好主意。Git 目录。您添加新的文件和目录来重新创建应用程序,并重新创建您的。使用 git init命令的 git 目录。

现在,您的应用程序可以很好地处理您的新文件,并且您希望将其合并到上游回购中。但是,当您推送您的更改时,您会收到“ ... ... 完全不同的提交历史... ...”错误消息。

您将看到原来的 git 提交在新的本地目录和远程分支(以及上游)中将有所不同。通过在你的工作目录中运行这个命令: abc0来检查这个。然后运行以下命令: pushd $(mktemp -d); git clone https://github.com/my-forking-username/my-forked-repo.git; git log --reverse master; popd

你必须解决你的本地问题。Git repo 匹配您的远程 my-fork-repo,如果您想推送您的提交并随后执行一个拉请求(希望将您的新更新合并到上游/主分支)。

git clone https://github.com/my-forking-username/my-forked-repo.git
cd my-forked-repo
git checkout -b my-new-files-branch-name
# Delete all files and directories except for the .git directory
git add .
git commit -m'Remove old files'
# Copy your new files to this my-forked-repo directory
git add .
git commit -m'Add new files'
git push origin my-new-files-branch-name

在 GitHub 上创建一个 PR,并请求将 my-new-files-Branch-name 分支合并到 master 中。

注意: “ ... ... 完全不同的提交历史... ...”错误消息也可能出现在非分支回购协议中,原因相同,可以用上述相同的解决方案进行修复。

你可以强制更新你的 master分行如下:

git checkout upstreambranch
git branch master upstreambranch -f
git checkout master
git push origin master -f

对于那些无法合并到 main分支(Github 中新的默认分支)的用户,可以使用以下方法:

git checkout master
git branch main master -f
git checkout main
git push origin main -f

下面的命令将强制两个分支具有相同的历史记录:

git branch [Branch1] [Branch2] -f

我想复制“主”分支的提交历史并覆盖“主”分支的提交历史。
步骤如下:-

  1. Git 收银大师
  2. 基特分公司总经理
  3. Git 收银台主机
  4. 推车

删除主分支:-

A. 本地 :-

  1. Git 收银台主机
  2. Git Branch-D master

B 全球:-

  1. Git 推送源——删除主机

如果问题是“ main 和 master 是完全不同的提交历史”,那么下面的方法可以起作用

git checkout master
git branch main master -f
git checkout main
git push origin main -f
  1. 第一: 从远程回收中提取
  2. 合并或重新定基
  3. 最后: 推到远程回收
  4. 完成

这是100% 的工作在任何情况下:

1)create new folder in your machine
2)clone the remote repository to the new folder
3)delete all files and folders except for the .git folder
4)add your project files that you are working on to this new folder you created
5)open terminal
6)cd new_folder_path (path to the new folder you created)
warning : don't type > git init
7) > git add .
8) > git commit -m "write anything"
9) > git push URL(url of the remote repository)local_branch_name:remote_branch_name

这种情况发生在我身上,因为我从 GH 创建了一个回购,但是之后我还添加了一个 README。在这样做的过程中,我在我的遥控器上创建了一个提交。

然后我在本地创建了一个新的回购协议,做了一些修改并提交。然后我把它推到回收站,试图提出一个拉请求。

但是我的远程的初始提交与本地的提交不同,因此出现了这个错误消息。GitHub 甚至警告你:

在 GitHub.com 上创建一个新的存储库

GitHub Docs

同样,如果你正在创建一个新的回购,GitHub 会悄悄地建议你跳过 正在初始化的回购。而只是 定义的回购。

enter image description here

Tldr 第一次提交必须是相同的,你不能合并2提交没有一个相同的初始提交。

在终端的主分支中,当您正在向 main 提取/合并功能时,我成功地使用了“ git pull source Feature —— allow- 不相關的-history”。 在使用这个命令之前,我得到了关于完全不同的提交历史的相同消息,我认为这是因为我在提交到特性分支之后意外地推到 main。然后我尝试了这里提供的一些解决方案,比如 rebase,它允许我合并我的代码,但是我仍然可以通过 git 进行比较和提取通知,这是一次性修复。我所说的一次性修复是指,当我下次试图将一个特性分支的代码合并到 main 时,我仍然得到了不同的提交历史消息。 另一个来自谷歌搜索的来源提供了——允许不相关的历史修复,它永久地按照我想要的方式工作。分支已经合并,现在我可以不用错误消息进行合并,而且通过 git 可以使用比较和提取通知。 我相信对于那些和我没有相同问题的人来说会有相应的后果,但是我没有丢失任何代码,现在我的回购是干净的。此外,我也是一个业余编码和问题是旧的,所以可能这个命令是不可用的时候问题或我没有正确理解的问题。

在使用 README 文件初始化 GitHub 存储库,然后尝试将现有的本地 git 存储库推送到该存储库时,出现了这个错误。这导致了包含 README 文件的 main分支(默认分支)和包含我的代码的 master分支,它们无法合并。

但是,由于我的 main分支中实际上没有什么重要的东西(如果你需要保留来自两个分支的数据,请查看 PaianuVlad23的答案) ,我设法通过将 Default 分支更改为 master分支来解决这个问题,然后删除 main分支,如下所示:

  1. 在 GitHub 中,单击窗口右上角的用户图标。
  2. 选择“您的存储库”,然后单击您的存储库名称。
  3. 在存储库名称下,选择选项卡“设置”。
  4. 从左边的面板中选择“分支”。
  5. 在标题“ Default”下,将默认分支从要删除的分支(在我的例子中为 main)更改为要保留的分支(在我的例子中为 master)。
  6. 现在,点击回购名称下的“代码”选项卡。
  7. 在包含“代码”等的标签行下,你会看到一个地方写着“2个分支”。点击它。
  8. 找到要删除的分支,然后单击该行右侧的垃圾桶图标。

现在,您的存储库只有一个分支,您希望将本地更改推送到这个分支!就像您在推送到存储库之前没有启动存储库一样,@mfaani 在这个帖子中的回答建议您这样做。