gpt4 book ai didi

Git revert 没有按预期工作

转载 作者:太空狗 更新时间:2023-10-29 14:00:44 25 4
gpt4 key购买 nike

我在使用 git revert 命令时遇到问题。我使用 Ubuntu 12.04 Linux 和 Git 版本 1.7.9.5。

  1. 我在本地 PC 上创建了一个全新的 b_test_repo,并从远程 origin b_test_repo 对其进行了跟踪。
  2. 我已经在本地创建了一个包含两行文本的文件(commit A),并且仅在本地 master 分支中成功提交了它。

为了尝试 git revert,我又生成了 3 个提交,每个提交都添加了一行文本。所以我的 master 提交历史看起来像:

A - B - C - D

在哪里

  • A - 包含第 1 行和第 2 行的新文件
  • B - 添加一行
  • C - 添加一行
  • D - 添加一行

在所有这些提交之后,文件包含 5 行:

line1
line2
line3
line4
line5

然后,我想还原提交 B,这将呈现没有 line3 的文件,这是由提交 B 添加的:

git status
# On branch master
nothing to commit (working directory clean)

我输入:

git revert -n master~2

在不提交更改的情况下恢复提交 B 的效果,但得到以下内容:

error: could not revert 1a13ad6... Adding one line
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

我很困惑为什么我会遇到冲突,即为什么 Git 无法确定文件中需要更改的内容。

我在这里错过了什么?请赐教!

最佳答案

删除该行将与更高版本发生冲突,这将更改相同行。

因此如“What should I do when git revert aborts with an error message?”中所述,您需要解决 merge 、添加和提交。

一种更简单的还原提交的方法是交互式 rebase :

git rebase -i <SHA1 commit a>

然后你放弃提交 b .
但这仅在您尚未将分支推送到 upstream repo 时才有效。 ,因为它确实重写了提交历史。

如果你已经推送了,那么 git revert是正确的方法,以生成一个新的提交取消 b (并将新提交推送到上游仓库)。


详细信息:您的示例生成以下 merge 冲突:

C:\Users\VonC\prog\git\tests\18779372\r1>git lg

* 10b9953 - (HEAD)
* 07fff99 - c
* 3d888c4 - b
* 8c7155f - a

( git lg 是一个 alias for a fancy git log )

如果有冲突,我更喜欢在 merge 或还原之前同时查看源(他们的)、目标(我们的)原始部分:

git config merge.conflictstyle diff3

然后还原:

git revert -n master~2

那会给出:

line1
line2
<<<<<<< HEAD
line3
line4
line5
||||||| 3d888c4... b
line3
=======
>>>>>>> parent of 3d888c4... b

那样的话,你会看到什么git revert做:一个 merge 在:

  • 提交的父项 b (显然不包含 b 修饰)
  • HEAD

merge 无法决定对从第三行开始的部分做什么:

  • a 中不存在该部分(=== >>>> 部分:“他们的”一方)
  • 修改于b (||||==== 之间的原始部分,与之前的 revert 一样,只有 line3 )
  • HEAD中被修改(<<<< |||| 部分,添加了 line4line5 ,尽管 line3 看起来没有变化)

如果您从提交 a 开始, merge 冲突会更加清晰作为:

line1
line2
line3
line4
line5

最后提交 d作为:

line1
line2
line3b
line4c
line5d

(提交 b 添加“d”到第 3 行,提交 c 添加“c”到第 4 行,提交 d 添加“d”到第 5 行)

然后还原会给你:

git config merge.conflictstyle diff3
git revert -n master~2

cat afile.txt

line1
line2
<<<<<<< HEAD
line3b
line4c
line5d
||||||| 4ddccc1... b
line3b
line4
line5
=======
line3
line4
line5
>>>>>>> parent of 4ddccc1... b

这里是从第 3 行开始的部分:

  • 等于line3 -line4 -line5在“他们的”=== >>> ,它是 b 的父级,或提交 a )
  • 等于line3b-line4 -line5在提交 b (原始部分 ||| ===,在 merge/还原之前)
  • 等于line3b-line4c-line5dHEAD '我们的' <<< |||

三个不同的内容,merge没办法知道要做什么。

关于Git revert 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18778539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com