Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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 - Fatal编程技术网

Git 如何撤消从要素分支提交到主线的更改,但使分支保持最新?

Git 如何撤消从要素分支提交到主线的更改,但使分支保持最新?,git,Git,我们有时会遇到一些问题,在这些问题中,我们会将一个特性分支提交到基线,并发现在某些情况下它可能会出现严重错误,因此需要恢复更改,而不会丢失自那时以来完成的所有其他提交。但是,需要有人继续处理原始分支 我不想在主线上使用git-rebase来更改历史记录(因为这本身会导致各种问题),但是当我在主线上执行git-revert时,只要分支上运行git-merge,以获取对系统所做的任何其他更改,那么所有完成的工作都会消失 如何保持分支上的更改完好无损?您是否尝试过在功能分支上执行git revert,

我们有时会遇到一些问题,在这些问题中,我们会将一个特性分支提交到基线,并发现在某些情况下它可能会出现严重错误,因此需要恢复更改,而不会丢失自那时以来完成的所有其他提交。但是,需要有人继续处理原始分支

我不想在主线上使用
git-rebase
来更改历史记录(因为这本身会导致各种问题),但是当我在主线上执行
git-revert
时,只要分支上运行
git-merge
,以获取对系统所做的任何其他更改,那么所有完成的工作都会消失


如何保持分支上的更改完好无损?

您是否尝试过在功能分支上执行
git revert
,然后将其合并回master


这样基线保持不变,您可以继续处理您的功能分支。

我假设您不想进行任何回退和重置,这是仅合并的方法

假设您有两个分支
master
feature
。 因此,您决定将该功能合并到
主控

$ git merge feature
* commit 838f29fda2333bdbfc0d1be44d2387e6119dc4e8
| 
|     f3
|    
| * commit 58d1e3f0e032cc77d4ab2bbf0bdfe6407b96b7e6
| | 
| |     m3
| |     
| *   commit afb600fe382befe095f9b8a6e9eef98be25c929b
| |\  Merge: 5cddc52 8660a59
| |/  
|/|   
| |       Merge branch 'feature'
| |   
* | commit 8660a59eeb13f9b3447846ba6977140f7c86c7a4
| | 
| |     f2
| |   
* | commit 6f76e2288d69808b97981340198fd8044ab47630
| | 
| |     f1
| |   
| * commit 5cddc528de424a01d1d18552ddea93435618e2f7
| | 
| |     m2
| |   
| * commit fa6ebb76f9f0308f7dcd1148503534668fa15358
|/  
|   
|       m1
|  
* commit 4e3aa05d6f46eb14bbbc253a42325e9a53a3393e
现在,您的
功能
已全部更改到主机上。我假设最困难的情况是,在合并两个分支后都会进行提交。但是,您突然发现
功能的任何功能都不起作用,所有功能都已损坏并决定恢复。您的历史记录是(您可以通过
git log--graph feature master
查看):

请注意合并后提交的f3和m3。因此,您只需小心地删除出现在
master
中的
功能
中的更改

为此,您可以在
主机上恢复合并提交,保持主机的基础(参数
-m1
)。为了实现这一点,我基于合并点创建了一个新分支,并在其中恢复:

$ git checkout -b feature-revert afb600fe
$ git revert -m1 HEAD
现在,我们在分支
功能revert
上恢复了更改。现在很简单,只需通过合并将其放入master即可:

$ git checkout master
$ git merge feature-revert
因此,目前
主机
没有任何
功能
。但是,如果以后要重新合并该功能,所有已还原的更改将在主控中丢失,因为它们已合并并还原

要解决此问题,您应还原还原(he he)并将其合并回
功能

$ git checkout feature-revert
$ git revert HEAD
$ git checkout feature
$ git merge feature-revert
我想我们不再需要分支了,因为我们已经合并了它,但如果您愿意,您可以保留它:

$ git branch -d feature-revert
您应该知道,将其合并回来会将所有更改从
master
带入
feature
,这通常是正常的工作流


现在,在
feature
中进行修复后,您可以像往常一样随时将其重新合并到
master
中。

当您
git revert
更改时,它会创建一个新的提交,其树中没有这些更改

虽然没有删除更改,但它们的原始提交仍然存在

所以,只要:

  • git revert
    master上的合并提交(记住选择正确的父级)。现在,master没有从您的特性分支引入损坏的代码
  • 修复功能分支
  • 在主机上还原第一次还原。这将在您最初合并功能时重新引入该功能的断开状态
  • 合并功能分支修复
有关更多详细信息,请参阅(或本地git文档中的相同文件,如果已安装)

您的历史最终看起来像:

 --- a -- ... -- Mi ... ~Mi ... ~~Mi -- Mx  [master]
      \         /                      /
       f1 ... fi -- fj ........ x -- fx     [feature]

其中,
Mi
是来自功能分支的原始合并,
~Mi
是当您注意到问题时的恢复,
fj。。fx
是对功能分支的后续修复,
~~Mi
是对
~Mi
的恢复,等等。

如果这样做,我将如何保留更改?这难道不会消除这些变化吗?如果我立即恢复了恢复,后续的合并会起作用还是会再次删除更改?这是您要恢复的合并提交吗?如果是这样的话,看看啊,我看到问题了,你正在把主线并入你的分支。我想我上面提供的链接可以帮你。您只需在您的分支上“还原还原”。好的,这里提到的一些东西看起来很有用,但是一旦我还原了主版本,我就无法将主版本合并回功能分支,这是我需要做的。是的,你可以,只是先还原还原。这是上面项目符号列表中的第三点,在图中表示为
~~Mi
(在下面的段落中进行了描述),并显示在链接文档中Linus的引用下方。难道不能根据链接文档,通过
git rebase--no ff a
重新创建分支吗,其中a是分支点?是,这也行。问题是,除了bug修复之外,功能分支(
fj..fx
)上是否仍在进行新的工作还不清楚,而在人们处理分支时重新设置分支的基址是一件坏事。