代码之家  ›  专栏  ›  技术社区  ›  xetra11

如何获得两个git分支的工作集(不是提交)之间的差异

  •  1
  • xetra11  · 技术社区  · 6 年前

    我有以下两个文件不同的分支

    主人

     |_ document.txt
     |_ document_two.txt
     |_ document_three.txt
    

    发展

     |_ document.txt
     |_ document_two.txt
     |_ document_three.txt
     |_ virus.exe // want to get rid of that
    

    这些是 git log 两者的结果( )

    commit: fdsdfsf1342re5252423425242234 (master, development)
    add document one
    
    commit: 563523523g233g5232sdfawe22434 (master, development)
    add document two
    
    commit: 56652u747241523g52352fsdfawew (master, development)
    add document three
    

    commit: fdsdfsf1342re5252423425242234 (master, development)
    add document one
    
    commit: 563523523g233g5232sdfawe22434 (master, development)
    add document two
    
    commit: 1213421g233g5232s41dfawe22434 (development)
    ADD VIRUS.EXE ! XXX
    
    commit: 5423345652u7433g52352fsdf1223 (development)
    change document three completly
    
    commit: 56652u747241523g52352fsdfawew (master, development)
    add document three
    

    目标

    发展 virus.exe

    我已经找到了办法 主人 发展

    在这里阅读 : Make the current Git branch a master branch

    但是,我还想清除工作集中不存在的文件 . 在本例中,这将是文件 病毒.exe 主服务器的分支不是一个选项,因为离开 发展 孤儿 . 覆盖/分支 发展 分支机构 主人 它会失去 国家,因为它将适应整个历史

    有人知道如何:

    • 通过最终提交删除文件中发现的所有差异(以保持历史完整)?

    : 我找到了一个命令来告诉我文件中的差异:

    $ git diff-tree -r --name-status --diff-filter=A master..development
    A       virus.exe
    

    有没有一种优雅的方法可以直接使用输出从开发分支中删除?我会把它用在:

    git checkout development && git rm virus.exe && git commit -m "clean development" && git push origin
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   torek    6 年前

    分支没有工作集。(好吧,也许是的,因为你还没有定义 工作装置 ,但Git也没有定义工作集。但既然我不知道你的意思,我就用 工作装置 作为的别名 工作树 ,其中

    分支名称所做的是选择一个特定的提交。然后,该提交有一些父提交(如果是合并,则有多个父提交);父提交有自己的父提交,以此类推,形成提交链。因此,我们可以说一个分支(或分支名称) 包含 一些提交集:这些是 名字。有关所有这些的详细介绍,请参阅 Think Like (a) Git .

    每个提交都有一个存储的 或快照。正如你所发现的, git diff-tree 卫浴命令

    git diff-tree -r commit1 commit2
    

    递归地比较整个树( -r ),比较两个快照中包含的所有文件。你可以拼这个 commit1..commit2 commit1 commit2 作为比较的右边。这种比较的输出本质上是一系列指令,例如。, 在这个文件中添加一些行,从中删除一些行,这样就可以使树附加到 匹配连接到的树 委员会2 .

    您可以添加如下选项 --name-only --name-status --find-renames 带有可选的 相似性指数 valuea percentage让Git计算文件的位置,在那里重命名,然后更改,会产生比简单的命令序列更短的指令序列 . 例如,也许较短的序列是 这显然比 删除文件A,然后用以下10000行创建文件B:[非常长的行列表] .

    前端,面向用户 git diff 命令生效运行 git差异树 git diff-index 或者别的什么,但是根据用户的配置( diff.renames diff.renameLimit 寻呼机 ,着色,等等。Git调用这些命令 因为它们应该是用户友好的(相对于隐藏在墙后,看不见的管道)。

    当你做出决定的时候 新的 提交,你有Git存储一个新的快照。Git根据Git在其内存中的任何内容构建新的快照 在你跑步的时候 git commit . 新提交的 起源 变成 当前分支的尖端。树枝就是这样生长的。

    您使用的各种命令,例如 git rm git add . 你用 git checkout branch 在里面 git ls-files --stage ,但这很少有用。这些文件,在索引中(最终)冻结到提交中,无论如何都是一种特殊的Git形式。所以到 与…合作 这些文件,当您让Git提取tip commit时,您也让Git将所有文件提取到 .

    工作树中的这些文件是普通格式的,您和您的计算机可以用普通的方式处理它们。但是在这个工作树中所做的一切都是为了搞乱索引,因为索引包含了 下一个 git提交

    因此,如果比较两个提交(使用 差异比较 git差异树 你的索引,使用 git diff --cached git diff-index --cached (管道)。此外,还可以使用这些命令比较索引与工作树,或提交与工作树。