Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git回滚用例_Git_Rollback - Fatal编程技术网

git回滚用例

git回滚用例,git,rollback,Git,Rollback,我是git的新手 我以的方式实现了一个特性 我想尝试以B方式实现相同的功能 然后我可能需要一些时间来评估B方式是否是个好主意。 在评估它时,我将修改程序的其他部分 假设,我决定B不好,A更好,并想回到A方法 但是我想保留对程序的其他部分的修改 这可以用git实现吗 -编辑- 我正在添加图片,以便更好地解释我试图实现的目标 目前,我已经走到了尽头(完成了a的实现),除了我不知道X在哪里 [a_way] o---X---a---a---a 我想试试你的方法。 从我

我是git的新手

我以
的方式实现了一个特性

我想尝试以
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将在重基时更改,但是每次提交的内容基本上应该保持不变(除了冲突和检测已经应用的更改)。请看一看。