我有一个文件,我已重命名,然后编辑.我想告诉Git进行重命名,但不是内容修改.也就是说,我希望删除旧文件名,并添加旧文件内容和新文件名.
所以我有这个:
Changes not staged for commit:
deleted: old-name.txt
Untracked files:
new-name.txt
Run Code Online (Sandbox Code Playgroud)
但想要这个:
Changes to be committed:
new file: new-name.txt
deleted: old-name.txt
Changes not staged for commit:
modified: new-name.txt
Run Code Online (Sandbox Code Playgroud)
或这个:
Changes to be committed:
renamed: old-name.txt -> new-name.txt
Changes not staged for commit:
modified: new-name.txt
Run Code Online (Sandbox Code Playgroud)
(相似性度量应为100%).
我想不出一个直截了当的方法来做到这一点.
是否有获取特定文件的特定修订内容的语法,并将其添加到指定路径下的git临时区域?
删除部分,git rm很好:
$ git rm old-name.txt
Run Code Online (Sandbox Code Playgroud)
这是我正在努力的重命名的补充部分.(我可以保存新内容,mv在shell中签出一份新的副本(旧内容),git add然后恢复新内容,但这似乎有很长的路要走!)
谢谢!
从git merge文档中提取的递归合并策略的定义。
这只能使用3向合并算法解析两个磁头。当有一个以上的公共祖先可用于三路合并时,它将创建一个公共祖先的合并树,并将其用作三路合并的参考树。据报道,这样做可以减少合并冲突,而不会因对Linux 2.6内核开发历史记录中的实际合并提交进行测试而导致合并错误。此外,这可以检测和处理涉及重命名的合并。当拉或合并一个分支时,这是默认的合并策略。
递归策略可以采用以下选项:
如前所述,递归策略是默认策略,它使用3向递归合并算法(在此处和Wikipedia上进行了说明)。
我的理解是冲突的大块必须手动解决,并且通常以这种方式表示
<<<<<<<<<<<
developer 1's code here
============
developer 2's code here
>>>>>>>>>>>
Run Code Online (Sandbox Code Playgroud)
在我们的递归合并策略的选择进行了说明如下:
通过支持我们的版本,此选项可以强制自动解决冲突的大块。与另一棵树不冲突的更改会反映到合并结果中。对于二进制文件,全部内容都是从我们这边获取的。
这不应与我们的合并策略混淆,该策略甚至根本不看另一棵树包含的内容。它丢弃另一棵树所做的所有操作,声明我们的历史包含其中发生的所有事件。
现在假设我有两个分支Y和M的头,并且具有一个共同的基本祖先B,如下所示
当使用默认递归策略合并Y和M时,第30行将变为Print("hello");行,因为在第30行,Y表示从基本祖先开始的更改,而M则不是。但是如果我在M分支上并运行
git merge -s recursive -X ours Y
第30行会成为Print("bye");合并后的输出吗?
对于那些说这很明显的人,请注意我们的选项指出
通过支持我们的版本,此选项可以强制自动解决冲突的大块。
但是(据我了解)在第30行没有冲突的块。
为了完整起见,我还将提供他们的选项的文档:
这与我们的相反。
我们的策略文档如下:
这样可以解析任意数量的head,但是合并的结果树始终是当前分支head的树,有效地忽略了所有其他分支的所有更改。它旨在取代侧支的旧开发历史。请注意,这与递归合并策略的-Xours选项不同。
所以回到上面的例子,如果我跑了
git merge -s ours Y
在分支M上,很明显第30行将Print("bye");在合并的输出中。在这种情况下,为什么也没有 …