git回滚用例
我是git的新手 我以git回滚用例,git,rollback,Git,Rollback,我是git的新手 我以的方式实现了一个特性 我想尝试以B方式实现相同的功能 然后我可能需要一些时间来评估B方式是否是个好主意。 在评估它时,我将修改程序的其他部分 假设,我决定B不好,A更好,并想回到A方法 但是我想保留对程序的其他部分的修改 这可以用git实现吗 -编辑- 我正在添加图片,以便更好地解释我试图实现的目标 目前,我已经走到了尽头(完成了a的实现),除了我不知道X在哪里 [a_way] o---X---a---a---a 我想试试你的方法。 从我
的方式实现了一个特性
我想尝试以B方式实现相同的功能
然后我可能需要一些时间来评估B方式是否是个好主意。
在评估它时,我将修改程序的其他部分
假设,我决定B不好,A更好
,并想回到A方法
但是我想保留对程序的其他部分的修改
这可以用git实现吗
-编辑-
我正在添加图片,以便更好地解释我试图实现的目标
目前,我已经走到了尽头(完成了a的实现),除了我不知道X在哪里
[a_way]
o---X---a---a---a
我想试试你的方法。
从我所在的位置开始,删除(或注释掉)与a_方式相关的代码,并实现b_方式
o---X---a---a---a
\
remove a_way--implement b_way
我需要一些时间来评估b_way的有效性,并将继续开发其他功能
o---X---a---a---a
\
remove a_way--implement b_way--develop new features
现在我觉得a_路比b_路好,决定回到a_路
o---X---a---a---a--------------------------------new features(I wanna end up here)
\
remove a_way--implement b_way--new features
听起来你很想重新定基调
在git中实现这一点的一种方法是有两个分支a\u-way
和b\u-way
当你完成了这两种方法的构建后,你会有一棵像这样的树
[a_way]
o---X---a---a---a
\
-b---b---b
[b_way]
其中,a
是实现方法的承诺,b
是实现方法b的承诺
现在假设您将分支名称更改为development
,一旦一个方法完成,您就可以离开一段时间。您的树将如下所示:
[a_way]
o---X---a---a---a---d1---d2---d3---d4 [develop]
\
-b---b---b
[b_way]
[a_way]
o---X a---a---a
\ /
-b---b---b---d1---d2---d3---d4 [develop]
[b_way]
[a_way]
o---X a---a---a
\ / \
b---b---b d1'---d2'---d3'---d4' [develop]
[b_way]
o---X---a---a---a [a_way]
\
da---da---da---b---b---b---f---f---f [develop]
[remove_a] [b_way]
现在,您决定放弃a_方式
,转而选择b_方式
git rebase --onto b_way a_way develop
将给我:
[a_way]
o---X---a---a---a
\
-b---b---b---d1'---d2'---d3'---d4' [develop]
[b_way]
注意:如果develope中有合并,这将使合并变得平坦,我怀疑有一种方法可以保留合并,但我还不需要它。它还将导致提交ID发生更改,如果有其他人基于此工作,则可能会导致问题
附录
听起来您的存储库是这样的:
[a_way]
o---X---a---a---a---d1---d2---d3---d4 [develop]
\
-b---b---b
[b_way]
[a_way]
o---X a---a---a
\ /
-b---b---b---d1---d2---d3---d4 [develop]
[b_way]
[a_way]
o---X a---a---a
\ / \
b---b---b d1'---d2'---d3'---d4' [develop]
[b_way]
o---X---a---a---a [a_way]
\
da---da---da---b---b---b---f---f---f [develop]
[remove_a] [b_way]
如果您希望它以这样的方式结束:
[a_way]
o---X---a---a---a---d1---d2---d3---d4 [develop]
\
-b---b---b
[b_way]
[a_way]
o---X a---a---a
\ /
-b---b---b---d1---d2---d3---d4 [develop]
[b_way]
[a_way]
o---X a---a---a
\ / \
b---b---b d1'---d2'---d3'---d4' [develop]
[b_way]
o---X---a---a---a [a_way]
\
da---da---da---b---b---b---f---f---f [develop]
[remove_a] [b_way]
那么你要发出的命令是
git rebase --onto a_way b_way develop
或者在这种情况下,可以简化为
git checkout develop
git rebase a_way
附录
所以你的回答实际上是这样的:
[a_way]
o---X---a---a---a---d1---d2---d3---d4 [develop]
\
-b---b---b
[b_way]
[a_way]
o---X a---a---a
\ /
-b---b---b---d1---d2---d3---d4 [develop]
[b_way]
[a_way]
o---X a---a---a
\ / \
b---b---b d1'---d2'---d3'---d4' [develop]
[b_way]
o---X---a---a---a [a_way]
\
da---da---da---b---b---b---f---f---f [develop]
[remove_a] [b_way]
你想去吗
o---X---a---a---a---f---f---f [develop]
\
da---da---da---b---b---b
执行此操作的命令是
git rebase --onto a_way b_way develop
如果在所需位置没有分支,可以使用commit SHAs
git rebase --onto a_way
您将在不同的分支中拥有A
和B
,比如A
和B
。一旦决定保留A
,您将把它合并回开发分支(通常是master
,或develope
)
然后你就可以去掉A
和B
git branch -d `A`
git branch -D `B`
由于B
未合并到您的开发分支中,并且更改将丢失,因此您必须使用大写的D
强制删除
和其他部分
?他们可能已经在我们的开发部门(如所说的master
,或者develope
,或者其他什么),并且即使您将A
合并到中,他们也会留在那里。您曾经提交过吗?
否则,git stash
可能会显示您在上次提交后所做的操作,然后您可以尝试另一种方法。当您想要更改时,只需使用git stash apply
这是与上面不同的另一种方式,但我确实认为使用分支要好得多,因为您是git新手,了解这一点非常重要:-)细节取决于您是否在单独的分支中使用了A
和B
。我已经在A的末尾了。很好的图片描述。(尽管A和B从我的问题切换过来)我明白这个概念。让我澄清一件事。我在主分支上。(在你回答的b_路的末尾)。现在,我正在创建一个分支,以一种新的方式进行开发。因此,a_方式将在b_方式的末尾分支(与从公共父级分支相反)。我认为这会影响我可以采取的总体战略?第二个问题:[a_way]和[develop]在第二张图片中似乎与特定节点相关。我的解释正确吗?[branch_name]是否可以与git历史记录中的特定节点关联?@Eugene in git a branch只是对提交的引用,该提交是该分支上当前最新的提交。因此,分支名称始终可以解析为提交(但随着时间的推移不一定是同一个),但您无法确定提交源自哪个分支。我试图在从d1
到d1'
的更改中显示的是,提交SHA将在重基时更改,但是每次提交的内容基本上应该保持不变(除了冲突和检测已经应用的更改)。请看一看。