我在执行命令时遇到问题git revert。我使用 Ubuntu 12.04 Linux 和 Git 版本 1.7.9.5。
b_test_repo我在本地 PC 上创建了一个全新的,并从远程跟踪它origin b_test_repo。A包含两行文本的单个文件(commit),并仅在本地master分支中成功提交了它。为了进行尝试,git revert我又生成了 3 个提交,每个提交都添加了一行文本。所以我的master提交历史如下所示:
A - B - C - D
Run Code Online (Sandbox Code Playgroud)
在哪里
A- 包含第 1 行和第 2 行的新文件B- 添加了一行C- 添加了一行D- 添加了一行在所有这些提交之后,文件包含 5 行:
line1
line2
line3
line4
line5
Run Code Online (Sandbox Code Playgroud)
然后,我想恢复 commit B,这将渲染没有 的文件line3,该文件是由 commit 添加的B:
git status
# On branch master
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)
我输入:
git revert -n master~2
Run Code Online (Sandbox Code Playgroud)
恢复提交的效果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'
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么会遇到冲突,即为什么 Git 在确定文件中需要更改的内容时遇到问题。
我在这里缺少什么?请赐教!
删除该行将与更高版本产生冲突,从而更改同一行。
因此,正如“当 git revert 中止并出现错误消息时我应该做什么? ”中提到的,您需要解决合并、添加和提交问题。
恢复该提交的一种更简单的方法是交互式变基:
git rebase -i <SHA1 commit a>
Run Code Online (Sandbox Code Playgroud)
然后你放弃提交b。
但这仅在您尚未将分支推送到上游存储库时才有效,因为它确实会重写提交的历史记录。
如果您已经推送,那么这git revert是正确的方法,以便生成新的提交取消b(并将该新提交推送到上游存储库)。
详细信息:您的示例生成以下合并冲突:
C:\Users\VonC\prog\git\tests\18779372\r1>git lg
* 10b9953 - (HEAD)
* 07fff99 - c
* 3d888c4 - b
* 8c7155f - a
Run Code Online (Sandbox Code Playgroud)
(git lg是幻想的别名git log)
如果存在冲突,我更喜欢像合并或恢复之前一样看到源(他们的)、目标(我们的)和原始部分:
git config merge.conflictstyle diff3
Run Code Online (Sandbox Code Playgroud)
然后恢复:
git revert -n master~2
Run Code Online (Sandbox Code Playgroud)
那会给出:
line1
line2
<<<<<<< HEAD
line3
line4
line5
||||||| 3d888c4... b
line3
=======
>>>>>>> parent of 3d888c4... b
Run Code Online (Sandbox Code Playgroud)
这样,您就会看到什么git revert:合并:
b(显然不包含b修改)HEAD合并无法决定对第三行开始的部分做什么:
a(=== >>>>部分:“他们的”一侧)b(||||和之间的原始部分====,如之前一样revert,只有line3)HEAD(<<<< ||||部分,添加了line4和line5,尽管line3看起来没有变化)进行了修改如果您从提交开始,合并冲突会更加明显a:
line1
line2
line3
line4
line5
Run Code Online (Sandbox Code Playgroud)
最终提交d为:
line1
line2
line3b
line4c
line5d
Run Code Online (Sandbox Code Playgroud)
(提交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
Run Code Online (Sandbox Code Playgroud)
这是从第 3 行开始的部分:
line3 -line4 -line5'theirs' === >>>,它是 的父级b,或 commit a)line3b-line4 -line5提交b(原始部分||| ===,合并/恢复之前)line3b-line4c-line5d”HEAD<<< |||三个不同的内容,并且合并无法知道要做什么。
| 归档时间: |
|
| 查看次数: |
5051 次 |
| 最近记录: |