假设我在存储库中进行了一些更改,后来发现我必须恢复到以前的提交状态,但与此同时,其他一些人也在我提交后对存储库进行了更改。
我想还原自己在这段时间内所做的更改,但不还原在同一存储库中工作的其他人所做的更改。在git中有可能吗?
更具体地说,如果在过去3天中,我进行了3次提交:
c1
c2
c3
在同一时间段内,另一位工作人员也进行了2次提交:
c4
c5
我有2个问题:
答案 0 :(得分:1)
单词 revert 在git中具有特定含义。这意味着创建一个与另一个提交相反的提交。
返回历史记录中的上一次提交称为重置。
关于还原,如果您现在有序列:
c1
c2
c3
c4
c5
,然后还原前三个提交(使用git revert
),以相反的顺序更好,最后得到:
c1
c2
c3
c4
c5
-c3
-c2
-c1
这应该差不多等于c4
和c5
的工作,但要保留整个故事。
如果您想真正删除您的提交,则必须重写分支。 rebase
和push --force
的一般警告适用(即不建议共享)。有几种方法可以做到这一点。最简单的方法可能是执行git rebase --interactive c1^
并删除有问题的提交。然后push -f
,并确保团队中的每个人都已正确同步。
答案 1 :(得分:1)
git revert
可以简单地反转指定提交中的补丁。如果不能完全应用反向补丁,则git将为您提供解决冲突的机会,类似于merge
或rebase
产生冲突时。
答案 2 :(得分:1)
由于您在Git中描述称为“分支重置”的过程时使用了“还原”一词,因此不清楚要达到的目标。
如果您通过说git revert C1
来还原一个提交(例如C1),则其他提交(C2,C3 ...)将不会受到影响,因为只有该更改将被“不应用”。 Git将为您创建一个“反提交”(我们将其称为C6)。但是,如果要将分支重置为C1(git reset C1
),则将有效地丢弃C2..C5。但是,它们将一直存在,直到Git稍后将其垃圾回收(您可以使用git reflog
查找分支所指向的先前提交来还原它们)。