4

简单地说,我创建了一个像这样的 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"

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

git clone /path-to-source/
git checkout -b master remotes/origin/master
git checkout -b A remotes/origin/A

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

在此处输入图像描述

现在我返回到源文件夹并添加一些东西到 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

在此处输入图像描述

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

在此处输入图像描述

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

git checkout A
git pull

但我得到这样的分支树:

在此处输入图像描述

问题是,如何保持存储库的干净克隆?是的,我想在克隆的存储库中获得这个(操纵的图形):

在此处输入图像描述

奖励:如果可能的话,我想找到一种方法来保持在AorB分支中的提交,如下所示:

在此处输入图像描述

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

git checkout A
echo "something" > other.txt
git add other.txt
git commit -m "Other A commit"
git checkout B
git rebase A

注意 1:如果有帮助,克隆的存储库永远不会提交 注意 2:您可以假设只有 1 个用户提交到源存储库

4

1 回答 1

5

变基意味着更改 SHA1,因此克隆中的分支 A 不再有效。

您可以按照“在有人将变基或重置推送到已发布的分支后如何恢复/重新同步? ”来恢复克隆的分支 A(灵感来自“从上游变基中恢复”部分)。

但如果:

  • 这些变基是经常发生的,
  • 您在分支 A 和分支 B 的克隆上没有任何新提交

您可能只想根据它们的origin/A和重置这些分支(在克隆上) origin/B:您将分支AHEAD 重置为origin/A.

git branch -f origin/A
于 2013-01-26T20:23:50.917 回答