如何在Git中保持分支层次结构?

Iva*_*van 4 git

简单地说我创建了一个这样的git分支结构:

在此输入图像描述

生成自:

git init
echo "Hello World" > file1.txt
git add file1.txt
git commit -m "Hello world"
git checkout -b A
echo "This is from A branch" > file2.txt
git add file2.txt
git commit -m "from A branch"
git checkout -b B
echo "This is from B branch" >> file2.txt
git commit -a -m "from B branch"
Run Code Online (Sandbox Code Playgroud)

现在我克隆这个结构并同步master,AB分支:

git clone /path-to-source/
git checkout -b master remotes/origin/master
git checkout -b A remotes/origin/A
Run Code Online (Sandbox Code Playgroud)

克隆的存储库反映了源层次结构:

在此输入图像描述

现在我返回源文件夹并添加一些东西到master和rebase A和B:

cd /path-to-source/
git checkout master
echo "more files" > file3.txt
git add file3.txt
git commit -m "Improved master"
git checkout A
git rebase master
git checkout B
git rebase A
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当我返回克隆的存储库并尝试保留此结构时,问题就出现了.如果我pullmaster分支,我得到这样的:

在此输入图像描述

我可以去每个分支并更新:

git checkout A
git pull
Run Code Online (Sandbox Code Playgroud)

但我得到这样的分支树:

在此输入图像描述

问题是,如何保持存储库的干净克隆?它是,我想在克隆的存储库中获取此(操作图形):

在此输入图像描述

额外奖励:如果可能的话,我想找到一种方法来保持在这些AB分支中的提交:

在此输入图像描述

从源存储库中的这些命令生成:

git checkout A
echo "something" > other.txt
git add other.txt
git commit -m "Other A commit"
git checkout B
git rebase A
Run Code Online (Sandbox Code Playgroud)

注1:如果有帮助,克隆存储库NEVER提交 注2:您可以假设只有1个用户提交源存储库

Von*_*onC 5

重新绑定意味着更改SHA1,因此克隆中的分支A不再有效.

您可以按照" 如果有人将rebase推送或重置到已发布的分支后如何恢复/重新同步? "来恢复克隆的分支A(灵感来自" 从上游重新恢复 "部分).

但如果:

  • 那些变种经常发生,
  • 您没有对分支A和分支B的克隆进行任何新提交

你可能想简单地重置根据自己的分支机构(对克隆)origin/Aorigin/B:你支重Aorigin/A.

git branch -f origin/A
Run Code Online (Sandbox Code Playgroud)