要移动已检出分支的分支指针,可以使用以下git reset --hard
命令。但是,如何移动未检出分支的分支指针以指向不同的提交(保留所有其他内容,如跟踪的远程分支)?
要移动已检出分支的分支指针,可以使用以下git reset --hard
命令。但是,如何移动未检出分支的分支指针以指向不同的提交(保留所有其他内容,如跟踪的远程分支)?
Answers:
您可以为任意引用执行此操作。这是移动分支指针的方法:
git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>
一般形式:
git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>
如果愿意,您可以选择关于reflog消息的内容-我相信branch -f
一个与另一个不相同reset --hard
,但这不完全是其中之一。
git branch -f
。具体来说,这种方法似乎是:(A)难以使用(B)难以记住,并且(C)更加危险
git branch -f <branch-name> <new-tip-commit>
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
。(如果愿意,您可以选择关于reflog消息的内容-我相信branch -f
一个与另一个不相同reset --hard
,而且这两个都不完全相同。)
git help branch
说:“ -f,--force如果<branchname>已经存在,将<branchname>重置为<startpoint>。不使用-f git branch拒绝更改现有分支。”
git branch -f master <hash>
,这是在告诉我,fatal: Cannot force update the current branch.
我现在必须做些什么,在允许使用此命令之前检查其他随机分支?
HEAD
指向该分支),则此方法将无效。
您还可以传递git reset --hard
提交参考。
例如:
git checkout branch-name
git reset --hard new-tip-commit
我发现我经常做这样的事情:
假设这个历史
$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master
# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff
# Ditch that commit on this branch
$ git reset --hard HEAD^
# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
git update-ref
按照上面的讨论进行。
git reset --hard ...
无需在此处重复!:-(
只是为了丰富讨论,如果您想将myBranch
分支移至当前提交,只需在第二个参数之后省略-f
例:
git branch -f myBranch
当我rebase
处于HEAD分离状态时,通常会这样做:)
在gitk --all
:
请注意,重新创建而不是修改现有分支将丢失跟踪分支信息。(对于简单的用例,通常情况下这不是问题,因为只有一个遥控器,并且您的本地分支与该遥控器中的相应分支具有相同的名称。有关更多详细信息,请参见注释,感谢@mbdevpl指出了这一缺点。)
如果gitk
对话框具有3个选项,那就很酷了:覆盖,修改现有的或取消。
即使你是一个正常的命令行迷像我一样,git gui
和gitk
被很好地设计为使用的git的子集,它们允许。我强烈建议您将它们用于自己的特长(例如,将大块选择性地转移到git gui中的索引中/从索引中转移出来,并且也只是提交。(ctrl -s来添加签名:: )
gitk
当您将更改整理到一个不错的修补程序系列中以提交到上游时,或者在需要跟踪多个分支中间的任何其他内容时,它非常适合跟踪几个分支。
我什至没有打开图形文件浏览器,但是我喜欢gitk / git gui。
git status
输出也会受到影响。此外,在某些情况下git fetch
,git push
如果您未设置跟踪分支,则必须在没有显式指定远程的情况下使用。我并不了解所有情况,但对我而言,一般的经验法则是,为了方便和快捷地工作,最好按顺序跟踪分支。
该建议的解决方法git branch -f branch-pointer-to-move new-pointer
在TortoiseGit:
老实说,我很惊讶没有人想到该git push
命令:
git push -f . <destination>:<branch>
点(。)表示本地存储库,您可能需要-f选项,因为目标可能位于“远程副本的后面”。
尽管此命令用于将更改保存到服务器中,但其结果与将远程分支(<branch>
)移动到与本地分支(<destination>
)相同的提交时完全相同
-f
避免破坏本地内容。举例来说,git fetch origin && git push . origin/develop:develop
是一个没有结帐需要快速失败的版本git checkout develop && git pull --ff-only
打开文件.git/refs/heads/<your_branch_name>
,然后将存储在其中的哈希值更改为要移动分支头的哈希值。只需使用任何文本编辑器编辑并保存文件即可。只要确保要修改的分支不是当前活动的分支即可。
免责声明:可能不是建议的方法,但是可以完成工作。
git branch <branch-name> <SHA-1-of-the-commit>
并通过转储旧分支来简单地创建一个新分支呢?