git最终完全分歧了

时间:2017-03-28 09:47:16

标签: git

在尝试合并我的分支后,我意识到他们最终陷入了无关的历史。

所以我想知道git中有什么可能!我没有使用--orphan来创建分支,它只用作本地存储库(没有使用遥控器) ),虽然我使用了一些Hooks将数据库转储到git status的工作目录中,这使得钩子多次运行git add db.sql; git commit --amend --no-edit

编辑: 每个分支(e51b4a2和6cf7d37)的第一次提交之间的差异结果位于db.sql!中。

提交日志:

* commit 75c0c57 (HEAD -> database)
| Date:   3 days ago
|
|     somechanges
|
* commit b4e667d
| Date:   3 days ago
|
|     initial database
|
* commit 6cf7d37
  Date:   3 days ago

      initial

* commit 6507785 (master)
| Date:   3 days ago
|
|     update module
|
* commit e51b4a2
  Date:   3 days ago

      initial

git reflog:

75c0c57 HEAD@{0}: checkout: moving from master to database
6507785 HEAD@{1}: checkout: moving from database to master
75c0c57 HEAD@{2}: commit: some changes
b4e667d HEAD@{3}: commit (amend): initial database
202717a HEAD@{4}: commit (amend): initial database
5db604f HEAD@{5}: commit (amend): initial database
6d2dcbd HEAD@{6}: checkout: moving from master to database
6507785 HEAD@{7}: commit: update module
e51b4a2 HEAD@{8}: checkout: moving from database to master
6d2dcbd HEAD@{9}: checkout: moving from database to database
6d2dcbd HEAD@{10}: checkout: moving from database to database
6d2dcbd HEAD@{11}: checkout: moving from 6d2dcbd47ce6f57a5a5a767f97b301db78ba11c2 to database
6d2dcbd HEAD@{12}: checkout: moving from database to head
6d2dcbd HEAD@{13}: commit (amend): initial database
7ea51da HEAD@{14}: commit (amend): initial database
0bce495 HEAD@{15}: commit (amend): initial database
8401193 HEAD@{16}: commit: initial database
6cf7d37 HEAD@{17}: commit (amend): initial
e51b4a2 HEAD@{18}: checkout: moving from master to database
e51b4a2 HEAD@{19}: commit (amend): initial
3f30042 HEAD@{20}: commit (amend): initial
8c6ef22 HEAD@{21}: checkout: moving from database to master
c2f1f28 HEAD@{22}: commit (amend): initial database
c9a3aa6 HEAD@{23}: commit (amend): initial database
13997d1 HEAD@{24}: commit: initial database
8c6ef22 HEAD@{25}: checkout: moving from master to database
8c6ef22 HEAD@{26}: commit (amend): initial
181978f HEAD@{27}: commit (initial): initial

2 个答案:

答案 0 :(得分:2)

这是您的确切问题:

3f30042 HEAD@{20}: commit (amend): initial
8c6ef22 HEAD@{21}: checkout: moving from database to master

此时,您已在master上创建了初始提交的副本,该副本不再与database上的初始提交相关。

由于您的reflog,我们甚至可以在此之前和之后显示确切的状态。

最多HEAD@{22}(在切换回主人之前):

A  181978f "initial" <HEAD@{27}
A' 8c6ef22 "initial" <HEAD@{26} <master
 \
  B  13997d1 "initial database" <HEAD@{24}
  B' c9a3aa6 "initial database" <HEAD@{23}
  B" c2f1f28 "initial database" <HEAD@{22} <database

请注意所有孤立的重复项会导致您的修正 - 它们不是问题,但确实存在。

切换回主人并进行最终修改后,你得到:

A  181978f "initial" <HEAD@{27}
A' 8c6ef22 "initial" <HEAD@{26}
 \
  B  13997d1 "initial database" <HEAD@{24}
  B' c9a3aa6 "initial database" <HEAD@{23}
  B" c2f1f28 "initial database" <HEAD@{22} <database
A" 3f30042 "initial" <HEAD@{20} <master

请注意A"A'无关,因为它与A无关。对于除第一次提交之外的任何提交,他们都是共享共同祖先的兄弟姐妹。比较BB'B",它们都是同一父母(A')的兄弟姐妹。

  

所以我想知道git中有什么可能!

因为你明确告诉git这样做。在A'master之间共享了提交database。修改分支机构之间共享的提交与修改本地和远程存储库之间共享的提交一样有问题 - 重点是您正在更改已经共享的内容。

如果您对这些内容不确定,请不要在没有特定原因的情况下使用--amend。这不是一个好的默认值,这就是为什么它不是默认值。

您最简单的解决方法可能是:

git rebase --onto 3f30042 8c6ef22 database

(假设您希望 A"成为database的父级。)

答案 1 :(得分:0)

如果您已将分支推送到远程或已将其合并到其他分支,则git commit --amend总是会导致问题。

您看到amend实际上重写了历史记录。 amend命令实际上并没有更改相同的提交,而是使用不同的哈希ID创建新的提交。技术上保持相同的提交ID是不可行的。提交ID是通过散列提交消息和根树来创建的,对于修改,它总是不同的。

  

根据经验,不要修改或重写您已与他人分享的历史记录。