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

问题描述 投票:1回答:1

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

 |_ 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

目标

我想清理开发分支,因此它具有master的所有源文件状态并删除了virus.exe文件。

我已经找到了让主状态覆盖开发文件状态的方法。

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

但我也想摆脱master工作集中不存在的文件。在这个例子中,这将是文件virus.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
git branch git-diff
1个回答
1
投票

分支机构没有工作集。 (好吧,也许他们这样做,因为你没有定义工作集,但是Git也没有定义工作集。但是因为我不知道你的意思,我使用工作集作为工作树的别名,是明确定义的,分支没有工作树。)

分支名称的作用是选择一个特定的提交。那个提交然后有一些父提交(如果它是一个合并,则多于一个);父级有自己的父级,依此类推,形成一系列提交。因此,我们可以说分支(或分支名称)包含一组提交:这些是可从名称访问的提交。有关所有这些的详细介绍,请参阅Think Like (a) Git

每个提交都有一个存储的树或快照。正如您所发现的,git diff-tree是所谓的管道命令(脚本能够工作的马),用于比较两个提交中找到的两个树:

git diff-tree -r commit1 commit2

以递归方式(-r)比较整个树,比较两个快照中包含的所有文件。你可以拼写这个commit1..commit2:它的意思完全相同,使用commit1作为左侧,commit2作为右侧比较。此比较的输出本质上是一系列指令,例如,向该文件添加一些行,从该文件中删除一些行,并且您将使附加到commit1的树与附加到commit2的树匹配。

您可以添加--name-only--name-status--find-renames等选项以及可选的相似性索引值 - 百分比 - 让Git计算位置重命名,然后更改,文件生成比简单删除文件A更短的指令序列,并创建新文件B从头开始使用这些内容。例如,可能较短的序列是重命名A到B,然后删除第17行,这显然比删除文件A短得多,然后用这10,000行创建文件B:[很长的行列表]。

前端的,面向用户的git diff命令实际上运行git diff-treegit diff-index或其他任何东西,但考虑到用户的配置(例如diff.renamesdiff.renameLimit),并通过寻呼机发送输出,着色等等。 Git将这些命令称为瓷器,因为它们应该是用户友好的(与管道相比,隐藏在墙后,不在视线范围内)。

进行新提交时,Git会存储一个新快照。 Git在运行git commit时从其索引中的任何内容构建新快照。新提交的父级是当前分支的旧提示;新提交成为当前分支的提示。这就是分支增长的方式。

您使用的各种命令(例如git rmgit add)对索引进行操作。您使用git checkout branch将分支的提示提交提取到此索引中。存储在索引中的文件很难看到 - 您可以使用git ls-files --stage获得完整的列表,但这很少有用。这些文件在索引中并且(最终)冻结到提交中,无论如何都是一种特殊的Git形式。因此,要使用这些文件,当您让Git提取提示提交时,您还可以让Git将所有文件提取到工作树中。

工作树具有普通格式的文件,您和您的计算机可以通过普通方式使用它们。但是你在这个工作树中所做的一切实际上都是为了搞乱索引,因为它是包含下一次提交内容的索引。运行git commit将索引内容打包(冻结)到快照中,并将其添加为分支的新提示。

因此,如果比较两个提交(使用git diffgit diff-tree),然后对索引进行一些更改并进行新的提交,您正在做的是更改索引并使用它来进行新的提交。两个提交的比较取决于您。请注意,您还可以使用git diff --cached(瓷器)或git diff-index --cached(管道)将任何一个提交与索引进行比较。并且,您还可以使用这些命令比较索引与工作树,或提交与工作树。

© www.soinside.com 2019 - 2024. All rights reserved.