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

时间:2019-08-02 07:36:25

标签: git git-branch git-bash

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

2 个答案:

答案 0 :(得分:4)

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

要将master上的提交推送到其他Git存储库(您称为origin的那个存储库),但要让其他存储库以(其)名称以外的名称知道它们master,您可以执行以下操作:

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

这会将它们(即origin上的Git over)发送给您,它们所具有的,它们没有(但确实需要)的任何提交。然后向他们发送一个礼貌的请求:请设置您的分支机构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

除非您担心您所做的事情实际上会破坏您的存储库,否则所有这一切都有点愚蠢和/或过度杀伤力。原因是提交后的提交是永久性的-好吧,主要是是永久性的,并且是只读的(完全只读:什么在任何提交中都不能 进行更改!)。提交本身实际上是通过哈希ID找到的。像master这样的分支名称只是的起点。您的Git会将您的名字master转换成一个丑陋的哈希ID,然后使用它来查找 last 提交。最后的提交具有先前或 parent 提交的丑陋的哈希ID,因此从最后一次提交开始,您的Git可以向后退一步。父提交将存储另一个父哈希ID,因此Git可以从父提交向后移动另一步。该提交还有另一个父ID:

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

给出任何提交哈希ID,就像提交H一样,Git可以读取提交并获取其父ID。然后,它可以读取G并获得另一个父ID,它可以用来读取F,依此类推。 这是一个分支:这只是一系列提交,由哈希ID向后串在一起,分支 name 指向该序列中的最后一个 。如果H是最后一次提交,则序列如下:

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

名称 master让您的Git查找提交H。这样一来,您的Git可以先找到G,然后找到F,依此类推。

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

master

当您创建新的名称时,例如...--F--G--H--I <-- master ,Git只会创建该名称,指向一些现有的提交。默认情况下,新名称的提交是 current 提交:

some-new-branch-name

这也解释了Git ...--F--G--H--I <-- master, some-new-branch-name 的含义。如果您有多个分支名称,那么当您进行新的提交时,Git如何知道要 update 使用哪个名称?答案是:Git将特殊名称HEAD附加到分支名称之一。这是您进行新提交时要更新的名称。所以我们真的应该这样画:

HEAD

或:

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

取决于您使用...--F--G--H--I <-- master, some-new-branch-name (HEAD) 选择的分支名称。当前的 commit git checkout(的真实哈希ID);当前的分支名称是附加了名称I的那个。

如果您担心文件,只需使用HEAD命名一个新的分支名称,然后在需要时进行提交(如果要先将更改添加到另一个分支,则首先提交,如果更多)适当)。现在,您以前的分支名称会记住上次提交的哈希ID,而您的新分支名称会记住您进行的任何 new 提交的哈希ID:

git checkout -b

(一旦您有两次仅在新分支上的提交)。

(请注意,通过...--F--G--H--I <-- master \ J--K <-- some-new-branch-name (HEAD) 进行的提交在两个分支上。)

答案 1 :(得分: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

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

如果要在分支备份中将新文件作为基础,则可以使用

git rebase master

这将更新您在备份分支中的基本提交。您可以在https://git-scm.com/book/de/v2/Git-Branching-Rebasing

上了解更多有关变基的信息