我有以下两个文件不同的分支
主
|_ 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也没有定义工作集。但是因为我不知道你的意思,我使用工作集作为工作树的别名,是明确定义的,分支没有工作树。)
分支名称的作用是选择一个特定的提交。那个提交然后有一些父提交(如果它是一个合并,则多于一个);父级有自己的父级,依此类推,形成一系列提交。因此,我们可以说分支(或分支名称)包含一组提交:这些是可从名称访问的提交。有关所有这些的详细介绍,请参阅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-tree
或git diff-index
或其他任何东西,但考虑到用户的配置(例如diff.renames
和diff.renameLimit
),并通过寻呼机发送输出,着色等等。 Git将这些命令称为瓷器,因为它们应该是用户友好的(与管道相比,隐藏在墙后,不在视线范围内)。
进行新提交时,Git会存储一个新快照。 Git在运行git commit
时从其索引中的任何内容构建新快照。新提交的父级是当前分支的旧提示;新提交成为当前分支的提示。这就是分支增长的方式。
您使用的各种命令(例如git rm
或git add
)对索引进行操作。您使用git checkout branch
将分支的提示提交提取到此索引中。存储在索引中的文件很难看到 - 您可以使用git ls-files --stage
获得完整的列表,但这很少有用。这些文件在索引中并且(最终)冻结到提交中,无论如何都是一种特殊的Git形式。因此,要使用这些文件,当您让Git提取提示提交时,您还可以让Git将所有文件提取到工作树中。
工作树具有普通格式的文件,您和您的计算机可以通过普通方式使用它们。但是你在这个工作树中所做的一切实际上都是为了搞乱索引,因为它是包含下一次提交内容的索引。运行git commit
将索引内容打包(冻结)到快照中,并将其添加为分支的新提示。
因此,如果比较两个提交(使用git diff
或git diff-tree
),然后对索引进行一些更改并进行新的提交,您正在做的是更改索引并使用它来进行新的提交。两个提交的比较取决于您。请注意,您还可以使用git diff --cached
(瓷器)或git diff-index --cached
(管道)将任何一个提交与索引进行比较。并且,您还可以使用这些命令比较索引与工作树,或提交与工作树。