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

时间:2013-01-26 20:19:06

标签: git

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

enter image description here

生成自:

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"

现在我克隆此结构并同步masterAB分支:

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

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

enter image description here

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

enter image description here

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

enter image description here

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

git checkout A
git pull

但我得到这样的分支树:

enter image description here

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

enter image description here

奖金:如果可能的话,我想找到一种方法来保持AB分支机构的提交,如下所示:

enter image description here

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

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个用户提交源存储库

1 个答案:

答案 0 :(得分:5)

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

您可以按照“How do I recover/resynchronise after someone pushes a rebase or a reset to a published branch?”恢复克隆的分支A(灵感来自“RECOVERING FROM UPSTREAM REBASE”部分。)

但是如果:

  • 经常发生这些折扣,
  • 您对分支A和分支B的克隆没有任何新提交

您可能只想根据origin/Aorigin/B重置这些分支(在克隆上):您将分支A HEAD重置为origin/A

git branch -f origin/A