当提交已经合并时,将提交重新绑定到主服务器上

时间:2019-10-05 14:50:00

标签: git github

enter image description here

现在我想要“公共重新编译”。和“要求package.json需要兼容的软件包”位于单个时间轴a上,而不位于另一个时间轴上。所有本地或远程分支都已获得所有提交。我该怎么办

4 个答案:

答案 0 :(得分:1)

git checkout daf9f2d
git rebase e0d2740
# if this is what you want
git branch -f master
# push as needed

答案 1 :(得分:1)

  

因为我想要一个干净的历史记录,以便我可以共享代码。

请注意,您拥有的是“干净的” Git历史记录。像您一样的“功能泡泡”显示了哪些提交是一起完成的。这是用于确定为什么进行提交的其他有用信息。我建议保持原样。

您要避免的是“更新”合并,以便从主服务器获取最新更新。这些就是我所说的“簿记”合并。他们混淆了历史,对考古学没有用。

*   11067971 [master]
|\
| * d3adb3f merge master again
|/|
* | 1234567 another master commit
| * daf9f2d Require compatible...
| * abc1234 merge master
|/|
| * 3547419 Public recompile.
* | e0d2740 N/A
* | 6b2385f Apply Codestyles:
|/
* 08c6f59 Change vendor user...

相反,请使用git rebase进行更新,以使分支历史保持线性。

git checkout feature
git rebase master

 * daf9f2d [feature] Require compatible...
 * 3547419 Public recompile.
 * 1234567 [master] another master commit
 * e0d2740 N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...

然后git merge --no-ff(不快进)以保持功能泡。

git checkout master
git merge --no-ff feature
git branch -d feature

* abcd1234 [master] merge feature
|\
| * daf9f2d Require compatible...
| * 3547419 Public recompile.
|/
* 1234567 another master commit
* e0d2740 N/A
* 6b2385f Apply Codestyles:
* 08c6f59 Change vendor user...

因为合并没有执行任何操作,所以在合并之前测试分支时,还要在合并之后测试代码。现在,您只需对分支机构进行一次质量检查。

如果您想改善历史记录,请使用git rebase -i在这些N/A提交消息中添加内容。

但是,如果您要清除这些重要信息...


  • 在合并之前还原master和分支。

这有效地撤消了合并。

git branch -f master e0d2740
git branch -f feature daf9f2d

   * daf9f2d [feature] Require compatible...
   * 3547419 Public recompile.
 * | e0d2740 [master] N/A
 * | 6b2385f Apply Codestyles:
 |/
 * 08c6f59 Change vendor user...
  • 在主数据库上重新设置功能。<​​/ li>

功能分支在08c6f59之上完成,但是现在您将其放在e0d2740之上。可能有冲突。

git checkout feature
git rebase master

 * daf9f2d [feature] Require compatible...
 * 3547419 Public recompile.
 * e0d2740 [master] N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...
  • 功能的快速转发母版。

在直接祖先上进行合并将执行“快进”。不需要合并提交,Git只是将分支标签向前移动。

git checkout master
git merge feature

 * daf9f2d [feature][master]]Require compatible...
 * 3547419 Public recompile.
 * e0d2740 N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...
  • 删除功能
git branch -d feature

 * daf9f2d [master]]Require compatible...
 * 3547419 Public recompile.
 * e0d2740 N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...

答案 2 :(得分:0)

免责声明:如果不更改master的历史记录,您将无法做到这一点。

如果我理解正确,您想撤消合并,并将该分支的两次提交直接应用于master

请注意,有多种方法可以实现此目的。这是我要做的:

这是起点:

*   a86813e (HEAD -> master) Merge branch 'branch'<Philipe Fatio>
|\  
| * 0c96fc9 (branch) B2
| * ec8db76 B1
* | 791f2e2 M4
* | c8b2a58 M3
|/  
* fa16cb9 M2
* 20beb8a M1

首先,撤消master上的合并:

git checkout master
git reset --hard HEAD^

这给了我们这张图:

* 0c96fc9 (branch) B2
* ec8db76 B1
| * 791f2e2 (HEAD -> master) M4
| * c8b2a58 M3
|/  
* fa16cb9 M2
* 20beb8a M1

现在将分支机构重新置于master之上。似乎您不再有一个分支指向合并之前的最后一次提交,因此您必须检出该SHA。

git checkout branch
git rebase master

这给我们下面的图:

* b79074d (HEAD -> branch) B2
* 829f920 B1
* 791f2e2 (master) M4
* c8b2a58 M3
* fa16cb9 M2
* 20beb8a M1

现在,您可以使用快进(master)将分支合并到--ff中:

git checkout master
git merge --ff branch

这与将master重置为分支基本相同:

git checkout master
git reset --hard branch

我们的最终图形如下:

* b79074d (HEAD -> master, branch) B2
* 829f920 B1
* 791f2e2 M4
* c8b2a58 M3
* fa16cb9 M2
* 20beb8a M1

答案 3 :(得分:0)

最简单的方法是简单地使用rebase命令。默认情况下,变基会删除合并提交。在master分支中,并使用以下命令:

git rebase 08c6f59 #use the commit id of the latest commit you do not want to change.

这将为所有受影响的提交创建一行。如果您想要更多控制权,也可以使用git rebase --interactive,例如,设置提交的确切顺序。

请注意,这会更改历史记录。通常,您不应更改已发布提交的历史记录,因为这可能会使其他用户头痛。