如何将文件从主分支推送到另一个分支?

Posted

技术标签:

【中文标题】如何将文件从主分支推送到另一个分支?【英文标题】:How to push files from master branch to another branch? 【发布时间】:2019-12-10 19:25:50 【问题描述】:

我对使用 git 很陌生,所以我需要将文件从 master 分支推送到另一个分支,以便在出现问题时进行备份,然后继续在 master 分支上工作。我如何在 git bash 中做到这一点?

【问题讨论】:

从 master 中,您可以使用 git checkout -b new-branch 签出到新分支,以便 master 中的代码将存在于新分支中。现在再次向您的主人结帐并继续编辑 How do I copy a version of a single file from one git branch to another?的可能重复 @siva 所以,像这样。 git checkout -b new-branch 然后推送到那个新分支,然后 checkout -b old-branch? @Marko 在第二个命令中没有-b,因为它是创建分支的选项(并且它已经存在)。但是恕我直言,创建标签而不是分支更有意义。 @Philippe 我收到错误'致命:当前分支备份没有上游分支。 '我 【参考方案1】:

Git 不推送文件;Git 推送提交。提交包含文件,因此效果相似,但重要的是要记住这一点:存储库一个提交(然后有每个文件的快照),或者它没有提交(然后它没有那些快照)。

要将您在 master 上的提交推送到其他 Git 存储库(您称为 origin 的那个),但要让其他存储库通过(其)master 以外的名称知道它们,你可以这样做:

git push origin master:some-new-branch-name

这会向他们发送-origin 上的 Git-您拥有的任何提交,而他们不需要(但确实需要)。然后它会向他们发送一个礼貌的请求:请将您的分支设置为 some-new-branch-name,以便它记住我调用 master 的提交。

(您的 Git 向他们发送此提交的原始哈希 ID,而不是名称 master。如果您愿意,您可以查看原始哈希 ID:

git rev-parse master

尽管在您查看了一些原始哈希 ID 之后,您很快就会明白为什么人类不经常使用它们。除非你剪切和粘贴它们,否则它们太难做对了。)

完成上述操作后,如果运行:

git fetch origin

您将看到您现在有了一个新的远程跟踪名称origin/some-new-branch-name。这是你的 Git 副本,它们的起源是 Git 的分支名称 some-new-branch-name。如果你运行:

git log --all --decorate --oneline --graph

您会看到,您不仅拥有了这个新名称,而且它会将完全相同的提交标识为您自己的master

所有这些都有点愚蠢和/或矫枉过正,除非您担心您所做的某些事情实际上会破坏您的存储库。原因是一旦提交,提交是永久的——嗯,大部分是永久的——并且是只读的(完全只读:nothing 在任何提交中都可以ever 被改变!)。提交本身实际上是通过哈希 ID 找到的。像 master 这样的分支名称只是作为起点: 你的 Git 将你的名字 master 翻译成一个丑陋的大哈希 ID,并使用它来查找 last犯罪。最后一次提交具有其前一次或 提交的大而丑陋的哈希 ID,因此从最后一次提交开始,您的 Git 可以向后工作一步。父提交存储另一个父哈希 ID,以便从父提交,您的 Git 可以向后移动另一个步骤。该提交还有另一个父 ID:

... <-F <-G <-H ...

给定任何提交哈希 ID,例如提交 H,Git 可以读取提交并获取其父 ID。然后它可以读取G 并获得另一个父ID,它可以使用它来读取F,等等。 这就是分支: 它只是一系列提交,通过哈希 ID 向后串在一起,分支 name 指向该系列中的最后一个 。如果H 是最后一次提交,则系列如下所示:

...--F--G--H   <-- master

name master 让你的 Git 找到提交 H。这会让你的 Git 找到 G,然后是 F,依此类推。

当您向master 添加新提交时,Git 真正做的是写出一个新提交(带有一些新的随机哈希 ID),其 是提交 H。然后 Git 将新提交的哈希 ID(我们称之为 I)写入名称 master,现在您有了:

...--F--G--H--I   <-- master

当你创建一个新的名称,比如some-new-branch-name,Git 只是创建这个名称,指向一些现有的提交。默认情况下,新名称的提交是 current 提交:

...--F--G--H--I   <-- master, some-new-branch-name

这也解释了 Git 的 HEAD 是关于什么的。如果您有多个分支名称,Git 如何知道在您进行新提交时要更新 哪个名称?答案是:Git 将特殊名称 HEAD 附加到其中一个分支名称上。这是您进行新提交时要更新的名称。所以我们真的应该把它画成:

...--F--G--H--I   <-- master (HEAD), some-new-branch-name

或:

...--F--G--H--I   <-- master, some-new-branch-name (HEAD)

取决于您使用git checkout 选择的分支名称。当前commitI的(真正的hash ID);当前的分支名称HEAD所附加的名称。

如果您担心文件,只需使用 git checkout -b 创建一个新的分支名称,如果需要,提交(或者如果您希望先将更改添加到另一个分支,则先提交,如果这样更合适的话) .您之前的分支名称现在会记住 its 上次提交的哈希 ID,而您的新分支名称会记住您所做的任何 new 提交的哈希 ID:

...--F--G--H--I   <-- master
               \
                J--K   <-- some-new-branch-name (HEAD)

(一旦你有两个只在新分支上的提交)。

(请注意,通过I 的提交都在两个 分支上。)

【讨论】:

这是一个很好的答案 - 你知道如何为 master (for git push --all) 永久设置默认远程分支,因为 "push -u" 没有: git push -u " origin" "master:RELEASE12345" # 不会永久设置如果在 .git/config 中有需要手动编辑的内容,我对此很满意。 那……有点乱。 一种方法可以告诉 Git 推送到 branch@upstream 设置 - 请注意,git push -u ... 本质上是告诉 Git 如果推送成功则运行 git branch --set-upstream-to - 使用 @ 的 push.default 设置987654369@,但此默认设置仅适用于某些情况。见(很长)git config documentation;搜索push.default【参考方案2】:

首先,您需要为这些备份创建一个新分支(但我认为不需要这样做,因为您也可以返回在 master 分支中所做的任何提交,但没关系)。

在本地创建新分支

要创建一个新分支,只需使用:

git branch <NAME OF NEW BRANCH>

或者在这种情况下,我们可以使用

git branch backup

之后,我们需要切换到那个分支

git checkout <NAME OF NEW BRANCH>

或者在这种情况下,我们将使用

git checkout backup

之后,我们需要提交更改

添加所有新文件(点替换当前未添加到提交的所有文件)

git add . 

然后做一个提交

git commit -m "adding a backup branch"

然后我们去master分支

git checkout master

然后将这些更改推送到 git repo

git push origin <feature_branch>

在这种情况下

git push origin backup

将新文件从主分支推送到备份分支

如果你想在分支备份中有新文件作为基础,你可以使用

git rebase master

这将更新您在备份分支中的基本提交。你可以在这里阅读更多关于 rebase 的内容https://git-scm.com/book/de/v2/Git-Branching-Rebasing

【讨论】:

git checkout -b 'branch_name' 将同时创建不存在的分支。

以上是关于如何将文件从主分支推送到另一个分支?的主要内容,如果未能解决你的问题,请参考以下文章

Git:如何将丢失的分支从一个仓库推送到另一个仓库

如何只推送到 Hg 中的一个分支?

从一个分支拉取所有提交,将指定的提交推送到另一个

从一个分支拉取所有提交,将指定的提交推送到另一个

将本地提交的更改推送到新分支

markdown 从本地分支推送到另一个远程分支(如果不退出则在远程创建新分支)