【问题标题】:Why does "git pull origin master" command removes the most recent merge commit?为什么“git pull origin master”命令会删除最近的合并提交?
【发布时间】:2020-08-23 14:01:15
【问题描述】:

我发现当我尝试“git pull origin master”命令时,有时最近的提交会被删除。当我将本地分支合并到主分支,然后从远程源拉取时,就会发生这种情况。

首先,我创建了一个带有首次提交的 git 存储库。当前本地 HEAD 和 origin/master 指向第一次提交(最新)。

$ git log --oneline --all --graph --decorate
* d42ad4e (HEAD -> master, origin/master) First commit

然后我创建了一个分支(分支名称“test”),进行了简单的更改和提交,并合并到了 master。 之后,提交历史如下所示。

$ git log --oneline --all --graph --decorate
*   ea13eb8 (HEAD -> master) Merge branch 'test'
|\
| * 9d3969f (test) test
|/
* d42ad4e (origin/master) First commit

如您所见,9d3969f 是我在 test 分支上所做的提交,而 ea13eb8 是通过“git merge test”命令创建的。

那么如果我使用“git pull origin master”命令,

$ git pull origin master
From https://github.com/????/????
 * branch            master     -> FETCH_HEAD
Successfully rebased and updated refs/heads/master.
$ git log --oneline --all --graph --decorate
* 9d3969f (HEAD -> master, test) test
* d42ad4e (origin/master) First commit

按我的意愿应用了更改,但现在删除了提交 ea13eb8。我只是好奇当我从远程源拉取时,最近一次提交会发生什么。

【问题讨论】:

  • 另一个说明为什么 git pull 不好。
  • True Merge部分git-scm.com/docs/git-merge
  • @matt git pull 最终使用 git merge 作为快进。它只是从远程获取更改并在同一分支上应用git merge 命令。这还不错,这是获取本地分支更改的正常方式。
  • @Akshay 我不同意。
  • @matt 是的,最好的方式是变基。 git merge 创建新的提交来理解图。但这并不意味着git pull 是不好的方式。

标签: git


【解决方案1】:

您从 Git 获得的反馈可能部分揭示了这里发生的情况:

成功地重新定位和更新了 refs/heads/master。

看来您的拉取策略是使用变基,而不是简单的合并。结果,当您git pull 时,正在发生变基,它可以重写历史记录并在提交中移动。检查.gitconfig 文件中是否有类似以下内容的条目:

[branch]
  autosetuprebase = always

您还可以运行以下命令来检查您的 Git 配置:

git config --list

如果您想要当前的行为,那么也许是时候更改您的设置了。或者,您可以使用以下方式通过合并策略显式拉取:

# from master
git fetch origin
git merge origin/master

【讨论】:

    【解决方案2】:

    您似乎使用git pull 使用rebase

    请参考git rebase has empty commit behaviour

    默认情况下,git 具有 git merge 行为,它添加了合并提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 2016-04-08
      • 2020-07-27
      • 2012-01-31
      • 2014-01-21
      • 2012-06-17
      • 2021-06-12
      相关资源
      最近更新 更多