1

我想我只是在 git 中遗漏了一些重要的点。我将 PhpStorm IDE 用于开发过程,并将 GIT 用作 VCS。每次我从一个开发人员分支中提取更改时,我都会得到其他开发人员的提交列表,这是完全正常的。但是当我推送更改时,我不仅推送本地提交的提交,还推送通过拉取检索的提交。

但是为什么会这样呢?为什么其他开发人员提交在我的推送中?我虽然只要 GIT 将这些开发人员的提交存储在远程分支上,它们就已经被推送了。我错过了什么吗?

GIT 命令(根据 IDE 历史记录):

git pull --no-stat -v --progress origin trunk

git push origin trunk:trunk

GIT 版本:1.7.4.4,操作系统:Mac OS X 10.7

4

2 回答 2

3

正如 Vonc 所说,当你运行时git pull origin trunk,git 首先运行一个 fetch( git fetch origin trunk),它从远程“origin”获取分支“trunk”,并将其存储在 FETCH_HEAD 中。

请注意,这可能是意外行为,并且是不git-pull使用and的“4 参数”形式的一个很好的理由git-fetch

无论如何,在运行 fetch 之后,git 运行git merge FETCH_HEAD. 这将获取新获取的远程分支,并将其合并到本地分支中。您刚刚将您的本地分支和来自 'origin' 的 'trunk' 分支合并在一起。

如果您无法对此进行可视化,请尝试运行gitkgit log --graph --oneline --decorate以图形方式查看历史记录。您应该能够看到两条历史记录(您的和远程的)合并在一起。git log,没有--graphor--first-parent等​​,将显示从当前分支可到达的所有提交,但不会区分它们实际位于哪个分支。

不出所料,当你运行git 时git push,git 会获取这个合并的历史,并推送它。

您可能打算运行git fetchgit fetch origin而不是git pull origin trunk. 这将从“origin”获取更新的分支,并将它们存储在您的远程跟踪分支中(例如“origin/trunk”)。然后,您可以使用例如检查它git log origin/trunk。如果您想将 'origin/trunk' 合并到您的本地分支中,请使用git merge origin/trunk.

于 2012-07-09T23:16:45.017 回答
1

如果您真的在拉动更改 ( git pull),您将在当前分支中获取并合并它们。

如果您在 push 时看到所有其他开发人员提交,那可能是因为您的 pull 配置为先执行 rebase ( git pull --rebase)。
检查配置设置branch.autosetuprebasebranch.<name>.rebase.

于 2012-07-02T07:19:18.467 回答