2016-09-29 54 views
0

假设我有2个分支。我希望一个分支从一个特定的提交开始跟踪另一个分支,以便在跟踪的分支中有新的提交时,旧的提交不会合并到跟踪分支中。跟踪从特定提交开始的git分支

是否有可能在git中做到这一点?我的问题是,我不想在新的分支中有一些旧的提交,但我需要从另一个分支自动提交新的提交,不包括一些旧的提交。

回答

0

分支名称只是存储提交ID的记录。

你在这里要求的是将一个特定的提交ID存储在一个名称下,然后再比较其他分支名称的提交ID与保存的提交ID。这正是分支和标签做的:它们是提交ID的名称。

分支名称和标签名之间唯一的区别是分支名旨在将,而事实上自动移动当一个人“的”分支,使提交:

 o--o  <-- branch1 
    /
...--o--o--o  <-- HEAD -> branch2 
     ^
      | 
      \-------- tag: tagX 

这里HEAD指向branch2,意思是你在分支branch2:你最近做了git checkout branch2

现在,如果你犯了一个新的提交(让我们记住这一个与*代替o),图形变为:

 o--o  <-- branch1 
    /
...--o--o--o--* <-- HEAD -> branch2 
     ^
      | 
      \-------- tag: tagX 

注意如何标记没有移动。

如果我们使用分支名称而不是标签名称,它仍然不会移动,但。让我们倒退到前新的提交,并得出这样的:

 o--o  <-- branch1 
    /
...--o--o--o  <-- branchX, HEAD -> branch2 

现在我们做出新的承诺。因为我们在分支branch2而不是branchX,只有branch2更改。所以我就画这个有点不同只是为了适应分支箭头:

 o--o  <-- branch1 
    /
...--o--o--o  <-- branchX 
      \ 
      * <-- HEAD -> branch2 

注意,这是完全一样的与标签 - 我只是拉标签的不同箭头了一下,暗示标签的箭头更接近提交本身(因为标签不应该改变,而分支应该改变)。

因此,所有你需要做的就是创建一个名称(分支名称或标记名称),指向具体的承诺要记住:

git branch branchX <commit-ID> 

或:

git tag tagX <commit-ID> 

你应该使用哪个标签或分支?这取决于你是否想要移动它,以及你是否希望别人分享它。标签永远不会移动,并且非常全球化:其他克隆存储库的人可以获得标签,您的标签。分行应该移动,不那么全球:谁仓库克隆为其他人得到你的分支,但作为origin/*的名字,而不是他们分支名称。 (如果你不想要这些名称中的任何一个 - 例如,如果你想让名字不移动,但也不是全局的,例如你可以创建你自己的名字空间,分支和标签是内置的, Git知道如何处理它们,如果你发明了自己的参考名称空间,Git将不知道如何使用它,所以你将不得不做更多的工作。)