diff for git rebase dry-run

时间:2018-06-13 11:44:40

标签: git diff git-rebase git-diff

我想看看主题分支的哪些部分已经包含在上游分支中,以及在rebase上可能出现的冲突。

它应该是git-rebase的一种干运行,它在主题上游之间显示差异,不包括不会发生的变化连接主题

3 个答案:

答案 0 :(得分:1)

  

我想看看主题分支的哪些部分已经包含在上游分支中,以及在rebase上可能出现的冲突。

如果我错了,请纠正我,但听起来你想要修补topic中包含的相互冲突的修改,如果有的话。

由于rebase是一种合并,我认为最简单的方法是在不创建提交的情况下进行合并(您可以将其命名为“ dry merge ”)并检查未合并(即冲突)文件的差异:

git checkout topic
git merge upstream --no-commit --no-ff

在工作目录中有develop的合并文件之后,您所要做的就是检查所有未合并文件的差异:

git diff --diff-filter=U

答案 1 :(得分:1)

这里的一种方法是制作目标分支的副本(git checkout -b tmpbranch),在此进行变基,然后将其与未修改的分支进行比较。

答案 2 :(得分:0)

一种解决方案是在差异上应用差异。这个想法是:

  1. forkpoint 主题
  2. 之间获得差异
  3. 上游主题
  4. 之间获得差异
  5. 比较这些差异
  6. git-diff-rebase脚本文件:

    #!/bin/bash
    
    upstream="$1"
    topic="$2"
    
    root=$( git rev-parse --show-toplevel )
    forkpoint=$( git merge-base $upstream $topic )
    
    if [ -z "$forkpoint" ] ; then
      echo "Merge base is not found" 1>&2
      exit 1
    fi
    
    # list of the changed files (space separated)
    files=$( git -C "$root" diff --name-only $forkpoint $topic | paste -s -d ' ' )
    
    diff -t --tabsize=4 -W $(tput cols) -y \
      <( git -C "$root" diff $forkpoint $topic ) \
      <( git -C "$root" diff $upstream $topic -- $files ) \
      | grep -v '^ *>'
      # skip changes that do not interfere with topic (empty left part)
    

    注意:此脚本不适用于名称中包含空格的文件。

    用法:git-diff-rebase master topic | less

    如何解释结果:

    • * * <     - (空右侧部分)已包含在上游
    • + * | * - (正确文本)已包含在上游
    • + * + * - 没有冲突
    • - * - * - 没有冲突
    • - * | + * - 冲突
    • + * | - * - 可能发生冲突

    *是任何文字的占位符。