创建分支与执行软重置之间的区别?返回到旧的工作版本的最佳方法?

时间:2019-03-24 09:53:04

标签: git git-branch git-reset

说我提交的历史是A-B-C,我只有这个分支。

B完全正常工作。我开始在C语言中添加一些功能,但无法正常工作,因此我需要回到B语言,但是我也想保留用C语言编写的代码,因为我想对其进行检查并修复它。后来。 最好的方法是什么?

从B开始创建新分支的最佳方法是吗?

那与进行软重置有什么区别?我知道软重置不会删除更改(正确吗?),但是我不清楚如何恢复这些更改(C中的代码),也不清楚软重置和创建分支之间的区别是什么。 / p>

在旁边

Git看起来似乎毫无必要地神秘而晦涩。我的意思是,官方文档将push定义为:

  

https://git-scm.com/docs/git-push

     

git-push-更新远程引用以及关联的对象

我确信从技术上讲它是正确的,但这并不是最人性化的解释。他们是否可以添加一条注释来解释它将本地存储库上传到远程存储库,还是类似的东西?

3 个答案:

答案 0 :(得分:1)

如果要将提交C保留为提交并再次从B开始工作,则需要一个新的分支。 我建议做一个从C的新分支,并将master(或您主要工作的分支)硬重置为B

然后您将剩下这个(为了清楚起见,我添加了一个新提交):

D      master
| C    review-c branch
|/
B
|
A

软重置为B会删除提交C并暂存您在C中所做的更改(就像您自己为C所做的更改一样,并且做了其中git add个。

答案 1 :(得分:1)

<rant-adressing on>

您已经唤醒the Ancients。非常害怕。

<rant-adressing off>

;-)


对于眼前的问题,如果您想保留C的更改以供以后使用,但又希望从B状态继续进行,这更好,那么您可以通过多种方法来实现。我会新建一个分支*,然后重置旧分支。

分支创建/硬重置方法

# create your backup branch for these failed changes
git checkout -b to-be-reviewed

# take your branch to its previous state
git checkout -
git reset --hard HEAD^

但是您也可以考虑使用git reset --soft。如果您想比较用途,请按以下步骤进行操作:

分支创建/软重置方法

# undo last commit (C) but keep the changes in the working tree
git reset --soft HEAD^

# create a new branch and commit on it
git checkout -b to-be-reviewed
git commit -m "Your message"

然后,您在B和to-be-reviewed上的原始分支点将具有所有最近(尽管无效)的更改。


最后,这是git stash的用例:

没有新的分支/隐藏方法

# reset your branch to state B
git reset --soft HEAD^

# stash your changes with a title for easier reuse
git stash save "Failed changes XYZ"

此时,您以后可以使用git stash list / git stash show检查此存储。

* (就像ElpieKay suggests一样,在这种情况下,可以考虑使用标签代替分支。总而言之,重置时的推理是相同的)

答案 2 :(得分:1)

对于您的情况,我建议1)在C上创建分支或标记,以便您可以在需要时对其进行查看,以及2)将分支重置为B,以便C的更改将从分支中排除。

# create a branch from C
git branch foo C

# create a tag at C
git branch bar C

# reset your branch to B
git checkout <your_branch>
git reset B --hard

# review C
git show foo
git show bar

在某种程度上,标签比分支更稳定。 foo可能由于偶然的命令而移至另一个提交。 bar始终指向C,除非您打算将其移至另一提交。 bar被视为C的别名。