更改分支的名称指向的提交?

时间:2016-01-01 15:38:18

标签: git

分支的名称指向分支的提示/结束提交。

是否有一个命令直接使分支的名称更改为指向不同的现有提交(例如原始提示提交的某些祖先/后代)?

"直接",我的意思是命令将提交移动到(或类似的东西)并将分支的名称作为参数。

通过"间接",我的意思是,例如,提交,合并,变基,推送和提取/提取,移动分支的名称,但不承诺提交移动到(或类似的东西)作为论据。

3 个答案:

答案 0 :(得分:2)

$ git checkout the-branch
$ git reset <commit-hash>

如果您还希望让您的工作目录反映该提交的状态,请添加--hard标志。

如果我没有提供这两个警告,那将是我的疏忽:

  1. 你正在重写历史。如果你已经推动,请小心。
  2. 如果您使用的是--hard标记,那么您将失去自该提交以来所做的所有进度。除非您对当前分支的提示有其他参考,否则您将无法(但reflog)回到当前的状态。

答案 1 :(得分:1)

git branch -f $BRANCH $COMMIT

请注意,您尝试移动的分支不能是您当前的分支。有关详细信息,请参阅man page

答案 2 :(得分:1)

  

分支的名称指向分支的提示/结束提交。

正确(根据定义,确实如此)。

  

是否有一个命令直接将分支的名称更改为指向不同的现有提交(例如原始提示提交的某些祖先/后代)?

创建或更改引用的目标SHA-1 ID的低级命令是git update-ref。使用它有点棘手,因为它要求你拼出完整的参考名称:

$ git update-ref refs/heads/foo newvalue [ oldvalue ]

(如果引用没有预期值,则添加oldvalue部分会使其出错;有关详细信息,请参阅the documentation。它也能打破象征性的参考。

git branch command将允许您将分支移动到新的目标提交,如Corubba already noted。它更适合于临时使用(不像git update-ref那样容易出错)但对脚本编写更不适合(在那里你需要严密但完全的控制)。

git reset command允许您移动HEAD为符号引用的分支,或者在HEAD不是符号引用时更改HEAD中存储的值(即,当你处于“超级HEAD”模式时)。但它不能移动任何其他分支;它还对索引(除了--soft模式以外的任何其他方式)进行操作,git branchgit update-ref都没有。