答案 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
提交消息中添加内容。
但是,如果您要清除这些重要信息...
这有效地撤消了合并。
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...
功能分支在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,例如,设置提交的确切顺序。
请注意,这会更改历史记录。通常,您不应更改已发布提交的历史记录,因为这可能会使其他用户头痛。