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

Posted

技术标签:

【中文标题】没有啥可以比较的。没啥可比较的,分支是完全不同的提交历史【英文标题】:There isn't anything to compare. Nothing to compare, branches are entirely different commit histories没有什么可以比较的。没什么可比较的,分支是完全不同的提交历史 【发布时间】:2014-06-14 04:34:00 【问题描述】:

我的机器上安装了 CMS 主题。我正在通过 git 跟踪对它的更改 并决定将其备份到 GitHub 上,以便我可以分享这些更改。

所提供的主题也可以在 GitHub 上找到。在我的机器上我添加了 这是一个远程上游。现在我可以很容易地看到我的主人之间的变化 和远程上游使用以下命令:

git diff --color master upstream/number

如果我可以在 GitHub 上添加远程上游,我可以轻松地分享这些更改。 是否可以在 GitHub 上设置这种关系?

我尝试了以下方法:

git push -u origin upstreambranch

这会将upstreambranch 添加到 GitHub 上的主服务器。然而试图 比较两个分支都不起作用,我在 GitHub 上得到的结果是:“那里 没什么好比较的”

有其他方法可以比较这些吗?

【问题讨论】:

不清楚您要做什么。你已经将你的 repo 推送到了 GitHub 上?是公开的吗?如果它是公开的,其他人已经可以访问代码,他们可以克隆或分叉上传的 repo。 “git push -u origin upstreambranch...向 GitHub 上的主节点添加一个上游分支”。您不会将分支添加到“GitHub 上的主人”。请澄清你的意思。 “但是尝试比较两个分支不起作用,我在 GitHub 上得到的结果是:'没有任何东西可以比较'”。请说明您在 GitHub 上比较分支的操作​​,如果可能,请附上屏幕截图。 我正在使用一个名为 Omeka 的 cms 和一个名为 Seasons 的特定主题。我修改了这个主题并将其上传到这里:github.com/padraic7a/seasons 我想要一种视觉方式(差异)来向人们展示它与“原始”的不同之处。我试图通过下载然后推送到 github 这个版本来做到这一点:github.com/padraic7a/seasons/tree/upstreambranch 在上面的帖子中,我解释了我是如何做到的,但它没有用。这更有意义吗? 谢谢,这开始变得更有意义了。你指的是this the upstream repo吗?当你说你下载了源代码时,你是从 GitHub 还是从其他地方下载的,比如this site。如果您从 GitHub 以外的任何地方下载它,那么实际上从 GitHub 做一个 fork 会更适合您尝试做的事情,除非这是您为特定客户端所做的定制,而这并不意味着公开分享? 我知道你的直接问题是什么,但从更大的角度来看,你可能想重新考虑你是如何做每件事的,正如我在之前的评论中已经提到的那样......但是这取决于你最终想要做什么。为您当前的问题写一个答案... 【参考方案1】:

简短的回答

看起来 GitHub 不会让你比较分支,因为 他们不会 实际上完全共享任何相同的历史,即使他们可能共享 很多相同的文件和代码。

这是我对你的 repo 制作的临时分叉的屏幕截图,我试图在其中 如您所述,将masterupstreambranch 进行比较。注意错误 留言:

上面写着:

没有什么可比较的。

masterupstreambranch 是完全不同的提交历史。

长答案

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

您可以通过对 master 分支和 upstreambranch:

# 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 上得到的结果是:“没有什么可比较的” @Jack 您的欢迎。是的,您确实提到了这一点,但是您忽略了错误消息的其余部分,即“主服务器和上游 是完全不同的历史记录。”这是问题的关键. @Jack 你知道现在比较分支需要做什么吗?如果您在原始历史记录之上重做所有提交,则可以比较分支。有几种不同的方式可以重做提交,包括 git rebase --ontogit cherry-pick git rebase -i origin/master 这对我有用。这样做之后,我能够比较两个分支 @sujay 这是对的。之后我可以比较【参考方案2】:

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

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 之前观察它的实际差异。


【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我发现所提供的答案都不适合我;实际上对我有用的是:

git push --set-upstream origin *BRANCHNAME*

创建新分支后,它会被正确跟踪。 (我有 Git 2.7.4)

【讨论】:

【参考方案5】:

我认为我们这里没有相同的案例,但仍然其他人可能会觉得它有帮助

当我发生类似错误时,它将是第一次合并和第一次提交。在线存储库中没有任何内容。 因此,在 git-hub 上没有代码可以比较。

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

【讨论】:

【参考方案6】:

我收到此错误消息,因为我正在将应用程序从 SVN 迁移到 GitHub,并且在从 SVN 签出的源代码位置调用 git init 是不够的,但您需要调用 git svn clone 以获得所有的提交历史。 这样 GitHub 上的两个源代码就会有相互的历史,我就可以打开拉取请求。

【讨论】:

【参考方案7】:

我遇到了一个问题,我从与远程历史记录不匹配的本地存储库推送到远程存储库。这对我有用。

我在本地克隆了我的 repo,所以我知道我正在使用 repo 的新副本:

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 和 git pull:

git fetch --all

git pull upstream Your_BRANCH_NAME_HERE

如果您有合并冲突,请使用

解决它们
git mergetool kdiff3 

或您选择的其他合并工具。

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

现在转到原始版本的 gitub.com 存储库并尝试创建拉取请求。您应该可以选择创建拉取请求,而不是看到“没什么可比较的,分支是完全不同的提交历史” 注意:您可能需要为拉取请求选择跨叉比较。

【讨论】:

【参考方案8】:

这件事昨天发生在我身上,因为我从原始仓库下载了代码并尝试将其推送到我的分叉仓库中,花了很多时间寻找解决“无法推送错误”并强行推送它。

解决方案:

只需通过删除以前的 repo 来重新创建 repo,然后将 repo 从分叉的 repo 克隆到新文件夹。

用新文件夹中的旧文件替换文件并将其推送到 repo 并执行新的拉取请求。

【讨论】:

【参考方案9】:

***人物可能是正确的,您下载而不是在开始时克隆 repo。 这是一个简单的解决方案,无需过多技术。

在新的编辑器窗口中,将您的存储库克隆到另一个目录中。 新建一个分支。 然后通过复制粘贴从您编辑的编辑器窗口复制到您的新存储库中。

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

【讨论】:

【参考方案10】:

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

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

    删除冲突分支的本地副本:
git checkout version_2
git branch -D develop
    version_2 签出一个新分支并强制推送到 git:
git checkout -b `develop`
git push origin `develop`

我不需要变基。但就我而言,我不需要从旧代码中获取代码。

【讨论】:

【参考方案11】:

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

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

【讨论】:

这将使 [BRANCH] 的更改在 master 中可用,您将无法创建拉取请求 @Susie 力的缩写! 对于默认的新“主”分支,您可以这样做:git checkout master git branch main master -f git checkout main git push origin main -f 我已经提出了你建议的解决方案,现在我的旧分支已经消失了,我无法处理任何过去的提交。谢谢! @kunal 我听从了你的建议,但我可能翻转了分支,所以我最终错过了所有的工作。我怎样才能恢复这个?我有一个使用 master 作为分支的本地项目,当我在 github 中创建 repo 时,我尝试将 main 合并到 master 中,但我得到的错误在历史中解释是完全不同的。我听从了你的回答,但最终把 main 放在了我所有工作的地方【参考方案12】:

来自实验分支

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

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

【讨论】:

【参考方案13】:

一个更简单的方法,你不能和主人打成一片。

考虑我有masterJIRA-1234 分支,当我尝试将JIRA-1234 合并到master 时,我遇到了上述问题,所以请按照以下步骤操作:-

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

    git checkout JIRA-1234

    git checkout -b JIRA-1234-rebase

    上面的命令将创建一个新的分支JIRA-1234-rebase 并检查它。

    现在我们将重新设置我们的master

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

    您将看到一个窗口,显示从JIRA-1234-rebase 上的第一次提交到最后一次提交的提交历史记录。因此,如果我们有 98 次提交,那么它将 1 比 1 变基,您将看到类似 1/98 的内容。

    在这里,我们只需要选择我们想要的提交,所以如果你想要这个提交,那么不要做任何事情,只需点击Esc 然后点击:q! 和点击ENTER

    如果发生冲突,会有一些变化,你需要解决这个冲突,然后添加文件

    git add &lt;FILE_NAME&gt;.

    现在执行git rebase continue,它将带您重新设置 2/98,同样您必须检查所有 98 次提交并解决所有问题,并记住我们需要在每次提交中添加文件。

    最后,您现在可以推送这些提交,然后通过

    提出 Pull Request

    git pushgit push origin JIRA-1234-rebase

【讨论】:

【参考方案14】:

我解决了这个问题。在我的情况下,当我在我选择的一个目录中执行“git clone”时,没有在该存储库中执行“git init”。然后我进入克隆的存储库,那里已经有一个“.git”(是一个 git 存储库,即不需要“git init”),最后我开始做我的更改或任何事情。

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

如果不存在子模块,命令 git clone 应该是一个“cd”命令。

【讨论】:

你的答案不清楚,我担心它没有回答这个问题。我认为预期的答案是推动上游分支中的更改以便能够比较它们。【参考方案15】:

我有类似的情况,我的 ma​​ster 分支和我尝试合并的 develop 分支有不同的提交历史。以上解决方案都不适合我。诀窍是:

从主人开始:

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

现在在 new_branch 中,有来自 develop 的所有东西,我可以轻松地合并到 master 中,或者创建一个 pull request,因为它们现在共享相同的提交历史记录。

【讨论】:

简洁实用。谢谢。 前两个命令可以直接折叠成git checkout -b new_branch。这会在 master 分支上创建 new_branch 并切换到它。 这对我不起作用,但感谢您帮助他人。我会继续环顾四周 这救了我的培根。谢谢。【参考方案16】:

术语

首先,让我们了解一些术语...

上游

forked-repo https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) 也称为“origin”。

本地存储库 git clone my-forked-repo.git 命令获得这些文件和目录

本地索引

Github 工作流程

接下来,让我们谈谈获取上游 repo 更改的过程:

该过程通常是在功能分支上工作,然后推送该分支,并打开一个拉取请求,或者到你的分叉仓库的 ma​​ster 分支或上游的 ma​​ster强>分支

通过运行git checkout -b FEATURE_BRANCH_NAME创建功能分支

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

运行git add .添加文件

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

通过运行 git push origin FEATURE_BRANCH_NAME 推送您的暂存文件

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

ma​​ster 和 upstreambranch 是完全不同的提交历史消息可能会在您派生一个 git 存储库并更改您的 git 历史时出现。

例如,如果你 fork 一个 repo 并拉取你的 fork repo 以在本地处理它......

如果你决定重写整个应用程序,然后决定删除所有现有文件是个好主意,包括 forked-repo 的 .git 目录。您添加新文件和目录以重新创建您的应用程序,并使用 git init 命令重新创建您的 .git 目录。

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

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

如果您想推送您的提交并随后执行拉取请求(希望将您的新更新合并到上游/主分支),您必须修复您的本地 .git 存储库以匹配您的远程 my-forked-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-forked-repo 中的 my-new-files-branch-name 分支合并到 master。

注意:“...完全不同的提交历史...”错误消息也可能出于相同的原因出现在非分叉存储库中,并且可以使用上述相同的解决方案进行修复。

【讨论】:

【参考方案17】:

您可以按如下方式强制更新您的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 

【讨论】:

逐行细分对初学者很有用。其中一些命令具有潜在危险。 我不是一个超级酷的 git 人,解释会帮助@blue 工作就像一个魅力。谢谢。 @TaslimOseni 很高兴为您提供帮助【参考方案18】:

我想复制“master”分支的提交历史并覆盖“main”分支的提交历史。 步骤是:-

    git checkout master git branch main master -f git checkout main git 推送

删除主分支:-

一个。本地:-

    git checkout main git 分支 -d master

b.全球范围内:-

    git push origin --delete master

投赞成票!

【讨论】:

【参考方案19】:

如果问题是“main 和 master 是完全不同的提交历史。”,以下将起作用

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

【讨论】:

对我也有效!!!谢谢 正是我需要的谢谢【参考方案20】:
    首先:从远程仓库拉取 合并或变基 最后:推送到远程仓库 完成

【讨论】:

【参考方案21】:

这在任何情况下都 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

【讨论】:

不幸的是,这似乎没有回答这个问题。您可以尝试多解释一下您的流程要完成的工作。 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。【参考方案22】:

这发生在我身上,因为我从 GH 创建了一个 repo,但后来我还添加了一个 README。为此,我在遥控器上创建了一个提交。

然后我去本地创建了一个新的仓库,进行了一些更改并提交。然后我把它推到?repo 并尝试发出一个Pull Request。

但我的遥控器的初始提交与我本地的提交不同,因此出现此错误消息。 GitHub 本身甚至会警告您不要这样做:

在 GitHub.com 上创建一个新存储库。 为避免错误,请勿使用 README、许可证或 gitignore 文件初始化新存储库。您可以在项目被推送到 GitHub 后添加这些文件。

GitHub Docs

tldr 第一个提交必须相同,您不能合并没有相同初始提交的 2 个提交。

【讨论】:

以上是关于没有啥可以比较的。没啥可比较的,分支是完全不同的提交历史的主要内容,如果未能解决你的问题,请参考以下文章

使用Git的时候我们比较本地分支版本和远程版本的不同之处?使用啥指令?

TestNG [错误] 未找到测试套件。没啥可跑的

redis都有哪些数据类型?分别在哪些场景下使用比较合适?

Firebase 身份验证 Twitter API 登录“这里没啥可看的”

QML StackView 没有啥可推送的

SQL 查询优化——真的没有啥可改进的了吗?