【问题标题】:Get the difference between two branches in Git获取 Git 中两个分支的区别
【发布时间】:2013-05-21 17:14:36
【问题描述】:

我做了以下事情(我将其与现实进行了比较):

  • 创建了一个分支Branch1,切换到它
  • 添加文件 File1 并修改现有文件 File2 并提交此文件
  • 发现我不需要 File1,将其删除并提交

所以,原始分支Branch1的实际区别只是File2的修改而已。

我想得到分支之间的实际差异并放入 Branch2。一般来说,我想摆脱不必要的添加/删除File1的历史。

【问题讨论】:

标签: git


【解决方案1】:

假设您从分支 master 开始。然后你可以这样做:

git diff master Branch1 > ../patchfile
git checkout Branch2    
git apply ../patchfile

或者,如果您的目标是重写历史记录,那么您可以使用 interactive rebase 来压缩提交。

【讨论】:

  • 我不认为“交互式rebase”可以解决他的问题。使用 rebase,您可以选择您想要的提交,但在他的情况下,他有 2 个提交,但这 2 个都不是他想要的。
  • @sevenever 如果在交互式 rebase 中,他将两个提交挤压在一起,则 File1 的添加和删除将消失,只有 File2 的修改b> 将保留。这将实现他想要的。
【解决方案2】:

这是一个简单的 git diff

git diff --name-only SHA1 SHA2

其中 SHA1/2 是每个分支顶部的 2 个提交的哈希值。

或者你可以这样做

git diff --name-only develop...

将您的分支与develop 分支进行比较

【讨论】:

  • 这只会给我更改文件的名称(这很好)。但是,我需要的不仅仅是名称来创建 Branch2
  • 我认为更正确的解决方案是“git diff SHA1 SHA2 >some.patch”,然后在新分支上“patch -p1
  • 这正是我想要的!允许我将所有更改恢复为基础分支上的本地更改,这样我就可以在我的 IDE 中一次看到它们,而不是每次提交时都丢失更改。谢谢!
【解决方案3】:

我会在 HEAD~2 上做一个交互式 rebase 并将最后两个提交压缩在一起。假设您想保持 Branch1 中的历史记录并在 Branch2 中简化它,请执行以下操作(当前分支 Branch1):

git checkout -b Branch2
git rebase -i 'HEAD~2'

会打开一个编辑器,显示类似

pick 1b58da0 Added File1, changed File2
pick d3f4f51 Delete File1

以及许多解释性的 cmets 变基是如何工作的。将最后一次提交更改为 squash 并关闭编辑器。

pick 1b58da0 Added File1, changed File2
squash d3f4f51 Delete File1

将打开一个新编辑器,您可以在其中指定新的提交消息。它现在可能只是阅读

更改文件2

关闭它,你就完成了,两个提交在Branch2 上被压缩在一起,Branch1 保留你的原始历史记录。请注意,如果您不需要保留原始历史记录,您可以跳过签出Branch2 并直接在Branch1 上工作。仅当您尚未在 Branch1 上发布最后两次提交时才这样做。

【讨论】:

    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多