Git-是否可以在解决错误冲突之前恢复到状态

Git-是否可以在解决错误冲突之前恢复到状态,git,storyboard,Git,Storyboard,当我将我的local feature分支重新设置为develop分支时,出现了一些冲突。 所以我需要解决它们,但这个解决实际上是修改我的提交。 所以问题是,如果解析错误(那么,我丢失了正确的代码),该怎么办?如何恢复到以前的状态,除非提前备份该分支 如“”中所述,您始终可以恢复分支,使其恢复到重新基础之前的状态,或者,如果您刚刚使用了重新基础,) 即使您不想撤消重设基础,但只需参照重设基础之前的代码,您也可以在所述重设基础之前的位置创建一个tmp分支: git branch tmp @{1}

当我将我的local feature分支重新设置为develop分支时,出现了一些冲突。 所以我需要解决它们,但这个解决实际上是修改我的提交。 所以问题是,如果解析错误(那么,我丢失了正确的代码),该怎么办?如何恢复到以前的状态,除非提前备份该分支

如“”中所述,您始终可以恢复分支,使其恢复到重新基础之前的状态,或者,如果您刚刚使用了重新基础,)

即使您不想撤消重设基础,但只需参照重设基础之前的代码,您也可以在所述重设基础之前的位置创建一个
tmp
分支:

git branch tmp @{1}
这使您能够:

正如在“”中提到的,您始终可以恢复分支,使其恢复到重新基准之前的状态,或者,如果您刚刚完成了重新基准,)

即使您不想撤消重设基础,但只需参照重设基础之前的代码,您也可以在所述重设基础之前的位置创建一个
tmp
分支:

git branch tmp @{1}
这使您能够:


您很幸运,因为git(大多数为1)只在您每次对提交执行任何操作时添加新的提交。旧的还在那里,只是越来越难找到

具体来说,您拥有本地功能分支,我们称之为
feat
——基于远程开发分支,我们可以称之为
origin/devel
。这意味着您有一组提交 “分支”此
origin/devel
。让我们画出:

                 A - B - C   <-- feat
               /
...- o - o - *               <-- origin/devel
git fetch
通常在完成之前做的最后一件事是更新
origin/
分支标签,因此
origin/devel
现在指向新的分支提示:

                 A - B - C   <-- feat
               /
...- o - o - * - o - x       <-- origin/devel
副本对其父节点的更改与原始副本对其自己的父节点的更改相同。也就是说,无论您在
*
A
之间做了什么,git都会尝试对
x
进行相同的更改,以得到
A'
。然后,无论您在
A
B
之间做了什么,git都会尝试对
A'
执行相同的操作以获得
B'
,依此类推

当git不能自动执行这些操作时,就会出现合并冲突。(即使git认为它可以自动执行这些操作,您也应该以某种方式检查结果,因为git可能会出错。)

您可以查看原始分支原始的
A
C
提交,特别是通过使用引用提交
C
的名称。最简单的方法是
ORIG_HEAD
,它将
git rebase
设置为指向
C
,然后将
feat
标签移动到
C'
。但是,还有“reflog”,它跟踪用于命名的commit
feat
。您可以使用git reflog show feat查看
feat
-分支reflog。您还可以使用
git log-g
(可选拼写:
git log--walk reflogs
)。reflog通常持续时间更长:默认情况下为30到90天。
ORIG_HEAD
名称被各种其他命令替换(
git merge
git cherry pick
以及
git rebase
),因此它只是用于立即更正

如果您事先知道要保存原始分支,可以在运行
git-rebase
之前,创建一个新名称(分支或标记名)以指向当前分支的尖端(在本例中,提交
C
):

git branch save-feat feat
或者,就像我有时做的那样:

git branch -m feat feat-1
git checkout feat-1
git checkout -b feat-2
只有到那时:

git rebase ...
因此,我现在有两个版本的
feat
ure分支


1Git将删除提交(和其他未使用的存储库对象),但只有在它们真正被取消引用之后。特别是,reflog会将旧提交保留一到三个月,除非您采取措施删除reflog(包括删除分支)

2在较新的git(1.8.5版本之后)中,
git fetch
始终更新;在旧版本中,
git pull
以禁止更新
origin/branch
标签的方式调用它


3具体而言,
git-rebase
使用一系列
git-cherry-pick
操作来复制每个提交。(请注意,它还会尝试跳过不再需要的提交,除非以交互方式调用。例如,如果您的
A
-to-
B
更改与添加到
origin/devel
中的内容完全相同,
git-rebase
可以在复制时完全跳过
B
,只给您
A'
C'

你很幸运,因为git(大多数是1)只在你每次对提交做任何事情时添加新的提交。旧的还在那里,只是越来越难找到

具体来说,您拥有本地功能分支,我们称之为
feat
——基于远程开发分支,我们可以称之为
origin/devel
。这意味着您有一组提交 “分支”此
origin/devel
。让我们画出:

                 A - B - C   <-- feat
               /
...- o - o - *               <-- origin/devel
git fetch
通常在完成之前做的最后一件事是更新
origin/
分支标签,因此
origin/devel
现在指向新的分支提示:

                 A - B - C   <-- feat
               /
...- o - o - * - o - x       <-- origin/devel
副本对其父节点的更改与原始副本对其自己的父节点的更改相同。也就是说,无论您在
*
A
之间做了什么,git都会尝试对
x
进行相同的更改,以得到
A'
。然后,无论您在
A
B
之间做了什么,git都会尝试对
A'
执行相同的操作以获得
B'
,依此类推

当git不能自动完成这些任务时,