我们有以下GIT"工作习惯"。我将很快描述它以澄清我后来问题的背景。
我们与三个永久分支机构合作( DEV , STAGE , MASTER )。 通常, STAGE 应与 MASTER 同步。但 DEV 总是被视为"脏"这意味着它可以包含许多从未合并到 STAGE 或 MASTER 的提交。我们只将功能分支或单个提交从 DEV 合并到 STAGE 。然后我们将 STAGE 合并到 MASTER 。
现在,在某些时候,我们开始了一个巨大的变革集#34; (主要项目升级)并创建了一个专门的功能分支,比如说 UPGRADE 。 关于此功能的工作持续了3个月。
现在我想将这个巨大的功能分支合并到 STAGE ,但我不能100%确定我是否从 STAGE / MASTER <创建分支 UPGRADE / strong>或来自 DEV 。 我们没有记录这一点。
由于 DEV 是&#34;脏&#34;如果 UPGRADE 从 DEV 分支,我无法合并!
所以这是我的问题:现在我想确定我们从 STAGE / MASTER 分支升级而不是 DEV (我应该选择STAGE / MASTER但我现在不确定。如何从repositry中获取最可靠的信息?
我已经做了一些研究,并尝试使用&#34; git merge-base &#34;。 这是我试过的三个命令。
1)git show --summary 'git merge-base upgrade dev'
2)git show --summary 'git merge-base upgrade stage'
3)git show --summary 'git merge-base upgrade master'
但它们都提供了相同的树木,只有几天的时间。
所以我再次提出问题:现在我想确保我们从 STAGE / MASTER 分支 UPGRADE ,而不是从 DEV 分支。如何从repositry中获取最可靠的信息?
答案 0 :(得分:1)
更简单的方法是使用以下任何命令:
git log --oneline --decorate --graph --all
gitk --all
您可以显然查看分支结构。例如下图中有master
和new
分支,我们可以从new
分支创建master
分支。您可以使用相同的方法查找 UPDATE
的创建位置。
* 0d04f17 (HEAD -> master, origin/master, origin/HEAD) 5
* 74d5ed3 5
* 6146194 4
* e5ddeac 3
* a33f9ee 2
* 8373f5d hi1
* 3df7047 hi
* 3f27319 6
| * f0cca03 (new) 1
|/
* 38236ae Update config
UPDATE
分支到过去的提交假设UPDATE
分支是从DEV
分支创建的,过去的提交是提交D
,提交历史记录如下:
A---B---C---D---E master
\
F---G---H---I DEV
\
J---K---L UPDATE
1.Rebase UPDATE
直接(不保留原始UPDATE
分支):
git rebase --onto <commit id for D> DEV UPDATE
然后提交历史记录将如下:
J'---K'---L' UPDATE
/
A---B---C---D---E master
\
F---G---H---I DEV
2.Rebase将UPDATE
更改为新分支并保留原始UPDATE
分支:
git checkout -b new <commit id for D>
git rebase --onto new DEV <commit id for L>
git branch -f new
git checkout new
然后提交历史记录将如下:
J'---K'---L' new
/
A---B---C---D---E master
\
F---G---H---I DEV
\
J---K---L UPDATE