为什么分支报告为未合并,尽管它已合并

Why branch reported as not merged despite on it is merged

我有分支,该分支的所有更改都在 master (HEAD) 中。但是 git diff master...feature/5492_new_currency 告诉我事实并非如此。我哪里错了?

$ git diff master...feature/5492_new_currency
diff --git a/app/locale/ru/LC_MESSAGES/lang.po b/app/locale/ru/LC_MESSAGES/lang.po
index 9274c9e..6b9d1ae 100644
--- a/app/locale/ru/LC_MESSAGES/lang.po
+++ b/app/locale/ru/LC_MESSAGES/lang.po
@@ -4531,6 +4531,10 @@ msgstr "$"
 msgid "currency:UZS"
 msgstr "сум."

+# Британский фунт
+msgid "currency:GBP"
+msgstr "£"
+
 msgid "datepicker:prevText"
 msgstr "Пред>"

diff --git a/app/protos/defaults.ini b/app/protos/defaults.ini
index 4742982..4de9ea3 100644
--- a/app/protos/defaults.ini
+++ b/app/protos/defaults.ini
@@ -2,8 +2,8 @@ BASE_DOMAIN                = xxxxx
 INSTANCE_COUNTRY           = ru
 INSTANCE_LANGS             = ru en
 DEFAULT_LANGUAGE           = ru
-# Доступные валюты стран для магазинов: РФ, США, Евро, Казахстан, Украина, Китай, Молдова, Армения,
-INSTANCE_CURRENCY          = RUB USD EUR KZT UAH CNY MDL AMD UZS AZN KGS TJS TMT GEL LVL LTL
+# Доступные валюты стран для магазинов: РФ, США, Евро, Казахстан, Украина, Китай, Молдова, Армения,
+INSTANCE_CURRENCY          = RUB USD EUR KZT UAH CNY MDL AMD UZS AZN KGS TJS TMT GEL LVL LTL GBP

 MAIL_FROM         = xxxxx
 MAIL_FEEDBACK     = xxxxx
kes@backend01:~/site/app$ git branch
  feature/5492_new_currency
* master
  production
kes@backend01:~/site/app$ cat locale/ru/LC_MESSAGES/lang.po | grep -A 5 -B 5 'msgid "currency:GBP"'
# Узбекистан
msgid "currency:UZS"
msgstr "сум."

# Британский фунт
msgid "currency:GBP"
msgstr "£"

msgid "datepicker:prevText"
msgstr "Пред>"

kes@backend01:~/site/app$ git branch -d feature/5492_new_currency
warning: deleting branch 'feature/5492_new_currency' that has been merged to
         'refs/remotes/origin/feature/5492_new_currency', but not yet merged to HEAD.
Deleted branch feature/5492_new_currency (was ab38009).

您是否尝试过 git fetch 查看存储库是否已更新?您可能没有在计算机上更新它。


在网络上检查您的存储库。如果它显示您的分支已合并,那就是。如果是,强制将更新推送到 Github 桌面。

希望对您有所帮助!

git diff master...feature/5492_new_currency [shows some differences]

three-dot 语法 A...B 在 Git 中具有特殊含义。更准确地说,它有 两个 特殊含义,一个专用于 git diff。 (在其他 Git 命令中,它具有其他特殊含义。)对于 git diff(并且 对于 git diff),A...B 表示:

  • 首先,运行git merge-base --all A B。将其输出 ID 保存在一个变量中——我们称之为 $base。 (在 shell 脚本中你可以写 base=$(git merge-base --all A B) 然后 echo $base 来查看是否只有一个 ID。)
  • 然后,只要输出一个commit ID,就选择那个commit ID,然后运行:git diff $base B。否则产生一些 not-useful 输出。 (这个 "otherwise" 部分是一个错误。它实际上并没有像您在 headers 中看到的 diff --cc 那样发生在这里,所以我们知道实际上只有一个 ID。)

因为 A 这里是 masterB 这里是 feature/5492_new_currency,并且有一些差异输出,告诉我:

git merge-base master feature/5492_new_currency

和:

git rev-parse feature/5492_new_currency

会生成两个不同的 ID。

这反过来意味着 master 不是 feature/5492_new_currency 的祖先。如果是,masterfeature/5492_new_currency 的合并基础将是 feature/5492_new_currency 相同的 提交 ID。

您的下一个命令及其结果实际上提供了更直接的信息:

kes@backend01:~/site/app$ git branch -d feature/5492_new_currency
warning: deleting branch 'feature/5492_new_currency' that has been merged to
  'refs/remotes/origin/feature/5492_new_currency', but not yet merged to HEAD.
Deleted branch feature/5492_new_currency (was ab38009).

这两个加在一起意味着你的主张:

I have branch and all changes at that branch are at master (HEAD)

错了!特别是,第二个结果证明给定的两个 ID 将由以下内容生成:

git rev-parse HEAD

和:

git rev-parse feature/5492_new_currency

前者的 ID 不是 "less than or equal to" 后者的 ID,即 HEAD 不是 feature/5492_new_currency 的祖先。假设 HEAD 实际上是对 master 的引用,这反过来意味着 master 不是 feature/5492_new_currency 的祖先,正如我们从第一个命令中看到的那样。它可能是 "greater than"(即超前),但如果是这样的话,git diff 会比较 feature/5492_new_currency 和它自己。所以 feature/5492_new_currency 肯定是 而不是 合并到 master。不过,它 推到了它的上游(它的上游是 origin/5492_new_currency)。也就是说,来自名称 feature/5492_new_currency 的 ID 是 "less than or equal to" 您仍然可以从 origin/5492_new_currency.

获得的 ID

现在您的 branch-name feature/5492_new_currency 已被删除,您将必须使用 [=31 以外的其他名称对您的本地名称 master 进行任何操作=].最直接的可能是 运行:

$ git checkout master && git merge origin/5492_new_currency

这将 fast-forward master,或者进行新的合并提交。 (即使 fast-forward 是可能的,要强制进行新的合并提交,请使用 git merge --no-ff。)

我们发现问题是什么:

有人刚刚 cherry-pick 将这些更改转换为 master 分支。

因此尽管更改相同,但分支不在 master