想象一下你现在的情况:
- A - B - C - D
\ ^
- X - Y master
^
branch1
运行git checkout branch1; git rebase master
将从branch1移动提交,以便将它们应用到主分支之上:
master
v
- A - B - C - D
\
- X - Y
^
branch1
这不会改变master,但它会以两种方式改变branch1 :
- 通过将提交的父级
X
从更改A
为D
您将更改提交的 ID X
,事实上,就 Git 而言,它现在是一个全新的提交(并且由于X
有一个新的 ID,Y
有一个新的父级,所以Y
也有一个新的 ID ,如果分支上有更多提交,依此类推)。
- 您需要做的任何冲突解决都会改变提交的内容。
如果您已经将branch1推送到远程存储库,那么重新设置它是一个非常糟糕的主意;改变已经共享的历史只会导致问题。
假设你没有推送branch1,你可以将它合并到master(with git checkout master; git merge branch1
),这将导致master被快进到 commit Y
。这为您提供了整洁的线性历史,而无需更改master:
- A - B - C - D - X - Y
^
branch1 AND master
如果您已经推送了branch1,那么您应该避免变基并改用合并(使用git checkout master; git merge branch1
),这不会更改它们中的任何一个的历史记录,但会M
在主分支上创建一个新的提交(在此图中标记):
- A - B - C - D - M
\ / ^
- X - Y - - master
^
branch1