我可以使用git pull --rebase代替"git stash git pull git stash pop"吗?

16

什么是两者之间的区别?

git pull --rebase
git stash
git pull
git stash pop
5个回答

10

我建议您创建一个实验性的仓库并尝试这些命令。自己尝试可以使学习更加容易。

您会注意到命令序列 git stash; git pull; git stash pop 会将未提交的更改移动到主分支更新后的头部。(它还会执行普通合并,因此假定默认的 gitconfig,提交的更改将被合并而不是变基)

然而,git pull -rebase 会将已经提交的更改移动到主分支更新后的头部。如果您尝试在有脏工作树的情况下运行此命令,则会看到错误消息:

Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

我仍然不明白的是,有些文件没有被隐藏起来,我发现自己不得不手动将它们移出项目,进行变基、取消隐藏,然后再将这些文件移回去。 - medmek
1
@medmek 你知道 git stash --include-untracked 吗? - Nicolai Weitkemper

6

4
在主题中回答你的问题的简单答案是“不”。 git pull --rebasegit pull之间的区别在于,前者执行fetch + rebase,后者执行fetch + merge,除非您有一个非默认的git配置告诉git pull执行rebase而不是合并。在这种情况下,这两个命令将是相同的。
这两个命令之间的差异不会以任何方式影响需要存储和取消存储未提交更改的需求。如果您的工作树处于脏状态,则两者都需要进行此操作,否则它们将出错,并告诉您提交或存储更改。

2

我知道这是一篇一年前的帖子,但是...

git pull --rebase

~ vs ~

git stash /git pull /git stash pop

git pull --rebase 是两者之间的一种混合方式。它将允许您保留自己的提交,并从中央仓库拉取最近提交(推送)的文件。有点像时间旅行,伙计...爆炸声

但是为了回答这个问题.... Git stash 保留未提交的更改,然后在拉取完成后将其放回。

所以 - 如果你还没有完全完成某件事,但需要中央仓库中最新的文件,你应该:

git stash git pull git stash pop

然而,假设你已经完成了某件事,并进行了提交 - 但是你的同事Timmy从来不告诉任何人东西,他提交了文件并将它们推送到主(中央)仓库,那么你应该先获取他的文件,然后添加你的提交到堆栈中,并推送它们..

如果您已经进行了提交,但尚未将更改推送到主(中央)仓库,并且必须获取中央仓库中的新文件,因为另一个开发人员已经提交并推送了他们的文件 - 您将使用:

git pull --rebase

就像当你做汉堡时,忘记尝试你的朋友想让你尝试的自制奶酪一样,于是他拿着你的奶酪片来了,你不得不把上面的面包卷下来涂上这个奶酪,然后再把面包卷回去 - 奶酪汉堡。


-2

git pull:实际上你正在发出git fetch + git merge命令,这将在你的提交日志中产生额外的提交和难看的合并气泡。

git pull --rebase:为了保持代码库的清洁,你的提交始终在树的顶部,直到你将它们推送到远程服务器。该命令将所有尚未推送的提交应用于远程树提交的顶部,使您的提交成为一行直线而没有分支。


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