在 CLI + vanilla git 中复制 IntelliJ 合并提交详细信息功能

2024-01-13

IntelliJ 具有非常方便的 Git 日志功能,用于检查合并提交详细信息(请参见下面的屏幕截图 +https://www.jetbrains.com/help/idea/log-tab.html#changedFiles https://www.jetbrains.com/help/idea/log-tab.html#changedFiles).

它显示“组合差异”,合并结果与每个父提交(#1,#2)的比较 - 基本上它的内容git show merge_commit_sha -m

我的问题:

  1. 如何仅使用 cli + vanilla git 精确复制我们在#3 中看到的合并提交的组合差异(结果内容+参与合并的所有文件的父内容)?可以通过一些奇特的选项来实现吗git diff or git show?我怀疑它可能是这样的git diff --cc --combined-all-paths?

  2. 我如何查看合并期间哪些特定文件发生冲突的历史信息(一个人必须解决的文件)?


根据你的之前的评论 https://stackoverflow.com/questions/15277708/how-do-you-see-show-a-git-merge-conflict-resolution-that-was-done-given-a-mer/71181334#comment134876296_71181334,我建议查看合并提交(Git 2.36+,2022 年第 2 季度):

git log --remerge-diff <rev>^!

With ^!父简写概念 https://git-scm.com/docs/git-rev-parse#_other_rev_parent_shorthand_notations being:

The r1^!符号包括提交r1但不包括其所有父母。
就其本身而言,此符号表示单个提交r1.

<rev> is a "revision https://git-scm.com/docs/git-rev-parse#_specifying_revisions",通常命名提交对象。
你会替换<rev>(包括< and >) with:

  • 提交 SHA1
  • 或分支名称(“refname”)
  • @(HEAD 的快捷方式)
  • ...

在每种情况下,在这个问题的背景下,<rev>必须代表一个合并提交,(最常见的)有 2 个父母的提交。
That <rev>commit 代表两个父级之间合并的结果。


我如何查看合并期间哪些特定文件发生冲突的历史信息(一个人必须解决的文件)?

为此,您需要Git 2.38,2022 年第 3 季度 https://stackoverflow.com/a/73091924/6309:

# You can list the files with conflicts and why they are in conflicts:
git merge-tree --write-tree --no-messages branch1 branch2

# You can list the files with conflicts (just their names):
git merge-tree --write-tree --no-messages --name-only branch1 branch2

你会替换branch1 and branch2通过你的承诺<rev>父母:

git merge-tree --write-tree --no-messages --name-only <rev>^1 <rev>^2

After 讨论 https://chat.stackoverflow.com/rooms/254119/discussion-between-vonc-and-max,OP 在给定的 3 个命令之后merge_commit_sha:

  1. 要查看某人尝试合并时看到的内容,合并冲突 - 作为与非冲突+冲突文件的巨大差异 - 在该人解决任何冲突并进行合并提交之前

    git merge-tree --write-tree --no-messages --name-only merge_sha^1 merge_sha^2
    
  2. 查看合并冲突解决和合并提交期间发生的事实差异(人员可以添加一些修复甚至新文件)

    git show --diff-merges=dense-combined merge_sha
    
  3. 查看带有合并提交的存储库发生的批量更改(合并提交更改本身+自提交发生分歧以来,所有组合更改都发生在 2 个分支中)

    git diff $(git merge-base merge_sha^1 merge_sha^2) merge_sha"
    

我还想补充一下git diff AUTO_MERGE,Git 2.42(2023 年第 3 季度)记录了更多伪引用,包括AUTO_MERGE.

See commit 982ff3a https://github.com/git/git/commit/982ff3a649221d9db79049e5823425f645b3228e, commit 4fa1edb https://github.com/git/git/commit/4fa1edb98820ec6ddf52b004f9d616c34a8ddfd2, commit b7dd54a https://github.com/git/git/commit/b7dd54a2c7df5e1dbe713807afb49fb77c9b7fc7, commit 1ef3c61 https://github.com/git/git/commit/1ef3c61b7889e2aa76a8f0d32a88fbc09fca3b8e, commit 6ec5f46 https://github.com/git/git/commit/6ec5f46071f793dbfa0915212b5708e2ce017053, commit bc11bac https://github.com/git/git/commit/bc11bac3291c4cbeb4fb475c4fdc6fe3b22ba12e (22 May 2023) by Philippe Blain (phil-blain) https://github.com/phil-blain.
(Merged by Junio C Hamano -- gitster -- https://github.com/gitster in commit 0899beb https://github.com/git/git/commit/0899beb63c525c8254b2367e879cc8744092243f, 20 Jun 2023)

Documentation https://github.com/git/git/commit/4fa1edb98820ec6ddf52b004f9d616c34a8ddfd2: 文档AUTO_MERGE

Signed-off-by: Philippe Blain
Signed-off-by: Junio C Hamano

Since 5291828 https://github.com/git/git/commit/5291828df8386ebeb01039d1403d9f845d2f6e20 ("merge-ort: write $GIT_DIR/AUTO_MERGE每当我们遇到冲突时”,2021-03-20,Git v2.32.0-rc0 --merge https://github.com/git/git/commit/7bec8e7fa6175f51e79c55e28e6b2a547a986926),当使用 'ort' 合并策略时,特殊的 refAUTO_MERGE当合并操作导致冲突时写入。
该引用指向记录工作树冲突状态的树,在解决冲突期间非常有用。
然而,这个参考文献没有记录。

添加一些文档AUTO_MERGE在 git-diff(1)、git-merge(1)、gitrevisions(7) 和用户手册中。

Also mention AUTO_MERGE in the "How to resolve conflicts" section, when mentioning 'git diff https://github.com/git/git/blob/4fa1edb98820ec6ddf52b004f9d616c34a8ddfd2/Documentation/git-diff.txt'(man https://git-scm.com/docs/git-diff).

Closes: https://github.com/gitgitgadget/git/issues/1471 https://github.com/gitgitgadget/git/issues/1471

git diff现在包含在其man page https://github.com/git/git/blob/4fa1edb98820ec6ddf52b004f9d616c34a8ddfd2/Documentation/git-diff.txt#L105-L109:

感兴趣的树是所指向的树 由特别裁判AUTO_MERGE,由 'ort' 合并编写 遇到合并冲突时的策略(参见git merge https://git-scm.com/docs/git-merge)。 比较工作树AUTO_MERGE显示您迄今为止为解决文本冲突所做的更改(请参阅下面的示例)。

$ git diff AUTO_MERGE:到目前为止,您为解决文本冲突而对工作树所做的更改。

git merge现在包含在其man page https://github.com/git/git/blob/4fa1edb98820ec6ddf52b004f9d616c34a8ddfd2/Documentation/git-merge.txt#L199-L203:

  1. 特别参考AUTO_MERGE写着,指向一棵树 对应于工作树的当前内容(包括 文本冲突的冲突标记)。
    请注意,此参考仅 当使用“ort”合并策略(默认)时编写。

revisions现在包含在其man page https://github.com/git/git/blob/4fa1edb98820ec6ddf52b004f9d616c34a8ddfd2/Documentation/revisions.txt#L75-L78:

AUTO_MERGE:

记录状态对应的树对象 'ort' 合并策略在合并操作时写入工作树 导致了冲突。

user-manual现在包含在其man page https://github.com/git/git/blob/4fa1edb98820ec6ddf52b004f9d616c34a8ddfd2/Documentation/user-manual.txt#L1346-L1372:

当使用“ort”合并策略(默认)时,在更新工作之前 树与合并的结果,Git 编写一个特殊的引用,名为AUTO_MERGE反映即将写入的树的状态。

与以下路径有冲突 无法自动合并的文本冲突写入此 带有冲突标记的树,就像在工作树中一样。

因此 AUTO_MERGE 可以是 与一起使用git diff https://git-scm.com/docs/git-diff显示您迄今为止所做的需要解决的更改 冲突。
使用与上面相同的示例,解决冲突后我们 得到:

$ git diff AUTO_MERGE
diff --git a/file.txt b/file.txt
index cd10406..8bf5ae7 100644
--- a/file.txt
b/file.txt
@@ -1,5 +1 @@
-<<<<<<< HEAD:file.txt
-Hello world
-=======
-Goodbye
->>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
Goodbye world

请注意,差异显示我们删除了冲突标记和内容行的两个版本,并写入“Goodbye world“ 反而。


The OP Max https://stackoverflow.com/users/336184/max添加评论 https://stackoverflow.com/questions/76495313/replicate-intellij-merge-commit-details-functionality-in-cli-vanilla-git/76496753?noredirect=1#comment135121138_76496753:

其实我发现git merge-base does not当定期合并到分支时可以正常工作B从分行A在我们最终合并之前B into A.

所以看来我们找不到“带来的变化”A在最终合并中B to A" using git merge-base在一般情况下。

See "Git:如何找到分支源自的提交哈希 https://stackoverflow.com/q/3998883/6309#comment4283509_3999084".

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 CLI + vanilla git 中复制 IntelliJ 合并提交详细信息功能 的相关文章

  • git 漂亮格式占位符之间的空格

    因为某些原因 这个原因 https stackoverflow com questions 53034425 git log pretty format windows strange behavior 我可能需要运行这样的 git 命令
  • 错误:无法锁定引用..“引用/标签”存在;无法创建“参考/标签/”

    当我尝试从 github 中提取更改时 出现奇怪的 无法锁定引用 错误 我尝试过 git gc 并查找类似的错误 但找不到解决方案 gt git pull error cannot lock ref refs tags v2 8 refs
  • 克隆/推送 Git Repos 时出错 443:访问错误,但未使用代理

    当使用 git 远程存储库进行这些操作克隆 推送时 我遇到了非常奇怪的问题 假设我正在尝试将更改推送到远程存储库 git push origin master 然后我会得到这个错误 致命 无法访问 Remote Repo 无法连接到 git
  • Maven:如何获取捆绑在包中的 .so 库

    我有一个带有 jar 和 so 文件的第三方库 我配置了 pom xml 如下
  • Git 中的错误 - 致命:“/Users/username/Downloads/folder_name”位于存储库之外

    当我向 git 添加新项目时 出现此错误 Error fatal Users username Downloads folder name is outside repository 如何摆脱这个错误 我想 我需要给出当前的工作目录 但是
  • 在 Git 中查看已删除的文件

    我已使用 Git 删除了一个文件 然后又提交了 因此该文件不再位于我的工作副本中 我想查看该文件的内容 但不想真正恢复它 我怎样才能做到这一点 git show HEAD path to file 您可以使用显式提交标识符或HEAD n查看
  • git fetch 的默认远程

    如果我在当地的分支机构not跟踪任何远程分支 我发出命令 git fetch 鉴于我定义了几个遥控器 GIT DIR config 从哪个远程获取 我试图从man page https www kernel org pub software
  • 如何在提交后删除本地 git 历史记录?

    我想从 Dropbox 切换到开源 Sparkleshare 它使用 git 进行同步和版本控制 如果说我在文件夹中删除了一个 1GB 文件 它会保留在本地 git 文件夹的历史记录中 但我希望将这种大量数据放在服务器上而不是客户端上 如何
  • 压缩 git log --graph 输出?

    有没有办法压缩输出git log graph那么它会在视觉上压缩遵循线性历史的提交吗 基本上 我只想查看图中某些分支分歧 合并的点 以获得我的分支结构的顶层 概述 举个例子 如果我有这个 A Z H B G C F D E 我希望它显示类似
  • 关闭 Sublime Text 3.2 中的 git 集成

    如果我想关闭 Sublime text 左侧装订线中的 GIT 集成 又名史莱姆绿线 我只需将其切换为 false 26 show git status false 但是 当在首选项中进行设置时 我收到错误 尝试解析设置时出错 意外的字符
  • 如何使用git查看指定版本的Webkit?

    谢谢 从链接http trac webkit org wiki UsingGitWithWebKit http trac webkit org wiki UsingGitWithWebKit 使用 git 检查 Webkit 有以下 3 个
  • 将 git 存储库拆分为压缩的公共和初始私有

    我想在 Github 上开源一个项目 有相当多的提交 超过 2k 我会将它们压缩成一个 初始提交 以便从一个干净的代码库开始并隐藏一些历史内容 问题是 是否有可能 保留一个包含所有初始提交的私有存储库 其中会有一些秘密密钥 travis c
  • git | git将旧提交移至另一个分支的过去

    我过去错误地进行了分支 并且在另一个分支的开头留下了一个提交 03431cb HEAD gt bar a2 d332e4d foo b2 9b29ae3 b1 4656a98 a1 6ebca20 master root 我怎样才能移动a1
  • git 别名:多个命令、可变参数

    我经常发现自己输入以下内容 git push remote1 branch1 branch2 tag1 tag2 tag3 git push remote2 branch1 branch2 tag1 tag2 tag3 我更喜欢一个别名 我
  • 确保 MAVEN_HOME 设置正确

    这里是 Java 和 Maven 菜鸟 使用 OSX 10 8 并使用 HomeBrew 安装 Maven 1 如果我说which mvn我会得到这个 usr local bin mvn 2 如果我说echo MAVEN HOME我不会得到
  • 用于维护项目扩展分支的 Git 工作流程?

    我们在 GitHub 上分叉了一个 OSS 项目 并向其添加一些自定义扩展 我们希望将我们所做的一些更改发送回原始项目 错误修复等 但其他更改是原始项目维护者目前不感兴趣的功能扩展 我正在尝试找出管理这种情况的最佳工作流程 我希望我们的主分
  • Git 错误:引用名称“HEAD”不明确

    我对 git 还很陌生 目前 我尝试按照本教程使用分支名称和版本覆盖我的应用程序的图标 http www merowing info 2013 03 overlaying application version on top of your
  • 调试器不会停止在 Intellij IDEA 中的源代码处

    我有一个相当奇怪的问题 无法使用 Intellij IDEA 解决 我正在解析电子邮件文件org apache james mime4j包裹 但我的邮件文件格式不兼容Date 标头 因此 我从 mime4j 源创建了模块 并从磁盘中删除了
  • 你遇到过哪些 git 陷阱?

    我遇到的最糟糕的情况是 git 子模块 我在 github 上有一个项目的子模块 该项目无人维护 我想提交补丁 但无法提交 所以我分叉了 现在子模块指向原始库 而我需要它指向 fork 因此 我删除了旧的子模块 并将其替换为同一提交中新项目
  • Gitflow错误无法初始化

    我已经将 gitflow 安装在我的 github 项目所在的目录中 但是 当我尝试使用命令 启动时git flow init 我收到以下错误消息 git flow init C cygwin64 usr local bin gitflow

随机推荐