无法 git 合并,因为 git commit --amend

Cannot git merge because git commit --amend

在 master 分支中,我有 Initial Commit pushed gitlab

之后我创建了一个名为“branchA”的新分支

我将初始提交重命名为

git commit --amend -am Initial Commit v2

做一些修改并提交

在这个例子中,你可以看到类似的东西

master :
    - Initial Commit
branchA :
    - Initial Commit v2
    - Commit number 2
    - ....

我想将 branchA 合并到 master 中,我该怎么做?

您没有重命名 初始提交。相反,您进行了 新的、不同的初始提交 。您现在有两个初始提交:

$ mkdir tworoots
$ cd tworoots
$ git init
Initialized empty Git repository in ...
$ echo example of multiple roots > README
$ git add README && git commit -m 'first root'
[master (root-commit) b89218d] first root
 1 file changed, 1 insertion(+)
 create mode 100644 README
$ git branch branchA
$ git log --all --decorate --oneline --graph
* b89218d (HEAD -> master, branchA) first root

请注意分支名称 masterbranchA select 如何提交 b89218d,这是我的初始提交。

现在,如果我进行 new 初始提交:

$ echo forgot something > afile
$ git add afile
$ git commit --amend -m "second root"
[master c982f45] second root
 Date: Thu Feb 4 02:27:37 2021 -0800
 2 files changed, 2 insertions(+)
 create mode 100644 README
 create mode 100644 afile

这个新提交有一个新的哈希 ID,c982f45(你的提交不会有这个哈希 ID,因为这取决于我的名字,我的电子邮件地址,我电脑上的日期和时间,等等)。但是 first 根仍然存在,并且 branchA 仍然找到它:

$ git log --all --decorate --oneline --graph
* c982f45 (HEAD -> master) second root
* b89218d (branchA) first root

很难从这个特定的图表中看出(由于 --oneline 选项)这两个提交是完全不相关的。 运行 相同的 git log 命令,但没有 --oneline 并注意 提交之间没有连接线 ,可以看到。

如果我们现在 git checkout branchA 并进行更多提交,他们将 branchA 的根提交作为他们的(单个)根提交:

$ git checkout branchA
Switched to branch 'branchA'
$ echo data go in files and the files go in commits > datafile
$ git add datafile
$ git commit -m 'add some data'
[branchA 12fe86a] add some data
 1 file changed, 1 insertion(+)
 create mode 100644 datafile

A git log 与我们的其他常用选项,但这次没有 --all,表明 master 的提交与这些提交无关:

$ git log --decorate --oneline --graph
* 12fe86a (HEAD -> branchA) add some data
* b89218d first root

尝试合并这两个不相交的子图会产生错误(自 Git 2.9 起):

$ git checkout master
Switched to branch 'master'
$ git merge branchA
fatal: refusing to merge unrelated histories

您可以通过添加 --allow-unrelated-histories 选项强制 git merge 尝试合并,就像以前版本的 Git 一样。然而,如果没有很好地理解 git merge,这很少是一个好主意。在我构建的示例中,它有效。如果它对你有用并且做你想做的,那很好,但要确保它真的是你想要的。