我可以在不将文件添加到索引的情况下使用一个命令将文件标记为分辨率吗? 示例

问题描述

发生冲突时,git status显示

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
    both modified:   some_file

现在我可以 git add some_file标记分辨率,正如命令所建议的那样,但这也会分阶段 some_file,我可能不想这样做。

如何在不将文件添加到索引的情况下标记文件以进行解析?只需两步即可:

git add some_file
git restore --staged some_file

但是如果可能的话,我该如何一步完成呢?

如果最佳实践不建议这样做,请告诉我。

解决方法

如何在不将文件添加到索引的情况下将其标记为分辨率?

Mu.(换句话说,这个问题预设了一些不存在的东西。)

合并冲突表现为在索引/暂存区有多个文件副本。1也就是说,不是只有一个文件被暂存——这个文件要么与当前提交匹配,Git 要么闭嘴,要么不闭嘴,Git 打印 staged for commit 相关信息——有 三个 待提交的文件。 Git 实际上不能提交一个文件的三个副本并且不会让你提交,所以你必须解决这种情况......但解决的行为包括擦除那些三个文件并将一个文件放在适当的位置。

您放置的那个文件被添加到索引中。它要么匹配当前提交的文件,而 Git 什么都不说,要么不匹配,而 Git 说 staged for commit。该文件以任何方式存在。

如果您想让 Git 的索引包含当前提交中的副本作为文件的一个副本,您可以这样做。但这意味着您已经添加该版本的文件作为暂存提交的版本。


1这在技术上不太正确:合并冲突表现为索引中有任何非零阶段条目。但是,当您遇到合并冲突时,大多数情况您最终会得到一个或多个文件,每个文件都有三个条目。其他情况发生在添加/添加、修改/删除、重命名/重命名和重命名/删除冲突中。这些也留下了多个代表“相同”文件的条目。


示例

让我们来说明这一点。首先,让我们创建一个小型存储库并设置冲突:

$ mkdir test-resolve
$ cd test-resolve/
$ git init
Initialized empty Git repository in .../.git/
$ echo test conflict resolution > README
$ echo fee file fo fum > file
$ git add . && git commit -q -m initial
$ git checkout -b branch
Switched to a new branch 'branch'
$ echo foo >> file && git add file && git commit -q -m foo
$ git checkout -q master
$ echo bar >> file && git add file && git commit -q -m bar
$ git log --all --decorate --oneline --graph
* 8921373 (HEAD -> master) bar
| * 679121a (branch) foo
|/  
* a7a3f27 initial

现在让我们看看 Git 的暂存区/索引中有什么:

$ git ls-files --stage
100644 7eafc9636afdf576278e921d7430598dd8754bdd 0       README
100644 1f4f7a3f149c9b0e7740a5f2f801b1840f2d68f8 0       file

这些是 Git 暂存区中的文件,以及它们的暂存编号。阶段号零表示没有合并冲突;这样的文件不能有任何其他条目。请注意,这两个文件都已暂存以进行提交!它们只是匹配 HEAD 提交版本,所以 git status 不会 staged for commit

现在我们将运行合并:

$ git merge branch
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.
$ git ls-files --stage
100644 7eafc9636afdf576278e921d7430598dd8754bdd 0       README
100644 8fee5c26846ed992dc2dd912e224a2001a2b6820 1       file
100644 1f4f7a3f149c9b0e7740a5f2f801b1840f2d68f8 2       file
100644 af8330063fa2da41a81f8a789929fd87692adb2f 3       file

瞧!这是我们名为 file 的文件的三个副本。他们有非零的登台号码;它们代表文件的合并基本副本(阶段 1)、ours 副本(阶段 2)和 theirs 副本(阶段 3)。如果愿意,我们可以查看文件:git show :1:filegit show :2:file 等:

$ git show :3:file
fee file fo fum
foo

“他们的”文件,从分支 branch 的顶端开始,第 2 行读取 foo(我们的读取 bar)。

现在,文件 file工作树副本包含 Git 解决冲突的尝试。如果我们这样看,我们可以看到它并不顺利。请注意,我已将 merge.conflictStyle 配置为 diff3,以便我也获得文本的合并基础版本:

$ cat file
fee file fo fum
<<<<<<< HEAD
bar
||||||| a7a3f27
=======
foo
>>>>>>> branch

我们现在回到你的问题,我将再次引用

如何将文件标记为分辨率

从三个阶段中存在的三个副本中选择一个,或者在 HEAD 提交或任何其他提交中存在的副本,然后选择它作为副本进入 Git 索引中的插槽 0。擦除其他两个插槽。该文件现在准备提交。

不将其添加到索引中?

它已经在索引中了。您要减去两到三个副本,可能留下第三个副本并将其移至插槽零;或者您减去所有三个副本并在索引中添加一个新副本。

您可以使用 git add工作树文件复制到索引中,或者您可以选择一些现有的 Git 化副本并将其移入。假设您想要将文件的 HEAD 副本粘贴到索引中,而不触及工作树副本。在这里,git restoregit reset(两者都可以完成这项工作)是要走的路:

$ git restore --source HEAD -S file
$ git ls-files --stage
100644 7eafc9636afdf576278e921d7430598dd8754bdd 0       README
100644 1f4f7a3f149c9b0e7740a5f2f801b1840f2d68f8 0       file

(请注意,这里的哈希 ID 与我们之前在插槽 2 中看到的相同。)

$ git show :0:file
fee file fo fum
bar
$ cat file
fee file fo fum
<<<<<<< HEAD
bar
||||||| a7a3f27
=======
foo
>>>>>>> branch

由于索引副本是 Git 将提交的文件,因此 git commit 现在将进行与当前提交匹配的另一个提交(文件 README 仍与当前提交匹配)。由于我正处于合并过程中,所有冲突都解决了,这将进行最终合并提交,快照与我使用 git merge -s oursgit merge -s recursive -X ours 时得到的快照相匹配,例如:

$ git commit -m 'resolved by keeping ours'
[master b896bc3] resolved by keeping ours
$ git log --all --decorate --oneline --graph
*   b896bc3 (HEAD -> master) resolved by keeping ours
|\  
| * 679121a (branch) foo
* | 8921373 bar
|/  
* a7a3f27 initial

(当然,我的工作树仍然有点混乱,git status 将显示我的 file 工作树副本与我的 file 索引副本不同,因为工作树版本中仍然存在未解决的冲突。但是 Git 没有使用该副本来进行提交:它使用了索引副本。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...