没有什么可比的.无可比拟,分支是完全不同的提交历史

Jac*_*ack 33 git github git-diff

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

提供的主题也可以在GitHub上找到.在我的机器上,我将其添加为远程上游.现在,我可以使用以下命令轻松查看主服务器和远程上游之间的更改:

git diff --color master upstream/number
Run Code Online (Sandbox Code Playgroud)

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

我尝试过以下方法:

git push -u origin upstreambranch
Run Code Online (Sandbox Code Playgroud)

upstreambranch在GitHub上添加了一个主人.然而,尝试比较两个分支不起作用,我在GitHub上得到的结果是:"没有什么可比较的"

有比较这些的替代方法吗?

小智 42

简答

看起来GitHub不会让你比较分支,因为它们实际上根本不共享任何相同的历史记录,即使它们可能共享大部分相同的文件和代码.

这是我的repo制作的临时分支的截图,我试图masterupstreambranch你进行比较,就像你描述的那样.请注意错误消息:

错误消息截图

它说:

没有什么可比的.

master并且upstreambranch是完全不同的提交历史.

答案很长

你可能已经下载了原始资源并将其添加到一个全新的仓库而不是克隆原始仓库,对吗?这样做会使你的repo 的历史与原始repo的历史完全不同,因为你的新repo将不会有任何相同的sha具有相同的sha.

您可以通过执行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.
Run Code Online (Sandbox Code Playgroud)

解决方案

如果您在原始历史记录之上重做提交,那么您应该能够比较分支.您可以通过几种不同的方式重做提交,包括

git rebase --onto
Run Code Online (Sandbox Code Playgroud)

git cherry-pick
Run Code Online (Sandbox Code Playgroud)

如果必须,您还可以手动重做每个提交.

  • @Jack您的欢迎.是的,你确实提到了这一点,但是你遗漏了错误信息的其余部分,即"主人和上游***是完全不同的历史.***"这是问题的关键. (10认同)
  • git rebase -i origin/master这对我有用.在这之后我能够比较两个分支 (6认同)

Kun*_*agi 40

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

git checkout [BRANCH]   
git branch master [BRANCH] -f   
git checkout master   
git push origin master -f
Run Code Online (Sandbox Code Playgroud)

  • 对于默认的新“主”分支,您可以这样做:`git checkout master gitbranch main master -f git checkout main git push origin main -f ` (11认同)
  • 这将使 [BRANCH] 的更改在 master 中可用,并且您将无法创建拉取请求 (7认同)
  • @HenriqueBruno 你救了我的命,伙计。 (3认同)

Pai*_*d23 35

我遇到了类似的情况,我的master分支和我试图合并的develop分支有不同的提交历史。以上解决方案都不适合我。诀窍是什么:

从大师开始:

git branch new_branch
git checkout new_branch
git merge develop --allow-unrelated-histories
Run Code Online (Sandbox Code Playgroud)

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

  • 简洁且实用。谢谢。 (4认同)
  • 这应该是得票最高的答案 (3认同)
  • 前 2 个命令可以折叠到“git checkout -b new_branch”中。这将在“master”分支上创建“new_branch”并切换到其中。 (3认同)

blu*_*are 22

您可以master按如下方式强制更新您的分支:

git checkout upstreambranch  
git branch master upstreambranch -f    
git checkout master  
git push origin master -f
Run Code Online (Sandbox Code Playgroud)

对于那些有问题合并到main分支的人(这是 Github 中新的默认分支),您可以使用以下内容:

git checkout master  
git branch main master -f    
git checkout main  
git push origin main -f
Run Code Online (Sandbox Code Playgroud)

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

git branch [Branch1] [Branch2] -f 
Run Code Online (Sandbox Code Playgroud)

  • 逐行细分对于初学者来说很有用。其中一些命令具有潜在危险。 (4认同)
  • 我编辑了我的答案 (3认同)

Cli*_*ton 17

来自实验分支

git rebase master
git push -f origin <experiment-branch>
Run Code Online (Sandbox Code Playgroud)

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


小智 16

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

git checkout master   
git branch main master -f    
git checkout main  
git push origin main -f 
Run Code Online (Sandbox Code Playgroud)

  • 这只是删除了我在主分支中的文件并将所有内容从主分支推送到主分支,教训是进行备份。 (11认同)
  • !!是的,非常感谢。无论谁使用此功能,请不要忘记备份您的更改,否则您会错过它们!!!! (5认同)
  • 如果您能为它添加一些解释,那就太好了,休息一下,这就像魅力一样。谢谢 (3认同)
  • 这修复了我的问题,我不知道发生了什么,但我无法在 github 上提出拉取请求。直到这段代码。 (2认同)

oli*_*son 10

如果您 2023 年在这里,请执行此操作

 git checkout [BRANCH]   
 git branch main [BRANCH] -f   
 git checkout main
 git push origin main -f
Run Code Online (Sandbox Code Playgroud)


jth*_*ill 6

这看起来像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"`
Run Code Online (Sandbox Code Playgroud)

运气好的话,会在github历史中找到一个具有你开始的确切树的提交.假设它,

git rebase --onto $github_base $myroot master 
Run Code Online (Sandbox Code Playgroud)

你完成了


如果找不到匹配的树,则可以找到最接近的近似值.这是一种粗略估计差异的方法:

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

这将计算github/master历史记录中每个提交的树与根树之间的最小化差异中的行.希望得到一个很小的差异似乎是合理的,你可以在调用github_base提交和执行上面的rebase 之前先注意它上面的实际差异.



l3x*_*l3x 6

术语

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

上游<= 远程 git 存储库(可能其主分支或发布分支正在生产中)

forked-repo <= 远程 [实验性 git 存储库] ( https://docs.github.com/en/github/getting-started-with-github/fork-a-repo ) 也称为“origin”。

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

本地索引<= 也称为本地 git“阶段”,即在将文件推送到远程存储库之前将其暂存的位置。

Github工作流程

接下来,我们来谈谈将更改获取到上游存储库的过程:

该过程通常是在功能分支上工作,然后推送该分支,并打开拉取请求,无论是到您的分叉存储库的分支还是到上游的分支

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

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

通过运行添加文件git add .

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

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

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

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

例如,如果您分叉一个存储库并将分叉的存储库拉到本地进行处理......

如果您决定重写整个应用程序,然后决定删除所有现有文件(包括 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
Run Code Online (Sandbox Code Playgroud)

在 GitHub 上创建 PR 并请求将 my-forked-repo 中的 my-new-files-branch-name 分支合并到 master 中。

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


Kar*_*ård 5

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

但由于我的分支中实际上没有任何重要的内容main(如果您需要保留两个分支的数据,请查看 PaianuVlad23 的答案),我设法通过将默认分支更改为该master分支来解决问题,然后删除main分支,如下所示:

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

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