git pull --rebase 和 git rebase:哪个更危险?

74

我不理解git pull --rebasegit rebase的区别,且不含其他选项。

我不清楚它们是否安全,是否是良好的实践或者非常危险的。

如果在本地执行git pull --rebase会破坏提交历史吗?


https://dev59.com/fmMk5IYBdhLWcg3w0hM- - ashishmohite
6
git rebase 不会先运行 fetch - choroba
3个回答

44

我不建议在公共分支上进行变基,只建议在私有分支上进行。通过“私有”,我指的是你相当确定只有你自己拉取了这些分支。

变基会将分支的起始点更改为某个更新的提交,从而合并到该点的所有提交。这可能会导致那些在其存储库中具有旧分支基础的人遇到合并冲突。我建议始终使用普通合并,并仅在某些情况下(例如特性分支)才使用变基。

关于你的问题:

  • git rebase 会对你想要的分支进行变基。
  • git pull --rebase 在你拉取的分支中执行获取+变基操作。通常,pull 将执行获取+合并操作。

2
那么,执行 git pull --rebase 是安全的吗? - sab
安全是指哪方面?变基会改变起点,一个与另一个之间的区别在于git pull --rebase会进行大规模的变基。我不建议在共享分支中进行变基,因此也不建议使用git pull --rebase。请改用简单的git pull。 - Luis
2
git pull的帮助文档在--rebase选项下提到:“当为true时,在获取后将当前分支变基于上游分支。如果有一个对应于上游分支的远程跟踪分支,并且自上次获取以来上游分支已经被变基,则变基使用该信息以避免变基非本地更改。”如果您运行git fetch,然后运行git rebase,据我所见,您不会将远程更改合并到您的分支中。但是,使用git pull --rebase可以实现这一点。 - dnuttle
不太清楚。fetch 有什么特别之处吗?为什么要这样区分呢? - Green
在这种情况下,“git rebase...”和“git fetch ...; git rebase...”之间有什么区别?@everton的答案有所澄清:https://dev59.com/cFoT5IYBdhLWcg3w6i63#38077401 - iJames

32

git pull --rebasegit fetch和简单的git rebase的缩写,与默认的git merge相反。实际上的区别在于,仅应用后者不会获取来自远程的任何新提交,然后将您的代码重新基于其之上,因为它仅考虑本地存储库已经知道的内容。

值得一提的是,合并冲突会以与常规git pull相同的方式出现。


1
从我所看到的,git pull --rebase比git fetch和git rebase更胜一筹。那两个都不会将远程上的任何更改合并,但是git pull --rebase会。因此,如果您执行git pull --rebase master,则主分支远程上的所有更改都将合并到您的分支中,但您本地的主分支将不会被触及。 - dnuttle
运行 git pull --rebase 会导致 post-merge 钩子执行。 运行 git fetch 然后再运行 git rebase 不会执行 post-merge 钩子。 因此,前者不是后者的简写。 我仍在尝试理解这两种方法之间是否存在其他差异。无论是意外的还是语义上的。 - Noam Gal
3
好的,这篇文章解释了pull --rebasefetch + rebase之间的一些区别-https://gitolite.com/git-pull--rebase - Noam Gal
gitolite.com/git-pull--rebase解释了一切,当在功能/私有分支上工作以合并/变基(所谓的公共/受保护的分支)时,git pull --rebase是首选。 - mochadwi

0
试图更好地解释git pull --rebasegit rebase之间的区别,结合了@noam-gal和@dnuttle的评论。
简单情况:如果上游的历史没有被重写,git pull --rebase就是git fetch+git rebase
高级情况:如果上游的历史被重写(例如由于重新基于或修改已经推送的提交),git pull --rebase就是git fetch+在远程分支上对本地更改进行变基(即git rebase --onto <default_remote>/<current_branch> a <current_branch>,其中a是最近的上游提交,是您本地当前分支的父提交)。这种方法的优点是,更改的上游提交不会与旧版本的这些提交产生冲突。
参考资料

当设置为true时,在获取后将当前分支变基到上游分支之上。如果存在与上游分支对应的远程跟踪分支,并且自上次获取以来上游分支已经进行了变基操作,则变基会利用该信息避免变基非本地更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接