我的本地分支有两次提交。一个是小的提交,其中一个文件已更改。另一个是合并,其中许多文件已更改。我想撤消两个提交,最后以分支历史中的第三个提交结束。
这是我尝试过的:
begin-procedure Run-Recursion
let #_Global_Counter = 0
let $Recursive_Line = ''
let $Data_Line_EMPL = ''
let $Data_Line_EMPL = $_BUSINESS_UNIT || '|' || $_BUSINESS_UNIT_DESCR || '|' || '2019' || '|' ||
$_EMPLID || '|' || $_NAME || '|' || $_DEPTID || '|' || $_DEPT_DECSR || '|' || $_JOBCODE || '|'
do Get-Recursive-Reports-To($Recursive_Line, $_POSITION_NBR, #_Global_Counter)
let $Data_Line_EMPL = $Data_Line_EMPL || $Recursive_Line
do Write-Data-Line($Data_Line_EMPL)
end-procedure
begin-procedure Get-Recursive-Reports-To(:$val_Data_Line, $val_Current_Position_Nbr, #Recursion_Counter)
let #Recursion_Counter = #Recursion_Counter + 1
do Get-the-ReportsTo-for-the-Current-Position($val_Current_Position_Nbr, $Next_Position_Nbr, $Next_EMPLID)
do Check-For-Stop($Stop_Recursion, $val_Current_Position_Nbr, $Next_Position_Nbr, #Recursion_Counter)
if $Stop_Recursion = 'N'
let $val_Data_Line = $val_Data_Line || $Next_EMPLID || '|'
do Get-Recursive-Reports-To($val_Data_Line, $Next_Position_Nbr, #Recursion_Counter)
end-if
end-procedure
begin-procedure Get-the-ReportsTo-for-the-Current-Position($_val_Position_NBR, :$var_ReportsTo, :$var_Next_EMPLID)
let #local_counter = 0
begin-select
G.REPORTS_TO &G.Reports_to
let $var_ReportsTo= &G.Reports_To
from PS_POSITION_DATA G
WHERE G.POSITION_NBR = $_val_Position_NBR
and G.EFF_STATUS = 'A'
AND (G.EFFDT =
(SELECT MAX(G_ED.EFFDT) FROM PS_POSITION_DATA G_ED
WHERE G.POSITION_NBR = G_ED.POSITION_NBR
AND G_ED.EFFDT <= $_As_OF_Date))
end-select
begin-select
H.EMPLID &H.EMPLID
Z.NAME &Z.NAME
let $var_Next_EMPLID= &H.EMPLID
let #local_counter = #local_counter + 1
from PS_JOB H !, PS_EMPLOYEES Z
WHERE H.POSITION_NBR = $var_ReportsTo
and H.EMPL_STATUS not in ('D', 'R', 'T')
and (H.EFFDT =
(SELECT MAX(H_ED.EFFDT) FROM PS_JOB H_ED
WHERE H.EMPLID = H_ED.EMPLID
AND H.EMPL_RCD = H_ED.EMPL_RCD
AND H_ED.EFFDT <= $_As_Of_Date))
end-select
if #local_counter > 1
let $var_Next_EMPLID = $local_counter || ' ' || 'Employees in this Position'
end-if
if #local_counter = 0
let $var_Next_EMPLID = 'Position Vacant'
end-if
end-procedure
返回1次提交。当我再次运行它时,预期的行为是再返回一次提交。但是,当最后一次提交是合并操作时运行此命令时,似乎也撤消了最后〜10次提交。为什么是这样?有没有一种方法可以撤消合并提交而又不涉及任何其他提交?
答案 0 :(得分:1)
如果您运行:
git log --graph --oneline -n 14
您的日志看起来像这样吗?
* xxxxx The top commit
* xxxxx merge commit
|\
| * aaaaa
| * bbbbb
| * ccccc
| * ddddd
| * eeeee
| * fffff
| * 11111
| * 22222
| * 33333
| * 44444
|/
* yyyyyy The commit where you ended up after the 2nd `reset`
如果是这样,如果我理解得很好,您希望您的分支以aaaaaa
结尾,是吗?
在这种情况下,您可以执行以下操作:
git reset --hard aaaaa
您的分支将包含10个提交
答案 1 :(得分:0)
要返回提交并取消对更改的取消操作,请删除--hard
。 git reset <sha_of_parent>
要获取以前的更改,请回到git reflog
。
答案 2 :(得分:0)
git revert SHA
允许您重置提交。 SHA指定要还原的提交。
答案 3 :(得分:0)
<someCommit>^
表示将someCommit
的第一个父对象混入,这对于“正常”(即非合并)提交意味着 the 父提交。
但是,当HEAD
指向合并提交时,您必须指定要返回的两个父母中的哪个。
A B
\ /
\ /
C <<< HEAD (merge commit)
HEAD
是指C HEAD^
和HEAD^1
指的是A HEAD^2
是指B 文档(git help rev-parse)定义了<rev>^
的含义。
答案 4 :(得分:0)
我最终做了以下事情:
git reset --hard abcdef
abcdef
是合并之前的提交哈希。