Mot*_*Mot 704 git git-branch
要移动已签出分支的分支指针,可以使用该git reset --hard
命令.但是如何移动未检出分支的分支指针指向不同的提交(保留所有其他东西,如跟踪的远程分支)?
Chr*_*sen 902
git branch -f <branch-name> <new-tip-commit>
Run Code Online (Sandbox Code Playgroud)
Ada*_*m A 532
注意如果您只是想将分支移动到另一个提交,最简单的方法是
git branch -f branch-name new-tip-commit
你可以为任意引用做到这一点.这是如何移动分支指针:
git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>
Run Code Online (Sandbox Code Playgroud)
一般形式:
git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>
Run Code Online (Sandbox Code Playgroud)
如果你愿意的话,你可以选择关于reflog消息的尼特 - 我相信它与那个branch -f
不同reset --hard
,而且这不是它们中的任何一个.
Ami*_*tin 131
您还可以传递git reset --hard
提交引用.
例如:
git checkout branch-name
git reset --hard new-tip-commit
Run Code Online (Sandbox Code Playgroud)
我发现我半经常做这样的事情:
假设这段历史
$ 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
Run Code Online (Sandbox Code Playgroud)
Mat*_*ipe 42
只是为了丰富讨论,如果你想将myBranch
分支移动到你当前的提交,只需省略第二个参数-f
例:
git branch -f myBranch
当我rebase
处于独立HEAD状态时,我通常会这样做:)
alo*_*ono 23
Git 2.23.0 引入了git-switch
也可用于执行此操作的命令。
git switch -C <branch-name> [<start-point>]
Run Code Online (Sandbox Code Playgroud)
(大写C)选项-C
表示如果<branch-name>
已经存在,则将其重置为<start-point>
。
使用-c
(小写 C),它将尝试创建一个新分支,但如果分支已经存在,则会失败。
<start-point>
可以是哈希、标签或其他分支名称。
小智 14
如果要将未签出的分支移动到另一个提交,最简单的方法是使用 -f 选项运行 gitbranch 命令,该选项确定分支 HEAD 应指向的位置:
git branch -f <branch-name> (<sha1-commit-hash> or <branch-name>)
Run Code Online (Sandbox Code Playgroud)
例如,如果您希望本地开发分支跟踪远程(原始)开发分支:
git branch -f develop origin/develop
Run Code Online (Sandbox Code Playgroud)
请小心,因为如果您尝试移动的分支是您当前的分支,则此操作将不起作用。要移动分支指针,请运行以下命令:
git update-ref -m "reset: Reset <branch-name> to <sha1-commit-hash>" \
refs/heads/<branch-name> <sha1-commit-hash>`
Run Code Online (Sandbox Code Playgroud)
git update-ref 命令安全地更新存储在 ref 中的对象名称。
希望我的回答对你有帮助。信息来源是这个片段。
Pet*_*des 13
在gitk --all
:
请注意,重新创建而不是修改现有分支将丢失跟踪分支信息.(对于简单的用例而言,这通常不是问题,因为只有一个远程和你的本地分支与远程中相应的分支具有相同的名称.请参阅注释以获取更多详细信息,感谢@mbdevpl指出这一缺点.)
如果gitk
有一个功能,对话框有3个选项,那将会很酷:覆盖,修改现有或取消.
即使你通常是像我一样的命令行瘾君子,git gui
并且gitk
它们设计得非常适合他们允许的git用法子集.我强烈建议将它们用于他们擅长的东西(即选择性地在git gui中进入/退出索引,并且还提交.(ctrl-s添加一个签名:line,ctrl-enter to commit .)
gitk
非常适合跟踪一些分支,同时将您的更改整理成一个很好的补丁系列以提交上游,或者您需要跟踪多个分支中间的内容.
我甚至没有打开图形文件浏览器,但我喜欢gitk/git gui.
老实说,我很惊讶没有人想到这个git push
命令:
git push -f . <destination>:<branch>
Run Code Online (Sandbox Code Playgroud)
点 ( . ) 指的是本地存储库,您可能需要 -f 选项,因为目标可能“在其远程副本之后”。
尽管此命令用于将更改保存在服务器中,但结果与将远程分支 ( <branch>
)移动到与本地分支 ( <destination>
)相同的提交完全相同
该建议的解决方法git branch -f branch-pointer-to-move new-pointer
在TortoiseGit:
打开文件.git/refs/heads/<your_branch_name>
,并将存储在其中的哈希值更改为您想要将分支头移动到的位置。只需使用任何文本编辑器编辑并保存文件即可。只需确保要修改的分支不是当前活动的分支即可。
免责声明:可能不是一个可取的方法,但可以完成工作。