如何在不切换分支的情况下复制Git中的远程分支?

4
在Git中,是否有可能在不改变本地文件的情况下复制远程分支?如果不行,实现这一点需要最小化哪些更改?
所谓不改变本地文件是指在整个过程中根本不更改它们。将它们隐藏并稍后恢复会被视为更改。显然,checkout操作会改变本地文件,它们将改变以反映你正在检出的分支状态。
例如,在此之前的分支如下:
- origin/master(位于commit1) - master(位于commit2,还有一些散乱的文件)
之后的分支如下:
- origin/master(位于commit1) - origin/master-copy(位于commit1) - master(整个过程中没有任何更改,仍位于commit2,与上述相同的散乱文件)

4
Git分支只是指向提交记录的指针。创建分支和推送操作不需要进行“checkout”操作。 - axiac
我试着回答,但我不确定你是否打错了什么(origin/masterorigin/master-copy在同一次提交中?) - Arount
一样的。这就是我为什么这样称呼它的原因。 - wst
4个回答

10

git branch 命令可以让您创建一个新的分支,而无需检出或更改本地文件。然后,您需要推送新的远程分支。

具体步骤如下:

  1. git branch master-copy origin/master -- 创建一个将转换为新远程分支的本地分支副本
  2. git push origin master-copy -- 将本地分支推送到远程
  3. git branch -D master-copy -- 删除本地分支副本

所有这些都不需要检出文件。


谢谢你提供如此详细的解释。我一直想知道":refs/heads/"这部分是什么意思。现在,我的知识中终于填补了一个空白。 - Quantium

5
你需要做的只是创建一个指向提交1的远程分支。 简短回答
git push origin [commit1 hash]:refs/heads/master-copy

长篇回答

假设这是你的代码仓库:

commit 2 (65bc341)   O  <-- master
                     |
     (more commits) ...
                     |
commit 1 (125afe4)   O  <-- origin/master

为了达到你想要的目的,你需要使用git push命令,不需要创建本地分支。你需要向push命令传递三个参数:
git push [REMOTE NAME] [WHERE SHOULD THE REMOTE BRANCH POINT TO]:[REMOTE BRANCH NAME]

假设您遵循标准名称,REMOTE NAME 可能是“origin”。
REMOTE BRANCH NAME 是 master-copy。
最后,REMOTE BRANCH 指向的位置是 commit1 的哈希值(在我上面使用的示例中为 125afe4)。
因此,命令应该是:
git push origin 125afe4:master-copy

使用此命令,您告诉git在名为“origin”的远程仓库上创建一个名为“master-copy”的新分支,该分支指向提交125afe4。 如果您运行此命令(并且没有创建任何名为master-copy的本地分支),则会出现此错误。
error: unable to push to unqualified destination: master-copy
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@WHATEREVER_YOUR_REPO_URL_IS'

为什么会得到这个响应?因为git不知道您是要在远程存储库中创建分支还是标签。为了解决这种模棱两可的情况,您需要运行:
    git push origin 125afe4:refs/heads/master-copy

完成了!

commit 2 (65bc341)   O  <-- master
                     |
     (more commits) ...
                     |
commit 1 (125afe4)   O  <-- origin/master origin/master-copy

如果您按照被接受的答案中的步骤操作,所创建并删除的本地分支“master-copy”就是解决歧义的那个分支。希望我能为您提供有关如何运用git-push的见解,并向您展示您实际上不需要这个本地分支的内容。您只需使用一个命令即可获得所需,而无需使用三个命令! 请记住,如果您想随后删除远程分支,可以运行以下命令:
git push --delete origin master-copy

或者您可以使用旧的语法。
git push origin :master-copy

0

1. 在提交 1 处获取 origin/master 的本地副本

 git checkout -b master-copy master

2. 将这个新分支推送到远程仓库

 git push origin master-copy

更新 origin/master 到提交 1

 git push origin master-copy:master -f

4. 删除本地的 master-copy

 git branch -D master-copy

Checkout 意味着更改本地目录。 - wst

-1

打开终端

  1. git clone "你的仓库链接"
  2. cd "主项目路径"
  3. git branch master-copy
  4. git checkout master-copy
  5. git push origin master-copy

之后,你将在一个名为“master-copy”的新分支中拥有你的主项目副本。如果你想在未来将其与主分支合并,我建议你使用feature/master-copy而不是master-copy。


Checkout 意味着更改本地目录。 - wst
@waste 是的,但更改将在feature/master-copy中进行,而不是master-copy中。如果您执行步骤五,则新功能将出现在远程分支中。 - JoseJimRin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接